Karpoff Spanish Tutor 2001

PETITE 2.2  Desempakado Manual


 

CRACKER: Andrik   FECHA: 05/07/2001

 

 INTRODUCCION

Hiez RaZa!!!!, como están, espero que bien, bueno, a continuación podrán leer un tutorial sobre desempacado de petite 2.2, este se basa en el método descrito por Metamorpher, ademas de explicaciones incluso para los que no son tan avanzados. Incluyo aparte de lo dicho por Metamorpher info que recabe, y otras cosas y quiza alguna que otra nota interesante.

Este Tutorial lo considero y voy a tratar de hacerlo como las famosas series pa' torpecillos, lo cual no kiere decir ke lo seais, si no, que va a ir de la forma mas simple pa ke todos podamos comprender.

Este Tut está dedicado al gran maestro Metamorpher, a Tangle in Sight, y a mi Amada KaRi (IcH LiEbE DiCh)!!!.

Por Cierto, Karpoff, gracias viejo!!! sos de lo mejor.

 

 AL ATAKE

Paso 1: Obteniendo el OEP.

OEP, se refiere al punto de entrada del programa original, es decir, un programa cualquiera que sea, tiene un EP, o Punto de entrada, que es el lugar donde comienza a ejecutarse el código del progie, al someter los programas a cualquier rutina de encriptación o empakado, el EP del programa, pasa a ser OEP, o sea, Punto de Entrada Original (en inglés es Original Entry Point), y el EP es el del programa empakado, justo (en la mayoria de los casos) en la rutina de desempake/desencripción.

Ahora que esta claro que es el OEP, pues hay varias formas de encontrarlo, El método propuesto por Tangle me ha parecido genial, aunke komo ha dicho Metamorpher, no es del todo seguro, asi que de todas formas, os los presento aká, y vosotros elegireís cual usar:

Método Tangle (Wow Tangle, ya sos famoso):
Este método se basa en que la mayoria de los compiladores comienzan el PEH (Portable Executable Header), es decir el encabezado PE de los archivos con un Manejador de Excepciones y luego un GetVersion. Por lo tanto, este método se basa en esto (según estudios de Tangle =OP), se logra de la siguiente manera.

1. Fijar un bpx GetVersion.
2. Ejecutar el programa.
3. Cuando aparezca el SICE, presionar F12 para ir al código del programa.
4. Si se sube la ventana de código un poco (ya sea usando el Mouse o CTRL+Cursor Arriba), se verá un Push EBP, el Manejador de 
excepciones, y la llamada a GetVersión, por lo tanto el PUSH EBP debe marcar el OEP del programa. Acá debo agregar que el OEP 
es la dirección marcada por el PUSH, no por el contenido de EBP, lo digo porque al principio, intenté seguir este método, y pensé
que el OEP era dado por EBP, pero despues de mucho tiempo de examinar, me dí cuenta ke no erá así.

Método Metamorpher o Método Rapido para encontrar el OEP de los programas protegidos con Petite 2.2
(Lo único corto es el método, que este nombre, si ke la berta).

Okas, este método propuesto por Metamorpher, se basa en su estudio sobre petite:

1. Fijar un bpx GetProcAddress
2. Correr el progie
3. Cuando el SICE aparece, presionar F12 para regresar al código del programa.
4. Aparecemos justo en la rutina de descompresión, se desactiva el breakpoint con bc*
5. Ahora, se baja a través de la ventana de código, hasta encontrar una Call seguida de varios Ceros (0000).
Nota. Encontre una CALL XXXXXXXX, y a la par en el lado izquierdo, aparecia E8 000000, por lo que supuse que esa era la Call a la 
que se referia Metamorpher, y efectivamente se ve, me aparecio luego de presionar CTRL+Page Down, en este momento debes 
fijar un bpm (ojo bpm, porque un bpx no funcionará).
6. Presionas F5 o CTRL+D, para que continue la ejecución del programa, en este punto, el SICE reaparecerá, y cuando lo hagas, 
encontrarás algo como esto:
0167:004E003C 61 POPAD
0167:004E003D 669D POPF
0167:004E003F 83C408 ADD ESP,08
0167:004E0042 E931D5F2FF JMP 0040B54F 
0167:004E0047 E980B5ABBF JMP KERNEL32!_llseek

Y ahora, estamos hechos, ya que el primer jump que aparece es el OEP, ejo, pero que quede claro, la CALL, está en hex, no como CALL 000000 directamente. Y compañeros, el clavo del OEP está resuelto.

Okas RaZa, esto es lo del OEP, y os juro que funciona, ahora, continuamos con lo dificil, esto es el volcado, so, let's go to the next step.

