Desempacando Manualmente Asprotect versión 1.0
La Tabla de Importación Encriptada

student
No Asignada
Junio del 2000

por Tsehp

Octubre del 2000

Traducción de ^[G]oLe[E]^

Gt!! RuLeS
Cortesia de Reverser's page de Ingenieria Inversa
Ligeramente editado
por reverser+
There is a crack, a crack in everything That's how the light gets in
Rating
( )Principiante (x)Intermedio (x)Avanzado ( )Experto

 

Desempacando Manualmente Asprotect versión 2000
La Tabla de Importación Encriptada
Escrito por Tsehp

Introducción

Asprotect es otro objetivo muy conocido, este empacador (packer) fue estudiado mucho y a menudo usado como un objetivo de practica para newbies. Si no sabes nada acerca de empacado, desarrolla tu conocimiento en los ensayos pasado, entonces regresa, tratare de explicarte los ultimos trucos. Acostumbro encontrar este objetivo cuando busco el msgboard del newbie de Sandman. Gracias a un reverser (cracker o revertidor) llamado SV que explicó bien la proteccion en sus terminos, su trabajo me salvo un monton de tiempo.

Importante : Este ensayo puede brindarte una aplicación funcional con tu sistema actual, pero la Tabla de Importación no está reconstruida, así que si tienes que actualizar tu OS y cambian las direcciones de los dll's, no trabajará mas y tendras que hacer el proceso de nuevo. Actualmente estoy trabajando en otro ensayo para finalizar la reconstrucción de la Tabla de Importación.

Herramientas requeridas
Softice 4.05
Icedump
Procdump
Ida 4.04
Un Editor Hex

Ensayo hecho en win 2000, espera cambiar (adelante en este ensayo) algunas direcciones de Importación si estas trabajando en win 9x.
URL/FTP del Blanco
http://www.tamos.com/
Este Commview 2.1, otro portsniffer.

Ensayo
1) Las Rutinas Anti-SoftICE

Antes de lanzar esta aplicación, tienes que esconder tu debugger. Este programa usa 2 trucos tipicos Anti SoftICE:

-Esta cargado el driver? : bpx createfileA haz un "d esp-4"

Commview trata de ver si estan cargadas 3 versiones diferentes de SoftICE. Tienes que golpear 3 veces:
SIWDEBUG
SICE
NTICE

Bueno, dependiendo de tu Sistema, presiona F12 cada vez, el createfilea debe retornar 0xFFFFFFFF, si no, presiona F12 de nuevo y fija un eip a la dirección apuntada por el segundo jnz de abajo, pasaras todas las pruebas.

-El Truco boundschecker. SICE usa int3 para sus breakpoints, pero cuando valores especiales son fijados para registrar, especialmente en ebp conteniendo 'BCHK' 0x4243484b, entonces si un int3 es encontrado, el manejador normal de interrupción retorna despues de este Int3 dentro de tu objetivo, así el código justo despues es ejecutado si SICE está presente. Para evitar esto, presiona F10 varias veces despues de fijar tu eip, ve despacio a través del código hasta que veas el Int3 en SICE. Cuando estés allí, cambia tu ebp a algo mas que 0x4243484b, entonces el programa correra normalmente hasta el último chequeo detectado por bpx createfilea, justo como arriba.

Para el chequeo final, invierte el jz despues del createfileA, todas las pruebas están venciadas ahora.

Nota : Tuve que hacer esto manualmente, porque frogsice no está implementado para win NT actualmente, la copia actual en NT llamada Ntall no es del todo funcional, así que no pude usar un device cargado para evitar esas manipulaciones.

2) Localizando el Punto de Entradaa.

Si quieres volcar tu programa empacado, debes para el objetivo aquí, para que todas las secciones sean cargadas. Tengo que admitir que usé directamente la tecnica que Eternal Bliss encontró en el forum de newbies. Aquí está, intacto:

Steps:
1) bpx en getprocaddress
2) Una vez rompes, ve la sección .idata section con "dd 4E3000".  Esto lo encuentras 
   haciendo "map32 cv"
3) bpm en el primer byte (justo para romper allí) y desactivar el breakpoint en 
   getprocaddress 
