Descomprimir UPX con UPX. Unpack UPX.
¿Por qué hacer difícil lo sencillo?
Yo creo que, para cualquier programador, UPX no necesita presentación ya que es uno de los compresores de ejecutables más utilizados en todo el mundo. Sin embargo, hay una cosa que me sorprende aún a día de hoy: ¿por qué a la hora de descomprimir un ejecutable que ha sido previamente comprimido con UPX, no se recurre primeramente a UPX?
Cuando se usan packers en ejecutables, en vez del verbo comprimir/descomprimir suele utilizarse en Ingeniería Inversa el verbo empacar/desempacar (empaquetar/desempaquetar) que viene del inglés pack/unpack. Busca ahora mismo en Internet, con tu buscador preferido, la siguiente frase: "Cómo desempacar UPX" o "cómo descomprimir UPX" o en inglés "unpack UPX" y verás el porqué de la pregunta anterior.
¿Qué es UPX?
UPX son las siglas de Ultimate Packer for eXecutables. Es un packer (empacador, compresor de ejecutables) gratuito, portable, open-source, con alto rendimiento y disponible para varios formatos de ejecutables: desde formatos para Windows, Mac, DOS, Linux... hasta incluso para el formato ejecutable de PlayStation. Si no lo conocías, seguro que ahora será uno de tus favoritos, su página web es esta: http://upx.sourceforge.net/
¿Por qué no se suele descomprimir con el propio UPX?
Si no entiendes términos sobre Reversing, mejor que saltes este párrafo. Esta es mi opinión y sinceramente yo creo que todo esto se debe a que UPX es muy sencillo de descomprimir. Si lo miras desde el punto de vista de la Ingeniería Inversa, verás que desempacar UPX con UPX no tiene sentido porque no aprendes nada. Sin embargo, si lo haces manualmente, comprendes qué es el Entry Point, cómo encontrar el OEP (Original Punto de Entrada), aprendes a volcar un archivo en memoria a tu disco duro, a reparar si es necesario la IAT (¿Sabes lo que es?) y a encontrarla... Yo si quiero aprender, también elegiría la opción manual ¿o no?
¿Por qué descomprimir con UPX?
Al contrario de lo que dijimos en el párrafo anterior, porque no todo el mundo conoce la Ingeniería Inversa ni quiere aprenderla y solo buscan realizar un proceso lo más rápido y eficaz posible. En este punto también quiero añadir algo que considero importante. Si observas en la web oficial de UPX, antes enlazada, verás en su licencia de uso (http://upx.sourceforge.net/upx-license.html) los siguientes apartados:
- Special exception for compressed executable:
1. You must compress your program with a completely unmodified UPX version; either with our precompiled version, or (at your option) with a self compiled version of the unmodified UPX sources as distributed by us.
2. This also implies that the UPX stub must be completely unmodfied, i.e. the stub imbedded in your compressed program must be byte-identical to the stub that is produced by the official unmodified UPX version.
3. The decompressor and any other code from the stub must exclusively get used by the unmodified UPX stub for decompressing your program at program startup. No portion of the stub may get read, copied, called or otherwise get used or accessed by your program.
Que voy a intentar traducir lo mejor que pueda:
1.- Puede comprimir su programa con una versión de UPX inalterada; ya sea con nuestra versión precompilada, o (según su elección) con una versión propia compilada del código fuente sin modificar de UPX que nosotros distribuimos.
2.- Esto también implica que el stub de UPX debe estar completamente inalterado, esto es, el stub embebido en su programa comprimido debe ser idéntico byte a byte al stub que es generado por la versión oficial inalterada de UPX.
3.- El descompresor y cualquier otro código del stub debe ser usado (no sé traducir get used en este contexto) exclusivamente por el stub inalterado de UPX para la descompresión de su programa al comienzo de este. Ninguna parte del stub puede ser leída, copiada, llamada o, de otro modo, usada o accedida por su programa.
- Annotations:
You can use a modified UPX version or modified UPX stub only for programs that are compatible with the GNU General Public License.
Ud. solamente puede usar una versión UPX modificada o el stub de UPX modificado en programas que son compatible con la licencia GNU General Public License.
El stub es simplemente la porción de código que se encarga de realizar la descompresión. Sin él no podríamos descomprimir el ejecutable.
Como puedes observar, la licencia de uso de UPX pone algunas limitaciones y esto hace que la mayoría de programas utilicen una versión o stub de UPX inalterad@: otro punto más para intentar descomprimir UPX con UPX. Vamos, por fin, a ello.
Ejemplo: descomprimir UPX con UPX
UPX es portable y no necesita instalación. Para usarlo en Windows, descargo desde la web oficial de UPX la versión para esta plataforma -un archivo comprimido en zip- y lo descomprimo directamente en C. ¿Cómo se utiliza? Yo creo que es muy sencillo y viene bien explicado en su manual; accede a la ruta donde has dejado UPX, en mi caso: C:\upx309w, allí verás un archivo llamado upx.doc 1, ábrelo y en el apartado Commands apacerá lo siguiente:
Decompress: All UPX supported file formats can be unpacked using the -d switch, eg. upx -d yourfile.exe will uncompress the file you've just compressed.
Muy sencillo de entender. La traducción es:
Descompresión: Todos los formatos de archivo soportados por UPX pueden ser descomprimidos usando la opción -d, por ejemplo, upx -d miarchivo.exe descomprimirá el archivo que acaba de comprimir.
Un ejemplo práctico. Descarga el siguiente archivo:
Tienes que extraer el archivo asm02_UPX307w.exe 2 (que está dentro de una carpeta del mismo nombre) y dejarlo en el directorio principal de UPX. Observa la figura:
El nombre del archivo (asm02_UPX307w 2) significa que lo programé en ensamblador (asm) y que está comprimido con UPX versión 3.07. Observa que ahora tengo instalada la versión 3.09 de UPX. Vamos a descomprimirlo.
Para ello necesitamos el procesador de comandos de Windows (CMD). Así que:
- En Windows XP al menú de inicio 3 ? ejecutar y en la ventana emergente escribe cmd.
- En Windows Vista/7 pulsa el botón inicio 3 y escribe en el cuadro de texto cmd, aparecerá en la parte superior el procesador de comandos de Windows 4.
Nota: Para mostrar la ventana ejecutar puedes usar el siguiente atajo: tecla Windows + R.
La ventana (CMD) muestra lo siguiente:
Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\karmany>
Voy al directorio de upx:
Microsoft Windows [Versión 6.1.7601]
Copyright (c) 2009 Microsoft Corporation. Reservados todos los derechos.
C:\Users\karmany> cd..
C:\Users> cd..
C:/> cd upx309w
C:/upx309w>
Y ahora simplemente sigo las indicaciones del manual de UPX:
C:/upx309w> upx -d asm02_UPX307w.exe
El resultado es este:
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2013
UPX 3.09w Markus Oberhumer, Laszlo Molnar & John Reiser Feb 18th 2013
File size Ratio Format Name
-------------------- ------ ----------- -----------
343040 <- 46592 13.58% win32/pe asm02_UPX307w.exe
Unpacked 1 file.
C:\upx309w>
Observa que el archivo descomprimido ha sido sobreescrito 5:
Fíjate también en el tamaño original 2 (46 KB) y en el tamaño final 6 (335 KB). Solo queda ahora probarlo y ver que funciona correctamente.
Conclusiones
Como puedes observar, descomprimir UPX con el propio UPX es algo muy sencillo de hacer aunque en este tutorial parezca algo laborioso, pero es porque he puesto muchos detalles para los usuarios menos avezados. Una de las precauciones que deberás tener en cuenta es que el archivo final es sobreescrito y sería aconsejable que antes realizaras una copia de seguridad.
UPX tiene muchas opciones y diferentes según el formato ejecutable. Escribe:
C:\upx309w> upx --help
o
C:\upx309w> upx -h
Para ver la ayuda en pantalla.
Tal vez a partir de ahora te toque dar el siguiente paso y conocer cómo se hace el proceso manualmente. Si sigues este camino, te empezarás a adentrar en el mundo de la Ingeniería Inversa y a conocer términos como EP, OEP, IID, aprenderás a reconstruir la IAT, a volcar archivos en memoria a tu disco duro y cuando un día retornes a este artículo, seguro que preferirás hacer el desempacado manual que hacerlo con directamente con UPX. ¡Disfruta!