es automatizado todo, y a diferencia de el que publique el otro dia no hay comparacion de opcodes. es decir cada instruccion se ejecuta en su orden como si fuese codigo real. para hacer esto cada "opcode" es el indice de su correspondiente funcion en una tabla de llamadas. por ejemplo:
macro v_pushr [reg]
{
db 01h ; opcode
db reg ; registro
}
esto es el macro que define la instruccion push registro, el opcode no es mas que el indice 1 en la tabla de llamadas interna del interprete y el valor registro es el registro que se quiere pushear (la instruccion es automodificable). ahora la implementacion de esto es la siguiente:
_PUSH_REG: ;Pushea un registro, el registro se especifica y se asigna en ejecucion.
inc ebx ; se a llegado aqui desde otra funcion del interprete, necesitamos incrementar para obtener el registro que se quiere pushear.
mov cl,byte [ebx] ; se lee el registro
mov byte [$+6],cl ; se pone el registro en el codigo
nop ; aqui se ejecuta el push X, siendo X el registro especificado
add ebx,1 ; incremento para leer la siguiente instruccion
xor edx,edx
mov dl,byte [ebx]
jmp dword [CALL_TABLE+edx*4] ; ejecuta la siguiente instruccion
y como ya dije puedes mezclar codigo sin complicaciones, por ejemplo:
mov eax,valor
v_sta ; inicia ejecucion por parte del interprete
v_pushr _eax ; pusheamos eax
v_mov_r _ecx,valor ; movemos a ecx el valor X
v_calld funcion,0 ; llamamos a una funcion
v_end ; indicamos al interprete que a finalizado su bloque de instrucciones y ahora se ejecuta codigo normal
cmp eax,Lo-que-sea
+codigo.
a la hora de escribir no es que sea un proceso complicado ya que las instrucciones interpretadas se asemejan a su correspondiente real en nombre. de este modo nada mas compilar ya esta el ejecutable ofuscado

.