6 oct. 2009

A Un Paso de Des-Emular :)

Bueno amigos, como veran ultimamente he estado ocupado con las labores de la Universidad y pues esta semana la tengo libre, de manera que me he adentrado en las tareas que tengo pendientes sobre Ingenieria Inversa :P, una de ellas es la culminacion de un loader debugger que me permita desempacar un programa empacado con el bendito Asprotect SKE y que posee Maquina Virtual en lo que actualmente estoy trabajando.

Pues bien uno de los aspectos que me llamo un poco la atencion, sin entrar en la descripcion de la proteccion (que espero sea pronto con un tute al culminarlo :D) es la forma en que asprotect decide el rumbo que debe tomar cuando esta emulando un salto del tipo jxx. Es decir si el salto emulado se ejecuta o no.



Cabe destacar que con anterioridad se debe conocer el valor del registro EFLAGS antes de la emulacion, ya con esto lo que quiero mostrar es como a travez de una serie de instrucciones que se encuentran en el packer para emular los saltos, se puede deducir que tipo de flag se esta analizando y asi con esto saber que tipo de salto es el emulado ;).

Supongamos que en eax tenemos guardado el valor del EFLAGS recuperado con anterioridad, tenemos esto:

mov edx, 0 //Movemos a edx el indice a analizar
bt eax, edx
sbb eax, eax
and eax,1
Lo que hace es lo siguiente:

- Mueve en edx el indice del flag que queremos consultar el estado.
- Hacemos un test de bits entre el registro eax que posee el conetnido de los EFLAGS y el indice almacenado en edx, copiando asi el bit 0 de eax a el carry flag CF.
- Luego restamos eax con eax y si el CF esta activo producto de la instruccion anterior se restara 1
-Finalmente comprueba mediante and eax, 1 si el flag que consultamos esta activo o no (si=1, 0=no)

Con esto facilmente podremos deducir que flag se esta consultando el estado y asi mismo deducir que tipo de salto jxx es el emulado. Supongamos que edx=6, al aplicar las instrucciones anteriores lo que estaremos haciendo es mirar si el flag Z esta activo y asi con cada uno de los indices de los EFLAGS (C=0, P=2, A=4, Z=6, S=7, T=8, I=9, D=10, O=11).

Pero ahora para determinar si los flags estan es desactivados el packer en otra rutina distinta, toma el code mismo code anterior pero añade un xor eax, 1 al final y con esto preguntaremos si el flag en cuestion esta es desactivado o no, asi:

mov edx, 0 //Movemos a edx el indice a analizar
bt eax, edx
sbb eax, eax
and eax,1
xor eax, 1
Y con esto finalmente podremos hallar que salto esta emulando la MV con solo observar el indice de edx y ver si posee un xor eax,1 al final que practicamente invierte el resultado que se obtiene en el primer ejemplo.

Suponiendo que el valor de edx=6 y estamos trabajando mediante el primer codigo, el salto emulado es JZ o JE ya que este se ejecuta cuando ZF=1 y si estuviesemos bajo el codigo 2 el salto seria JNZ o JNE.

Tambien podremos usar este pequeño code para ocultar o enmascarar comparaciones para que no sean tan evidentes, en fin es cuestion de jugar con el asm :P.

Les recuerdo que con esto no quise mostrar el esquema de la emulacion (eso sera luego :P) sino mas bien dar a conocer como se lograba obtener que tipo de salto se va a emular mediante estas instrucciones conociendo el contendio del EFLAGS y el indice del Flag en cuestion, con el code anterior ubicado en una zona del packer.

Saludos y espero sirva de algo aunque sea en lo mas minimo.

0 comentarios: