Como usar el ProcDump para descomprimir/desencriptar tus cobayas
By Mr. Orange (1999)



0) Introduccion.
1) Herramientas necesarias.
2) Un vistazo al Procdump.
3) Descompresión manual.
4) Añadir un Script.
5) Nota final.



0) Introduccion.
La intencion de este manual es enseñar como descomprimir nuestro objetivo cuando no hay un descompresor para el (o por lo menos no lo tenemos).
Nuestra cobaya va a ser el CuentaPasos v3.75.

1) Herramientas Necesarias.
  • SoftICE
  • ProcDump (Yo he usado la versión 1.5 Build 0 )

2) Un vistazo al Procdump.
ProcDump es una herramienta que te permite (entre otras cosas) copiar el contenido de un proceso al disco duro. También te permite editar la cabecera de los programas de tipo PE (Portable Executable).

Veamos entonces como funciona...
La ventana principal tiene 2 listas y 7 botones. La primera lista contiene los procesos que estas ejecutando en este momento, mientras que la segunda contiene los modulos que estan asociados a cada proceso. Los botones son:

  • Unpack: Descomprime un ejecutable. Procdump es capaz de descomprimir algunos compresores.
  • Rebuild PE: Reconstruye la cabecera de un ejecutable.
  • PE Editor: Esta claro, no? Te permite editar la cabecera de un ejecutable.
  • Bhrama Server: Ejecuta el Servidor Bhrama. Esto premite que otro programa (llamado cliente) se aproveche de las magnificas cualidades del ProcDump.
  • Options: Para modificar alguna opción del programa.
  • About: Muestra información del ProcDump.
  • Quit: Salir del programa.
Para más información, leete los *.TXT que vienen con el ProcDump

¿Que utilidad tienen las listas?
En la lista de procesos podemos realizar 5 operaciones que son accesibles a traves del botón derecho del ratón:

  • Dump (FULL): Copia todo el contenido del proceso al disco duro.
  • Dump (PATIAL): Copia el contenido del proceso al disco duro (solamente un rango).
  • Kill Task: Termina un proceso.
  • Process Infos: Muestra la cabecera del ejecutable.
  • Refresh List: Actualiza la lista.
Mientras que en la lista de modulos las opciones disponibles son:
  • Dump (FULL): Copia todo el contenido del modulo al disco duro.
  • Dump (PATIAL): Copia el contenido del modulo al disco duro (solamente un rango).

3) Descompresión manual.
OK!! Empecemos por analizer el fichero. Para ello he utilizado la magnifica herramienta Gettyp, y los resultados son:

- [cpasos32.exe] -----
DOS executable file - 334562 bytes
Portable executable (starting at 128 for 334434 bytes)
  Found no known modifier or compiler.
  Calculated entrypoint: 8714 / 0000220Ah (RVA: 0011440Ah)
  Required CPU type: 80386
  Requires Win 95 or NT 4
  Flags:
    File is executable
    Line numbers stripped from file
    Local symbols stripped from file
    32 bit word machine
  Linker version: 4.20
  Objects (object align = 00001000h):
    Name      Virt size    RVA    Phys size Phys Ofs
    .text     000BD200h 00001000h 000BD200h 00000000h
    .data     00017CA4h 000BF000h 00000000h 00000000h
    .idata    00000400h 000D7000h 00000200h 00000400h
    .rsrc     00030C00h 000D8000h 00001800h 00000600h
    Oreloc    0000A600h 00109000h 0000A600h 00000000h
    .         0000640Ah 00114000h 00001E00h 00001E00h
    .reloc    000000DCh 0011B000h 00000200h 00003C00h
  Found 318690 bytes overlay
    Absolute position: 15872 of 334562 (= 4.7%)
    Found archive at position 898 in overlay
    --- next detection level --------
    RKive 1.92 archive
    Don't know how to list this type of archive :-(

Segun parece, nuestro amigo esta comprimido. Pues tiene un Overlay de 318690 bytes, y si nos fijamos, el programa entero ocupa 334562 bytes.

¿Que es lo que sabemos hasta ahora?
Que nuestro amigo esta comprimido, pero no es posible que se ejecute el codigo en ese estado, por lo que se debe descomprimir en memoria y luego ejecutarse. Asi pues lo primero que se debe hacer el programa es descomprimir el codigo y luego ejecutarlo.