4) F5 y deja que el programa se ejecute
5) Al romper, desactiva todos los breakpoints
6) F12 4 veces y aterrizaras en un Xor EAX, EAX
7) Comienza rastreando con F10
8) Cada vez que encuentras un CALL, chequea que unas pocas instrucciones abajo sean JMP
9) Si son, puedes rastrearlas
10) Si es un ret, tienes que rastrear en ese CALL con F8
11) Entonces para en los 2 CALL's subesecuentes
12) Verás el OEP movido dentro de EAX en alguna parte
13) Entonces te encontraras con un POPAD
14) Las cosas del JMP aparecen otra vez como el inicio del código desempacado.
15) Rastrea dentro del siguiente (3er) Call y F8 todo el camino hasta que llegues a un ret
16) Continua así y aterrizaras en el OEP.

Solo aplicalo y lo encontraras, 0x4de384 en mi sistema, solo recuerda que encontrarás
casi todo el tiempo una instrucción POPAD justo antes del final del salto.

Solo como ejercicio, puedes tratar de volcar el exe, usando IceDump y ProcDump para reconstruir el PE (esto no será explicado aquí, si no sabes como hacer esto, mira los ensayos de empacado/desempacado pasados).

Tienes que copiar manualmente copiar hex la sección .aspr original a tu archivo volcado para continuar el ensayo, esta manipulación apenas replicará la Tabla de Importación a tu exe volcado, justo como el commview empacado.

Pero esto no trabajará, solo trata de cargar tu exe volcado dentro de ida y notarás que la Tabla de Importación está dañada, algunas direcciones virtuales en otras secciones tambien están apuntando a direcciones erroneas.

La principal protección de Asprotect está justo aquí: Algunas importaciones están bien, algunas otras están apuntando a un Tabla (localizada en mem en 0x00CDxxxx) normalmente conteniendo algunas direcciones de importación desencriptadas y esta tabla originalmente también contiene algunas rutinas para desencriptar otras direcciones cuando commview las necesita, aún si este programa está desempacado.

Bueno, aquí tenemos un gran problema:
Puedes arreglar manualmente la Tabla de Importación si conviertes todas las direcciones de la tabla al .idata en el lugar correcto.

Así dentro de tu aplicación volcada y dentro del .idata tienes

4e328c : jmp [cd4950] y cd4950 conteniendo 77db858e (una dirección de importación valida)

Tienes que convertir el salto en 4e328c para apuntar directamente a 77db858e.

Gastaras mucho tiempo, y no trabajará. Porque dentro de la tabla cdxxxx, algunas direcciones apuntan a código como este:
cd4950 push cd495a
call 182f68 (por ejemplo)

Qué está pasando? Cuando commview hace el call 4e328c (Tabla de Importación) la rutina localizada en cd4950 solo desencripta la dirección de importación correcta EN TIEMPO DE EJECUCIÓN ! también puedes tratar la tabla cdxxxx, el código desencriptor continuara estando aquí y definiivamente no trabajando. Este rasgo es la mejora real hecha desde las últimas versiones de ASProtect.

Para resumir, cuatro cosas diferentes le pasan a la Tabla de Importación:  4 casos
diferentes en mi programa siguiente
1- La dirección de la API es copiada directamente a .idata
2- La dirección de la API es relocalizada en la Tabla Cxxxxx 
3- La rutina de desencripción es copiada a la Tabla Cxxxxx
4- Una llamada indirecta a GetprocAddress (en la Tabla Cxxxxx) es copiada a .idata

3) Preparando tu volcado

Aun estas en la instrucción int3, haz un S 0 L FFFFFFFF AC 08 C0 74 E4 y localizar el loop *culpable* de construir la tabla de importación, solo haz un bpmb en el inicio.

Aquí está lo que encuentras:

001B:0018A51E  AC                  LODSB
001B:0018A51F  08C0                OR        AL,AL
001B:0018A521  74E4                JZ        0018A507
001B:0018A523  4E                  DEC       ESI
001B:0018A524  56                  PUSH      ESI
001B:0018A525  53                  PUSH      EBX
001B:0018A526  80F802              CMP       AL,02
001B:0018A529  7407                JZ        0018A532
001B:0018A52B  0FB64E01            MOVZX     ECX,BYTE PTR [ESI+01]
001B:0018A52F  41                  INC       ECX
001B:0018A530  EB05                JMP       0018A537
001B:0018A532  B904000000          MOV       ECX,00000004
001B:0018A537  41                  INC       ECX
001B:0018A538  01CE                ADD       ESI,ECX
001B:0018A53A  E8B5FDFFFF          CALL      0018A2F4 <- redirecciona este punto, nota
							 la dirección 0x18a2f4.
001B:0018A53F  AB                  STOSD
001B:0018A540  EBDC                JMP       0018A51E <- también nota esta dirección,
						         es el salto de regreso al loop.

