Karpoff Spanish Tutor 2001

Programa:        Desempakando Manualmente  UPX


 

PROTECCION: EMpakador UPX
Objetivo:

Desempakar UPX

Descripcion:

 

Dificultad: Newbie
DOWNLOAD:

 

Herramientas:

SoftIce, Procdump, Un-Pack v2.1 (opcional)

CRACKER:

Rul

  FECHA: 13/08/2001

 

 INTRODUCCION

 

En este tutorial (nº 4) voy a tratar de explicaros de forma un poco chapucera, como es tipiko en mi, como funciona un empakador en este caso UPX aunke si os gusta y tal intentare haser un tute para cada empakador (Aspack, PeCompact, etc..)
El metodo es muy sencillo, por lo tanto no es perfecto, porque el ejecutable que obtendremos no tendra la tabla de importaciones, pero vamos.... Ya aprendere ;-) y actualizare el tute.

NOTA: (Para los ejemplos de este tute utilizare uno de los keygen ke he echo, pulsa aki para bajarlo)

 

 

 AL ATAKE

 


 

2 - ¿Como sabemos que nuestro "objetivo" esta empakado?

Parece una cosa estupida, pero.... ¿Como piensas desempakar un archivo sin saber si lo esta o no?. Bueno hay varias formas:

2.1 - Procdump
Es una forma de ver que nuestro archivo esta empakado, darle a PE Editor y abrid un exe cualquiera. Mirar Sections y fijaos ke aparece lo siguiente (o parecido):
CODE
DATA
BSS
.idata
.tls
.rdata
.reloc
.rsrc

Pues ahora haz lo mismo con mi keygen, y observa:
.UPX0
.UPX1
.rsrc

Umm parece una pista fiable de ke esta empakado (casi seguro) con UPX (no tan seguro), os digo esto porque el nombre de las secciones puede cambiarse }:-) (no es este el caso pero que sepais que se puede hacer). Vamos a ver otra forma de saber si esta empacado y con que compresor.

2.2 - Un-Pack
Este es un progamilla muy util, ya que nos indica de forma fiable con que compresor esta empacado un archivo, y si no lo esta nos dice que lenguaje se ha utilizado.
Aparte de eso lleva un monton de unpackers.

Bueno su uso es muy simple, en una ventana de MS-DOS o mediante un .BAT escribir lo siguiente un-pack c:\path\nombre.exe
Al hacerlo sobre nuestro programa sale lo siguiente

* Packed by UPX v.0.76.2-1.?? by Markus F.X.J. Oberhumer & Laszlo Molnar
* Use UPX with -D option for unpack
* Use ProcDump v.1.6 by G-RoM, Lorian & Stone //UCF for unpack
* Executable file extension
* Trust me, I know what I'm doing...

:) Esto aclara nuestras sospechas sobre el empacador usado.

2.3 - Otras pistas.....
Hay otras cosas que nos pueden hacer sospechar que nos encontramos frente a un archivo comprimido:
- Al intentar desensamblarlo con W32Dasm no nos sale nada o simplemente cosas sin sentido
- Al intentar cargarlo con el SoftIce Symbol loader, no rompe al principio del codigo (Entrypoint)

 

3 - Algo de teoria

Aqui voy a tratar de explicar un poco por encima, ya que no soy ningun experto en el tema (Si alguien se anima a colaborar email-me), como funcionan estos compresores.
 

Para que un archivo comprimido pueda ser ejecutado, primero tiene que estar desencriptado, si no el ordenador no lo "entiende" asi que podemos distinguir varias partes en un archivo de este tipo:

1- Una rutina sin ecnriptar que se encarga de descomprimir el ejecutable a memoria.
2- El programa en si mismo encriptado.

Una vez que la rutina ha descomprimido el ejecutable a memoria, salta al principio de codigo desencriptado y se ejecuta de manera normal, este proceso se repite cada vez que se ejecuta.
Estas "rutinas de descompresion" suelen tener la siguiente estructura:

PUSHAD // 60
...............................
(codigo de la rutina)
...............................

POPAD
// 61
JMP 00xxxxxx //
Salto al principio del codigo desencriptado o OEP (EntryPoint Original)

 

Voy a explicaros teoricamente como abordaremos a la hora de desempacarlo manualmente:
1- Localizar el salto al OEP
2- Cambiar ese salto por JMP EIP (Asi creamos un bucle infinito) Con lo que tendremos el ejecutable desencriptao en memoria
3- Dump (Volcado) de Memoria en un ejecutable

Visto esto yo creo que estamos listos :)

 

4 - La Practica

¿Asustados? Pos no os precupeis que todo esto suena muy complicado pero no lo es tanto.
 

