Desempacar PeiD 0.95
¿Qué es PeiD?
PeiD es una excelente herramienta utilizada en Ingeniería Inversa para detectar packers, crypters y compiladores para archivos PE (Portable Ejecutable). Es una lástima, pero en su web el día 04 de abril de 2011 anunciaron la parada del proyecto y que no saldrán nuevos lanzamientos de PeiD. Desde las versiones anteriores, mucha gente siempre ha querido personalizar su propio PeiD con alguna imagen particular pero en la última versión 0.95 existe un pequeño inconveniente y no es posible hacerlo tan fácilmente. Vamos a solucionar este problema ya que algún usuario de la web ha tenido dificultades.
Estudiando PeiD
Antes de continuar. Este tutorial ha sido escrito con muchos detalles dirigido a gente sin conocimientos, las cosas más simples para un usuario avanzado pueden ser la más complejas para otro que comienza. Algunos usuarios tenían problemas para desempacar este programa. De momento haré 3 tutoriales explicando esto y cómo solucionar el principal problema que ocurre. Al final del tercer artículo incluiré un video explicativo de cómo realizar sencillamente todo el proceso, pero primero hay que leer esto. Veremos cómo solucionarlo.
Si abres PeiD con PeiD, y de las tres opciones que tiene usas "Deep Scan" (escaneo profundo) verás que está empacado con UPX. Literalmente leemos lo siguiente que nos puede orientar:
UPX 0.89.6 - 1.02 / 1.05 - 2.90 -> Markus & Laszlo
Antes de continuar, leo detenidamente la documentación del programa y no nos impide desempacarlo, así que ¡vamos a ello!.
Desempacar PeiD 0.95
Si intentas desempacar PeiD 0.95 con el mismo plugin que el programa incorpora (PeiD Generic Unpacker) verás que se ejecuta un posible bucle infinito, no nos vale. Si intentas desempacar PeiD 0.95 con UPX, de esta forma:
C:\upx307w>upx -d PeiD.exe
Verás que UPX dice que el archivo ha sido probablemente modificado:
C:\upx307w>upx -d PeiD.exe
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2010 UPX 3.07w
Markus Oberhumer, Laszlo Molnar & John Reiser Sep 08th 2010
File size Ratio Format Name
-------------------- ------ ----------- -----------
upx: PeiD.exe: CantUnpackException: file is modified/hacked/protected; take care!!!
Unpacked 0 files.
C:\upx307w>
Tampoco nos vale. Así que voy a hacerlo de la forma más sencilla posible a mano, pero antes de continuar es necesario atender a los dos intentos que acabamos de probar. Si UPX nos dice que ha sido modificado, nos está indicando que el programa original fue empacado con UPX y que después -ya comprimido- fue alterado. Esto se ve rápidamente cuando observas con un visor de PE el nombre de las secciones. Aunque parece una tontería, para los más noveles es importante que entiendan esto. Esas modificaciones que se han realizado pueden ser trucos anti-dumpeado y tal vez puede ser información importante y necesaria para la ejecución del programa. Vamos a continuar pero ten esto presente.
Desempacado a mano
El desempacado a mano es muy sencillo. Para ello voy a usar las siguientes herramientas en Windows 7:
- OllyDBG 2.01 original
- Plugin OllyDump v2.01 por AORETEAM
- ImportRE 1.7e
Vamos a cargar PeiD 0.95 en OllyDBG, el EP (Punto de Entrada) que debes ver debe ser este:
004982E0 pushad
004982E1 mov esi,00464000
004982E6 lea edi,[esi+FFF9D000]
004982EC push edi
004982ED jmp short 004982FA
...
Nota: fondo verde oscuro = donde está parado el debugger.
Si tu EP está en 0046F49E es porque OllyDBG 2.01 tiene una opción para descompresión automática pero que no quiero utilizar para que lo entiendas y lo sepas hacer a mano. Así que voy a deshabilitar esa opción, voy al menú Option -> Options -> SFX y destildamos "Unpack SFX modules automatically". Pulsa Ok y reinicia la carga de PeiD 0.95 en OllyDBG. Ahora deberás ver el EP de antes.
UPX como la mayoría de compresores, en su algoritmo usa un patrón repetido y de este modo consigue reducir el tamaño del ejecutable. Donde te encuentras ahora es el comienzo de la descompresión. El código de UPX empezará ahora a descomprimir PeiD 0.95 (comprimido) y cuando esté descomprimido del todo pasará la ejecución al programa PeiD 0.95 ya descomprimido. Encontrar este último punto (en este caso) es muy sencillo. Simplemente parado en el EP (004982E0) usa la ruleta del ratón y ve hacia abajo. Hasta que encuentres lo siguiente:
...
00498479 push ebx
0049847A push edi
0049847B call ebp
0049847D pop eax
0049847E popad
0049847F lea eax,[esp-80]
00498483 /push 0
00498485 |cmp esp,eax
00498487 \jne short 00498483
00498489 sub esp,-80
0049848C jmp 0046F49E
00498491 db 00
00498492 db 00
00498493 db 00
...
Ahí tenemos el punto final, en: 0049848C. Es decir, cuando cuando se ejecute todo el código desde el comienzo en 004982E0 hasta el final en 0049848C ya se habrá hecho toda la descompresión. (Aparte de otras cosas).
Simplemente ponemos un BP (Breakpoint - Punto de ruptura - lugar donde parará el depurador) en la dirección 0049848C. Para esto nos situamos ahí y pulsamos F2 (o botón derecho del ratón -> Breakpoint -> Toggle o doble clic en Hex dump). Se habrá puesto la dirección de color rojo:
0049848C E9 0D70FDFF jmp 0046F49E
Recuerda que el debugger está parado en 004982E0. Pulsa F9 (o el icono de triángulo azul que parece el típico "Play" de cualquier reproductor) para ejecutar el código. Y se tiene que detener donde hemos puesto el BP:
0049848C E9 0D70FDFF jmp 0046F49E
...
Nota: fondo verde oscuro = donde está parado el debugger.
Pulsamos F7 (o el icono con el tooltip Step Into) para ir a 0046F49E y ya estás en el OEP (Original Punto de Entrada):
0046F49E call 00478365
0046F4A3 jmp 0046F320
0046F4A8 push ebp
0046F4A9 mov ebp,esp
0046F4AB push ebx
0046F4AC push esi
0046F4AD push edi
...
Ahora vamos a dumpear (vamos a copiar lo que ves ahora en memoria ya descomprimido y lo vamos a llevar a un archivo físico. En español dumpear se suele traducir por volcar) y lo vamos a hacer ayudándonos del plugin OllyDump. Voy al menú plugins -> OllyDump -> Dump debugged process, verás la siguiente ventana:
Déjalo tal cual ves en la imagen y únicamente pulsa el botón 1: Dump. Yo guardo el dumpeado como dump.exe. No cierres OllyDBG y déjalo en el OEP. Si observas ahora el archivo dump.exe que hemos generado, verás que ha aumentado considerablemente de tamaño, pero para funcionar necesitamos reconstruir la IAT. De la IAT es necesario hablar detenidamente y en otros tutoriales, pero ahora para entenderlo es una tabla que contiene las direcciones a distintas API. En el siguiente artículo reconstruiremos la IAT.