Todo lo que tenemos que haces es encontrar una localidad de memoria libre, llena con 0 para que podamos escribir un pequeño código para modifica esta rutina. la dirección 0x190000 será usada como un ejemplo.

Primero parcha 18a53a jmp 190000

Entonces escribe el siguiente código en memoria con SoftICE:

190000 call 18a2f4 ; Usamos un CALL legal
190005 cmp ecx,40000000 ; ecx contiene una dirección API?
19000b jle 19001c ; si no
19000d add ecx,eax ; Si sí, convierte la dirección***caso 2
19000f add ecx,5 ; a la dirección absoluta de API para una Tabla de Importación normal
190012 mov dword ptr [edi],ecx ; ponerlo en una Tabla de Importación, apuntada por edi
190014 add edi,4 ; actualiza edi a la siguiente importación
190017 jmp 18a51e ; regresar a la normalidad
19001c cmp ecx,0 ; es el caso 4?
19001f jz 19002e
190021 cmp eax,40000000 ; eax contiene una dirección API?
190026 jle 19003c ; si no, ir a 19003c
190028 stosd ; estamos en el caso 1, copia directa de una dirección API valida en la T. I. 
190029 jmp 18a51e ; regresa a la normalidad
19002e push dword ptr [eax+1] ; esamos en el caso 3, empuja la dirección API encriptada
190031 call 16df80 ;IMPORTANTE

Tienes que localizar esta dirección ASProtect haciendo un S 0 L FFFFFFFF 55 8b ec 81 c4 f8 fe ff ff 53 56 y encontramos como ejemplo 16df80, DEBES modificar el código en el offset 16df80+95 con tres nops (90), si no lo haces, este CALL generará un erro 13 en ASProtect (el call no regresa apropiadamente) este CALL es usado para decifrar la dirección API encriptada, normalmente la desencripta en tiempo de ejecución.

190036 stosd ; la dirección de la API es desencriptada, copiala a la Tabla de Importación 
190037 jmp 18a51e ; regresa a la normalidad, no olvides que este es el salto de 
                    regreso al loop
19003c mov eax,KERNEL32!GetProcAddress ; usa SoftICE para tener el getprocaddress de tu
                    sistema.  Este es el caso 4
190041 stosd ; Copia a la Tabla de Importación
190042 jmp 18a51e ; regreso a la normalidad

Cuando hayas terminado de escribir esto, pon un bpmb al punto de inicio del programa (Lo Encontre en 0x4de384 ) entonces lanzalo, si lo typeaste correctamente, la Tabla de Importación ahora es normal y puedes volcarla usando IceDump:

PAGEIN D 400000 12d000 c:\temp\cv_dump.exe

Ahora usa ProcDump para reconstruir el PE.

Muy Importante:  Usa estas opciones de ProcDump al reconstruir el PE:
Structure : todos activdos
Import : No reconstuir importacion (import)
Las demas opciones dejalas intactas.

Ahora tienes que copia manualmente la sección .aspr desde cv.exe (original) a 
cv_dumped.exe, usando tu Hexeditor favorito.  Como un ejemplo, encontre dentro del 
offset raw original : 5aa00 longitud 14800, y en el offset raw volcado: ff400 
longitud 14800, esta manipulación copiará la Tabla de Importación original.

Modifica el Punto de Entrada a 000de384 dentro de ProcDump, para que tu exe volcado comience en 4de384.
Copia tu exe volcado al directorio de commview.

Ahora si lo lanzas, saldrá directamente porque hay un chequeo CRC, tenemos que 
parchear este código dentro del cv_dumped.exe volcado:
004DE3B9                 call    sub_4524A0
004DE3BE                 mov     eax, [ebp+var_10]
004DE3C1                 call    sub_465118
004DE3C6                 cmp     eax, 6F200h
004DE3CB                 jz      short loc_4DE3D2 <- parchear a jmp 4de3d2
004DE3CD                 call    sub_403BB4

No olvides una cosa, aún hay un anti-SoftICE. Reaciva el bpx createfilea y haz "d esp->4"; presiona F12 cuando atines, invierte el jz que está despues.

Lanzalo de nuevo, ahora está trabajando y estás listo para continuar revirtiendo este liciado exe de tiempo de prueba.

4) Qué queda para Crackear?

Ahora el trabajo real está terminado, podemos parchear lo que sea que querramos. Te daré facilmente los parches, solo porque esta sección no fue la parte principal de mi ensayo, esto seguramente te salvara monton de trabajo. Para terminar su agonia, terminamos con:

-Rutina Anti SoftICE: Una tipica, justo despues del bien conocido createfileA :