Como he dicho antes lo primero que hay que hacer es localizar el salto al OEP, pues bien vamos a ello.
Cargar el keygen en el SoftIce Symbol Loader, darle a Load y ...... !! pero ke pasa !! El programa se ha ejecutado directamente, Softice no ha saltado al principio del codigo como suele hacer. Vamos a apañar esto :)

Abrir ProcDump y darle a PEeditor -> Sections y sale lo siguiente:

La culpa la tiene el campo Characteristics de las secciones UPX0 y UPX1
Tenemos que cambiarlas las dos, Yo no soy el mas indicado para explicarlo exactamente, asi que si quereis saber mas os recomiendo el tute sobre Encabezados PE de numIT_oR podeis encontrarlo en http://welcome.to/karpoff
Pues eso tenemos que cambiar esos campos por E0000060.
Boton derecho encima de cada uno de ellos y Edit Section

Con lo cual es aspecto final queda tal que asi:

Pues ahora lo intentamos otra vez con el Symbol loader y ahora si que funciona :)
Entramos en la siguiente linea:

015F:0043FC40 60 PUSHAD
 

Como tenemos que buscar el Salto al OEP y este suele encontrarse debajo de la instruccion PUSHAD escribimos:

S 00xxxxxx l FFFFFF 61 // Ojo que queremos buscar la instruccion 61 no el texto ' 61'

A lo que SoftIce nos responde: Pattern Found at 0030:0043FD96 Asi que ni cortos ni perezosos nos dirigimos alli directamente ( a veces no lo encontramos a la primera y hay que hacer mas busquedas ) escribimos g 0043FD96 y nos encontramos con lo siguiente:

015F:0043FD96 61 POPAD
015F:0043FD97 E9E864FEFF JMP 00426284

Muy bien ya hemos encontrao el dichoso salto, Apuntad y guardar bien la direccion a la que va el salto que lo utilizaremos luego.
Lo siguiente a hacer es crear el Bucle Infinito, que es muy sencillo:

Escribid a 0043FDF7 para editar; Ahora escribir JMP EIP + enter y tendreis que poner 3 NOPs ya que al codificar JMP EIP se utilizan menos bytes.
Pues ya tenemos nuestro Bucle infinito echo, ahora pulsamos F5 y volvemos a windows (El bucle sigue ejecutandose)

El ultimo paso es Dumpear asi que abrimos ProcDump y en TASK (procesos activos) elegimos nuestro ejecutable con el boton derecho y le damos a Dump (full) y guardamos el ejecutable donde queramos.

Pues ya tenemos nuestro ejecutable desempakado :) lo vamos a probar y........ ¡no funciona!
No os preocupeis ya que falta el ultimo toque final.

Ahora es cuando hase falta el OEP :) recordamos que en este caso era 00426284 , nuestro ejecutable se cuelga porque tiene puesto el EntryPoint por defecto que no coincide con el que tenia que ser asi que vamos a cambiarlo :)

Primero vamos a calcular el OFFSET del Punto de Entrada, Abrimos el ejecutable sin descomprimir con el ProcDump / PE Editor y apuntamos Imagebase en este caso 00400000.

El OFFSET se saca mediante la siguiente formula : OEP - ImageBase = OFFSET

00426284 - 00400000 = 00026284

Bueno abrimos el ejecutable descomprimido con el ProcDump / PE Editor y en EntryPoint ponemos 00026284:

Bueno pues probamos otra vez a ver si ahora hay suerte y funciona. Lo ejecutamos y funciona a la perfeccion :) . Ya lo hemos descomprimido.
¿A que no ha sido tan dificil?

Si te interesa este tema te recomiento estos tutoriales

Titulo
Autor
URL
Descabezando archivos Ejecutables Portables
nuMIT_or
PATCHING Encrypted or packed targets
macilaci
fravia's page of reverse ingeneering
UPX unpacking tutorial
¿?
ASPack v1.083
Volatility

Si os queda alguna duda, quereis colaborar (estaria muy bien), quereis ponerme a parir o simplemente habeis leido este tute y pensais que no esta mal escribidme un mail a rulzgz@punkass.com que se agradece mucho.

 

5 - Saludos

A Mr.Silver y [thEpOpE] por ayudarme tanto.
A Karpoff por publicarme los tutes.
A todos los crackers y grupos Hispanos.
A la gente de los canales #Crackers y #AtRiO del Irc-hispano.

 

- --=> RuL 2k01 - Http://kickme.to/rulcrk - rulzgz@punkass.com <=-- -
[EOF]

 

Karpoff Spanish Tutor: Pagina dedicada a la divulgacion de informacion en Castellano, sobre Ingenieria Inversa y Programacion. Email "Colabora con tus Proyectos"
www.000webhost.com