Armadillo
1.73 - El archivo .TMP adicionado al esquema de
protecci�n (alpine)
Ensayo
Parte 1 (Quitando rutinas anti-debug)
En primer lugar, Armadillo proporciona 3
rutinas anti-debug que no son en absoluto
excepcionales. La primera es nuestro bien
conocido truco MeltICE (CreateFileA \ \. \SICE,
NTICE y SIWDEBUG), inmediatamente seguido por un
juego SEH y llamadas a INT 3. La ultima prueba de
detecci�n s�lo trabaja en NT (API llama a
IsDebuggerPresent).
Truco de MeltICE
Carga el prog dentro de Symbol Loader; bpx en
CreateFileA; aprieta F5 3 veces; debes estar
ahora en el primer archivo .tmp creado al azar;
Inmediatamente sigue un cmp y un salto cond. ;
cambia ese salto con. a un salto incond.;
Despu�s es llamado GetLastError; con tal de que
el valor de retorno de ese API sea 00000002 todo
estar� bien. Camina m�s adelante y ver�s que
la cosa entera es puesta en un loop (una vez para
SICE,NTICE,SIWDEBUG); para el �ltimo (SIWDEBUG)
el valor de retorno de GetLastError ser�
00000032 = ERROR_SHARING_VIOLATION, cambia ese
valor a 00000002 y todo estar� bien.
IsDebuggerPresent
Despu�s del truco de MeltICE, ver�s que
all� est� una llamada de API a GetProcAddress.
Esta LLAMADA de API devuelve la direcci�n de
IsDebuggerPresent que si est�s trabajando bajo
WinNT entonces ser� 0.
Para usuarios de WinNT:
simplemente cambia el salto cond. que sigue a la
LLAMADA de API.
Todos los otros:
No te preocupes por eso, y continua.
INT 3
Ahora puedes apretar F12 dos veces.
Conseguir�s algunos Messageboxes que te cuentan
material aburrido... finalmente aterrizar�s en
una l�nea bajo una llamada [ebp-140].
A prop�sito esta LLAMADA era la LLAMADA al
primer archivo TMP. Camina adelante y ver�s
aparecer un INT 3. Una l�nea antes de la int3
(mov eax,00000004) teclea ' a' y ensambla la
l�nea a ' jmp 0 '. Esto activar� una excepci�n
y el programa pensar� que all� no hay instalado
ning�n Debugger el cu�l manipule la excepci�n.
Ensayo Parte II (Removiendo Armadillo)
Si aprietas F5 ahora, ver�s el prog
real, pero no lo hagas que porque quiero explicar
c�mo Armadillo prepara el prog real. En primer
lugar, �l crea un archivo, un archivo .tmp0,
donde escribe dentro el c�digo real del prog.
Algunos de vosotros pueden pensar ahora por qu�
no esperar hasta que escribe el archivo, pone a
Armadillo en un loop infinito y simplemente hacer
una copia del archivo .tmp y ya est�. Heh yo
pienso que es la �nica parte del c�digo donde
los programadores de Armadillo pensaron lo que
hacen. El hecho es, que ellos escriben el prog
real entero en un archivo tmp, pero el tramo
inicial s�lo contiene XXXXXX. As� que es
in�til hacerlo as�.
Lo qu� Armadillo hace, es que crea ese proceso
(API CreateProcess) con el flag suspendido
activado, eso significa simplemente que carga el
prog en la memoria y la ejecuci�n es detenida
antes de la primera l�nea del c�digo. Ahora
Armadillo hace una LLAMADA a WriteProcessMemory
donde el XXXX es borrado con el c�digo real del
tramo inicial. Ahora nosotros tenemos un prog
completos en memoria, pero no podemos descargarlo
c�modamente porque esta suspendido, debe haber
una LLAMADA a ResumeThread para permitir
correrlo.
Esto es llamado en una vuelta (WaitForDebugEvent,
ContinueDebugEvent). Eso significa que depura el
proceso creado. Yo pens� �por qu� debe depurar
Armadillo el archivo .tmp? Respuesta: porque
quiere saber cuando el usuario cierra, abandona
el prog real, as� que Armadillo puede hacer
alguna la cosa y tambi�n puede dejarla. As�
�c�mo conseguimos nosotros un archivo
trabajando sin Armadillo?
Heh que es bastante f�cil. Pon un bpx en
ResumeThread antes del jmp 0. Entonces aprieta
F5. SoftICE romper�; F12 para volver a Armadillo
y teclear ' a'; ' jmp eip'
F5 entonces; abre ProcDump, selecciona el archivo
.tmp fuera de la lista de tareas y haz una
descarga completo. No hay nada m�s que hacer.
Incluso no cambiando el punto de entrada.
�No es eso extra�o? Heh s�, claro dir�a yo.
|
|