0046573E                 call    sub_406D0C (createfileA con driver se SoftICE como 
					    argumento)
00465743 
00465743 crack5:
00465743                 cmp     eax, 0FFFFFFFFh está cargado?
00465746                 jz      short loc_465750 <- parchear esto a jump
00465748                 push    eax
00465749                 call    sub_406CEC
0046574E                 mov     bl, 1

-El limite de tiempo: Usualmente lo encontrarás despues de un bpx a getlocaltime, y 
rastrea despues.
004D8D5B                 call    sub_44EB74 ; Este call contiene una llamada a getlocaltime
004D8D60 
004D8D60 loc_4D8D60:                             ; CODE XREF: sub_4D899C+386j
004D8D60                 mov     eax, ds:dword_4E051C
004D8D65                 cmp     byte ptr [eax], 0 ;Está terminado el Trial?
004D8D68 
004D8D68                 jnz     short loc_4D8DB8 <- Fuerza esto a jump
004D8D6A                 mov     eax, ds:dword_4E0378
-Mitad de los paquetes desplegados: fácil con IDA, encuentra la referencia a la cadena: 
0048B5A4                 push    offset loc_48BB1C
0048B5A9                 push    dword ptr fs:[eax]
0048B5AC                 mov     fs:[eax], esp
0048B5AF                 cmp     byte ptr [ebx+5Fh], 0
0048B5B3 
0048B5B3                 nop ; nopea esto para que nunca salte a 48b5c2, adivinas por qué?
0048B5B4                 nop
0048B5B5                 lea     edx, [ebp-14h]
0048B5B8                 mov     eax, [ebx+22h]
0048B5BB                 call    sub_48A7C0
0048B5C0                 jmp     short loc_48B5CF
0048B5C2 ; ---------------------------------------------------------------------------
0048B5C2                 lea     eax, [ebp-14h]
0048B5C5                 mov     edx, offset aDataThisEvalua ; "DATA:THIS EVALUATION
VERSION DISPLAYS O"...
0048B5CA                 call    sub_403E08

Tienes 2 lugares mas para hacer lo mismo, encuentralos y corrige el *bug*.

-la mosta nag cuando dejas commview: lo encontre despues de un bpx a createwindowsexa, tienes que presionar F12 muchas veces para encontrar esta rutina:

00459718 loc_459718:                             ; CODE XREF: sub_45969C+6Cj
00459718                                         ; sub_45969C+70j
00459718                 mov     eax, [ebp+var_C]
0045971B                 mov     edx, [eax]
0045971D                 nop <- Tienes que nopear este call para evitar la nag
0045971E                 nop
0045971F                 nop
00459720                 nop
00459721                 nop
00459722                 nop
00459723                 mov     [ebp-8], eax
00459726                 xor     eax, eax
00459728                 pop     edx
00459729                 pop     ecx
0045972A                 pop     ecx
0045972B                 mov     fs:[eax], edx
0045972E                 push    offset loc_459743
00459733 
00459733 loc_459733:                             ; CODE XREF: CODE:00459741j
00459733                 mov     eax, [ebp+var_C]
00459736                 call    sub_403024
0045973B                 retn

Ahora puedes disfrutar tu nuevo portsniffer, auto reconstruido, justo como debería ser.


Notas Finales
Necesito tu retroalimentación sobre este ensayo, así que por favor escribe tus comentarios 
despues de probarlo, en:
http://www.insidetheweb.com/mbs.cgi/mb155985
Puedes unirte a todos los forums de reversers de sandman, de donde tuve esta idea:
http://www.insidetheweb.com/mbs.cgi/mb628842
O en el msgboard de fravia, para intermedios y avanzados:
http://www.insidetheweb.com/mbs.cgi/mb155985
Gracias a Eternal Bliss, r!sc y SV por sus trabajos preliminares en este 
objetivo interesante.
Tsehp
 



Ob Duh
No te molestaré explicando que deberías comprar este programa si intentas usarlos por mas tiempo del permitido. Querrias ROBAR este software? no necesitas crackear su esquema de protección del todo: lo encontrarás en la mayoria de Sites de Wares, completo y ya registrado, adios, y no regreses.

Estas muy dentro de reverser's page de Ingenieria Inversa Escoge tu camina de salida:


redhomepage redlinks redsearch_forms red+ORC redhow to protect redacademy database
redreality cracking redhow to search redjavascript wars
redtools redanonymity academy redcocktails redantismut CGI-scripts redmail_reverser
redIs reverse engineering legal?

www.000webhost.com