Sabiendo esto, cargemos a nuestra cobaya en el SoftICE y pongamos un breackpoint al principio del codigo:

0051440A ;  S u b r o u t i n e
0051440A  public start
0051440A start  proc near
0051440A
0051440A  jmp   005144B5
/*......*/
005144B5  mov   eax, [esp+arg_0]
005144B9  and   eax, 0051441B
005144BF  call  00514835     <-- Rutina de descompresion
005144C4  inc   005144B4
005144CA  jmp   eax     <-- Salto al programa ya descomprimido
005144CA start   endp

Bien, ahora ya sbemos que es lo que hace el programa, pero ¿Como vamos a descomprimirlo?
Pues muy sencillo, vamos a ejecutar el programa paso a paso hasta la linea 005144CA. Justo ahi vamos a modificar una lineas de codigo, esi que introduce el comando a (para ensamblar), y escribe la siguiente linea: jmp eip
Esto provocara que el programa quede en un bucle infinito en la linea 005144CA.
Ahora es cuando debemos de ir al ProcDump y pulsar con el boton derecho sobre nuestra cobaya y elegir la opción Dump (FULL), y lo guardamos con el nombre que queramos.
Bien, ahora ya tenemos el CuentaPasos descomprimido. Veamoslo, ejecutemoslo y BOOOMMM!!!! El programa no funciona, ¿porque? La respuesta es bien sencilla. Nosotros tenemos el programa descomprimido, pero el punto de entrada todavia es el de la rutina de descompresión. Debemos de combiarlo para que apunte al principio del codigo ya descomprimido.
Bien, pero ¿como sabemos cual debe ser el nuevo punto de entrada? La respuesta la tenemos en la linea 005144CA, ahi hay un JMP EAX. Por lo que en EAX tenemos lo que buscamos. Nos apuntamos el valor de EAX (en mi caso 00401228) y volemos al ProcDump.

En esta Ocasión, vamos a utilizar la opcion PE Editor, con la que podemos editar la cabecera del ejecutable (alli entre otras cosas esta el punto de entrada), y seleccionamos el archivo que hemos creado. Nos aparecera una ventana como esta:


Debemos de fijarnos en los cuadros de texto de Image Base (IB) y Entry Point (EP). El programa empieza a ejecutarse en IB+EP, por lo que sabiendo esto nos resultara fácil modificar la cabecera para que apunte a 00401228. Tan solo debemos poner en Entry Point 00401228 - Image Base = 00001228. Asi que pongamos 00001228 en Entry Point y pulsemos OK. Prueba a ejecutar ahora el programa!! Bien, Funciona. Ahora ya tenemos el CuentaPasos descomprimido. xDD

4) Añadir un Script.
Vamos a añadir un Script al ProcDump para que sea capaz de descomprimir el CuentaPasos, asi que editemos el fichero script.ini del ProcDump para añadir una nueva entrada:

P1A=PCGUARD v2.10
P1B=Aspack108.3
P1C=Shrinker 3.4
P1D=CuentaPasos v3.75 <-- Entrada añadida

[CuentaPasos v3.75]
L1=LOOK FF,E0
L2=BP
L3=STEP

Realmente es bastante sencillo lo que hace este Script: La primera linea busca la secuencia de bytes FFE0 que corresponden a los opcodes de JMP EAX, luego ponemos un BreackPoint y ejecutamos el progama paso a paso para gaurdarlo al disco duro.
Sencillo, no? ¿Que conseguimos con esto? Pues es probable que en la proxima versión el autor utilice el mismo compresor, y nosotros tan solo tendremos que ejecutar el script para descomprimirlo. xDD

5) Nota final.
Bueno, esto es todo por hoy. Pero no queria terminar este articulo sin deciros que este metodo de compresion es realente muy sencillo (Si lo intentamos descomprimir con el metodo estandar que viene con el ProcDump, tambien tendremos exito :)) ). Pero mi intención era enseñar como hacer esto mismo manualmente y luego añadir un pequeño Script al ProcDump para ser capaces de descomprimir otros programas que emplean el mismo compresor.

PD: Recordad que muchos compresores utilizan trucos antidebug y tambien es posible encontrarse otros que incluyan codigo antiSoftICE... :))
Como quitar la protección VBOX que tiene el Ulead Button.Applet 1.0