Paso 2. Volcado del Exe.

Hmmm, el volcado del exe, por que hacerlo? bueno, ese es el objetivo, hacer que el programa corra desempacado, y asi poder utilizar el dead listing, o mejor conocido como nuestro programa desensamblado, no se si les pasó, pero cuando, estaba tratando de encontrar el OEP, me pasaba que me phreakeaba, y no encontraba salida, y keria examinar el código en ensamblador (los problemas de de enamorarse del dead listing, ejejeje), pero que pasaba, tratabas de abrir el exe empacado, y se trababa el wdasm, el IDA no sé, y pues eso me ponia peor, entonces, el Volcado del exe se hace para poder tener mas control sobre el mismo.

Bueno, el volcado del exe, se hace directamente de la memoria, por qué? bueno, porque es el unico momento en el que el archivo se encuentra desempacado, recuerdas que para eso era el OEP? bueno, pues si no, que ahora te kede klaro, para eso se usa, y bueno, esto es fácil, para lograrlo utilizaremos el ICEDUMP, existen otras utilidades para la misma tarea, pero kreo ke es mejor utilizar esta, se hace con Icedump y no con Procdump, simple y sencillamente porque estamos desempacando manualmente, ademas, no he visto que el procdump pueda desempacar petite 2.2.

Bueno, antes de lograr el volcado, debemos averiguar otros parametros que nos ayudarán bastante a hacer esta tarea mas fácil, estos parametros son: La ImageBase, y la ImageSize. Si no estoy mal, debereis estar pensando: y como demonios lo consigo, tranquilos, es simple, abres procdump (ya me imagino a alguien diciendo, no que sin procdump pues, y la respuesta es: que en ningun momento dije ke no lo usariamos, dije ke no desempakariamos con él), utilizas la opción PE Editor, seleccionas el archivo ke kieres, en nuestro caso petite.exe, y voila! nos aparece una ventanita con los datos deseados, la ImageBase es de 400000, la mayor parte del tiempo, es 400000, aunke, komo toda regla, tiene su excepción, asi ke, es mejor siempre revisar esto, y apuntamos el Size of Image.

Luego, debemos cargar el Icedump, dependiendo de la versión de SoftIce que uses, ese es el ejecutable que debes correr, así, en mi caso, que yo uso SICE 4.05.334, y ese es el que ejecuto. Al hacer esto, nos aseguramos de haber cargado el ICEDump, y de que podres ser capaces de volcar el exe desempacado en tiempo real de la memoria. Bueno, ahora estamos listos para volcar el exe, esto se logra con el siguiente comando: /Dump [ImageBase] [SizeOfImage] c:\Dumped.exe

Fácil eh? bueno, pues aun faltan algunos datos, y otras cosas, esto van en el siguiente paso.

Paso 3. Arreglo del tamaño de las secciones del Exe.

Bueno, muchos debeis estar preguntandoos como y pa ke diantre hacer esto? cierto? bueno, la respuesta es: que esto se hace porque el tamaño de las secciones ha cambiado al volcar o descargar el exe, esto es a ke el exe empacado es mas pekeño, como acertadamente dijo Dek_Oin, un packer es como aplicarle winzip a un ejecutable, se comprime su tamaño. 

Bueno, al haber volcado el exe, el tamaño de las secciones es el tamaño de las secciones en memoria, es decir estando decompreso (acaso está bien dicho así, o soy un genio y volví a inventar una palabra =P), pero el tamaño ke aparece en el enkabeza PE es el del estado compreso. Para arreglarlo debeis de tener a mano un calculadora y empezar a teclear... Naaa!! son pajas, esto nos lo genera automaticamente PEDITOR de Yoda y MoD.

Esto lo hacemos abriendo el programa, y luego click donde dice browse, seleccionamos la ubicación de petite, luego presionamos el boton de sections, lo cual traerá otra pantalla con todas las secciones del exe, luego hacemos click con el botón derecho del mouse, a cada sección, y seleccionamos la opcioón dumpfixer (Rs=Vs & Ro=Vo), esto con el objeto de que el tamaño en memoria sea el mismo que el tamaño en el disco, esto porque el exe en el disco es una copia del exe ke teniamos en memoria.

Ahora keda korregir, el Entry Point, esto se puede hacer a gusto, tanto en PEditor, como en ProcDump, en PEditor, se hace de la siguiente manera:

