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.
|
|