1. Abrir el exe (od duh!).
2. en la parte superior izquierda del programa, aparece un cuadro donde dice Entry Point, aquí es donde se debe escribir el OEP, recordando restarle la ImageBase, con lo cual, el EP es de D578, usad una calculadora, sirve cualkiera de las ke vienen kon los korn flakes, ejejeje, o si no, windows trae una, y hexworkshop también.
3. Click en Apply Changes.

Voila! ya lo arreglamos, es tiempo de cerrar el PEditor; hacerlo con el Procdump, es mucho mas fácil.
1. Abrimos el exe.
2. En la parte media de la ventana dice Entry Point, ponemos el D578 allí, 
3. Hacemos click en ok, y listo.

Okas, komo dijo Metamorpher, si el exe empacado, fuera con upx, neolite, etc, ya tendriamos todo hecho, pero aún falta arreglar la IAT, o sea Import Addresses Table, o Tabla de Direcciones de Importación, Next Step.

INTERLUDE: Okas, RaZa, como bien sabrán, hace unos días pase un mail donde decia que el PEditor no funcionaba bajo Win98 SE, bueno, pues despues de buscar mucho durante un par de horas, encontre la respuesta al enigma. Os lo explico a continuación:

Un poco de BackGround: Hace unos días las ratas se comieron 3 mouses de los ke tenia en mi compu en la oficina, por lo kual empecé a utilizar el feature de win98 de KeyMouse, por lo cual ya me acostumbre a utilizar el teclado. Bueno, de aka parte mi descubrimiento. Como sabrán, o mejor dicho, como a muchos les habrá pasado, ke intentaro arreglas las secciones y ni procdump, ni PEditor les funcionó, yo mande un mail a la lista, pero, descubri tambien la solución, me tomo cerca de 2 horas.

La solución, es, hacer click en el area donde van las secciones, y como ninguna tiene nombre, pues (aka viene el poke fue interesante usar el keymouse, ya ke me acostumbre a usar teclas, ademas, fue casi sin kerer ke deskubrí esto), en win98 FE, al hacer click en el area donde podría ir el nombre, lo selecciona, y todo listo, pero el SE, no, asi ke al haber hecho click, empezamos a presionar la flecha hacia abajo, y cuando vemos, se ha seleccionado alguna sección, bueno, magía? nope, pero la verdad, no se poke en FE sale todo el nombre de la seccion, pero en NE, tenemos poco espacio (casi solo el espacio de un caracter) para marcar el nombre de la sección.

Ahora, ya podremos arreglar las secciones.

Paso. 4. Reconstrucción de la IAT

Bueno, estamos a muy poco tiempo de Acabar con la vida de Petite 2.2, Okas, un poco de Info acerca de nuestro enemigo, recuerdas el lema: "Mientras más conozcas de tu enemigo, mas fácil te será vencerle" y ademas "No Knowledge that, is no power". Bueno, a lo que voy es que Petite encripta la IAT del exe original, y luego la va desencriptando en tiempo de ejecución (RunTime) a menida que se hace necesario conseguirlas.

Okas, si recuerdan el titulo, es desempacado semi-manual, ya que no todo lo hacemos manual, uno de los métodos propuestos y un tanto viejos, es usar el hackers view, wdasm o incluso el sice (con el exe volcado) para encontrar la IAT, y se rastreaba hasta encontrar algo al estilo: " JMP PTR [XXXXXXXXX]". Donde como ya sabrán, las X representan una dirección que es puntero, luego ir a ver el offset correspondiente , luego ver donde comienzan y donde terminan (personalmente no lo he practicado).

Bueno, hay programas que hacen muchas cosas por nosotros, y eso nos alimenta la hueva, y bueno, uno de estos programas es el Import Reconstructor. Supuestamente hace lo mismo que el revirgin, pero cuando lo tratamos de usar, sinceramente deja mucho que desear, asi ke lo único ke realmente nos interesa es la opción de buscar IAT. 

Esto se hace seleccionando el archivo del ke keremos averiguar la IAT en la lista ke nos aparece en la parte superior de la ventana, y es alli kuando el proceso comienza, es algo tardadito, por lo ke sería bueno sentarse y esperar, despues de un rato, luego vemos donde dice OEP, allí ingresamos nuestro OEP, luego le damos click al botón IAT AutoSearch, acá aparece un mensaje, en la casilla RVA aparece 00013FFC, lo cual es la RVA de la IAT, donde Dice Size, aparece 0000020C, este es el tamaño de la IAT. Ahora podemos cerrar este progie y checar el Revirgin.

Según lo recomendado por Methamorpher, es buena idea tener cargado el IceDump, ya que tiene la mágica propiedad de corregir algunos problemas de incompatibilidad de la IAT al ejecutar el exe en otro PC que no es en el que lo volcamos. Okas, de aquí en adelante, viene el uso del Revirgin.

Para acoplar el proceso de corrección de la IAT, corremos el archivo que desempacamos, y luego revirgin, buscamos nuestro archivo en la lista que aparece en el lado superior izquierdo de nuestra ventana, bajo el título Procedure, seleccionamos el archivo que queremos, en este caso petite o petgui, parece como que si se estancará, pero esta pensando, y luego nos dice que la IAT está corrupta (o corrompida como diría alguíen mas), le damos aceptar; quitamos el check de Autofix Sections+IT paste, debido a que su funcionamiento deja mucho que desear. En IAT START RVA escribimos lo que nos tiró el Import Reconstructor, el cual es 00013FFC y en el apartado de IAT SIZE idem (o sea, lo mismo), en este caso 0000020C. 

Ahora nos toca presionar el botón IAT Resolver, se queda colgado un rato, y en la tabla que aparece a nuestro lado derecho, y vemos que han aparecido algunas importaciones, parece ser que esto está funcionando, aunke kedan algunos espacios en blanco, por lo que repetimos el procedimiento, esta vez con Resolve Again, y ha conseguido todas las importaciones. Ahora lo que resta, es indicarle al Revirgin, donde diantre queremos que resida nuestro RVA, esto se hace con el fin de generar una IAT correcta, y ya que nosotros lo que vamos a hacer es meter la IAT al final de nuestro archivo, donde dice IAT RVA, escribimos el SIZE of IMAGE, que en el caso de petgui es E1000.

Es en este momento en que generamos la IAT, esto al presionar el metagrandioso IAT Generator, grabamos el archivo como iat.bin, y lo que tenemos en este momento es una Tabla de Importaciones perfecta; antes de cerrar el Revirgin, debemos apuntar el nuevo tamaño de la IAT, el cual reside en (IAT Length), para nuestro pequeño fichero es 000000B8; ahora resta meter la nueva IAT en nuestro archivo, lo cual constituye el siguiente paso.

Paso 5. Incluir la IAT en el fichero.

Damnit, no se como empezar, bueno, dejemoslo en que lo que queda es tomar esta IAT, colocarla en el exe que volcamos con IceDump, luego modificar el encabezado del exe para que sepa ke la IAT ahora queda incluida en E1000. 

Bueno, para comenzar con el último paso de la "Solución Final" (ejeje, me llama la atención esta frase, fue dicha por Herr Adolf Hitler; Por cierto, no soy Nazi, sino me llama la atención estudiar la vida de muchas personas), debemos crear una nueva sección en el ejecutable, que es el lugar donde residira nuestra pequeña maravilla, es decir, la IAT, luego corregir el PE header.

Abrimos Procdump, vamos a su PEeditor y seleccionamos el exe volcado, clickeamos el boton sections, y nos aparece una ventana que contiene los nombres de las secciones, click derecho y seleccionamos Add Section, debemos especificar un nombre de sección, el que querrais, por ejemplo, Meta, IchLiebeKari, GoLeE, GcK, etc, etc, etc. luego se crea la sección, debemos indicar cual será el tamaño de la misma, ahora imagino que mas de alguno estará pensando: "Como demonios saberlo?", la respuesta es simple, ya que es mejor tener espacio de sobra, asignemole 2 kb (sugerencia de Metamorpher), y luego incluimos la IAT, Pregunta lógica #1: Cómo se hace?. Respuesta lógica #1: hacemos click con el botón derecho sobre nuestra nueva sección, escogemos la opción Edit Section, y escribimos (o editamos, como prefieran llamarlo), PSize=2000 ; VSize=2000 ; RVA=000E1000 ; Offset=000E1000. Pregunta lógica #2: Ejo viejo, porque tales numeros?. Respuesta lógica #2: es lo mismo que corregir los valores de las secciones, PSize es el tamaño de la sección en el disco, y VSize su tamaño en memoria, es decir, tamaño físico y tamaño virtual, y ya que nuestro exe fue volcado directamente de la memoria, nuestro tamaño físico == tamaño virtual. Luego, RVA == Offset, porque al hacer el volcado de memoria, los offsets corresponden a los RVAs.

Okas, ya que tenemos hechos todos los cambios de la nueva sección, presionamos OK, y la nueva sección está lista. Nos resta actualizar el SIZE of IMAGE de nuestro archivo, akí viene la Pregunta Lógica #3: Por qué?. y la correspondiente Respuesta Lógica #3: Recuerdan que antes, el SIZE of IMAGE era E1000, bueno, pero como acabamos de agregar una nueva sección, y su tamaño era de 2 kb, se los sumamos, por lo tanto, haremos esto: E1000 + 2000 = E3000, por lo tanto lo actualizamos así, y casi hemos concluido.

Ahora resta indicar en la cabecera que la IAT empieza en E1000, que es el comienzo de nuestra nueva sección, esto lo hacemos nuevamente con el ProcDump, hacemos click en Directory, luego vemos que en el segundo recuadro sale Import Table = 000E01D8, akí es donde indicamos que la IAT yace ahora en 000E1000, también debemos modificar el tamaño de la IAT (recordaís que lo apuntasteis en el paso anterior), ProcDump indica que el tamaño de la IAT sea 000001CA, pero nosotros lo cambiamos a 000000B8 y ya está, por lo tanto, presionamos OK, y OK otra vez, y con esto acaba nuestro trabajo con ProcDump.

Bueno, veamos, lo que queda es pegar la nueva IAT, para esto podemos usar HexWork Shop, HIEW, etc, en HexWork Shop abrimos nuestro archivo volcado, y tambien el IAT.bin que nos generó Revirgin, seleccionamos todos los bytes del IAT.bin, presionamos las bien amadas teclas de copiado (CTRL+C), pasamos al final del Archivo volcado, que supuestamente es el Offset E1000, presionamos las teclas de pegado (CTRL+V), y ya tenemos la IAT en nuestro exe.

Pregunta Lógica #4: Por qué diantre creamos una sección de 2 kb, si la IAT ocupa mucho menos que eso?. Respuesta Lógica #4: esto se debe a ke si la creamos de solo 1 kb, tendremos ke trabajar mas (como diría mi maestra de mate del bach, Por la ley del mínimo esfuerzo), pues tendriamos que reeditar las propiedades de la sección si la IAT okupara mas de 1kb, y apoyando lo dicho por Metamorpher, mejor que sobre y no que falte. 

Según estadisticas de Metamorpher, el 99% de la raza (ojo, raza != de RaZa), en este punto, graba el archivo, y lo ejecuta, pero como nosotros somos RaZa, debemos dejar las cosas a la perfección, o al menos, lo mejor posible, entonces, ya que la sección está declarada con 2 kb, hay que llenar el resto con 0's, y nuevamente, la ley del mínimo esfuerzo se aplica, buscamos un area con muchos 0's, y aplicamos la maravillos combinación: Copy & Paste, hasta llegar al final de la sección, es decir en el offset E3000. si se pasan, deberán borrar los 0's que se pasaron. 

Okas, That's all, terminamos, acabamos, etc, ahora sí, es hora de grabar el archivo, Ejecutamos el archivo, y........

Damnit!!! si corre, si corre!!, ajajaja, pues hemos desempacado semimanualmente un archivo empacado con petite 2.2.

Bueno, esto es con petgui, que es una linda ventanita, pero como diablos desempacar petite.exe, ya que va en la tipica forma de ventanita de DOS que se cierra, Pregunta lógica #5: Si el programa se cierra, como le hago para conseguir la IAT, ya que revirgin necesita que el proceso esté ejecutandose?: el procedimiento es exactamente el mismo, lo diferente es que cuando tengamos el exe volcado en el OEP, despues de usar el metodo para llegar al OEP, cuando estemos en el salto que nos lleva al OEP, justo en ese momento, telceamos una a (una letra a) en la línea de comando del SICE, y damos enter (esto lo que hace es que nos deja ensamblar instrucciones), escribimos "jmp eip" y presionamos enter, luego ESC para salir de esta opción, y Voila! podemos presionar CTRL+D para salir del SICE. Esto evita que el progie se cierra, y esta cargado en memoria, completamente decompreso. Lo que hicimos, fue dejar el programa en un Loop, o bucle, el jmp eip hace que salte a donde apunta el registro IP, que es lo que indica la siguiente instrucción que se debe ejecutar, y conseguimos hacer que el programa entre en un LOOP infinito, y continuará en esas instrucciones permanentemente. Ahora se repite el procedimiento para Petgui.

Esta tecnica es la misma que se usa para el desempacado de Dlls empacadas. 

Despedida:

Buena RaZa, eso es todo por hoy, ya son las 22 horas, y tengo sueño, mis hermanos deben terminar tareas, y mañana es día de universidad, trabajo, etc, lo bueno, es ke hemos culminado con petite.

Saludos a todos, en especial a Metamorpher, mi amigazo Rehostia Karpoff, al profe, a LSW, y a mi bienamada KaRi, suerte y saludos, 

sugerencia, criticas, apoyo, goleeuv@hotamil.com.

 

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