Análisis packer 01 - Parte IX

Tamaño de letra:

Novena y última parte: últimos errores curiosos

Como puedes observar, el packer es complejo y llegar hasta aquí ha requerido mucho trabajo y tiempo. Después de arreglar todo, nuestro dumpeado sigue sin ir y esta vez nos muestra otro error al intentar leer una dirección de memoria inaccesible. Sin embargo, no es como en el tutorial anterior en el que se trata de código que ofusca el packer. Para que OllyDBG se detenga en la excepción, lo configuro en Debugging Options -> Exceptions y destildo las excepciones. En este caso el error que nos muestra es el siguiente:

Error ollydbg al leer dirección

¿Por qué se produce ese error? Pues se lo pregunto a la pila. Examino los retornos y después examino el código con el programa protegido y veo que en este último no hay ninguna excepción. Tengo que volver a examinar traceando con F7 y me encuentro con un código curioso que estoy casi convencido que no lo ha puesto ahí el compilador:

OllyDBG - código de error

En el packer siempre salta, pero en el dumpeado no. El dumpeado ha descubierto que hemos modificado al programa, es una protección sencilla CRC. Bueno, esto tiene muy fácil solución, podemos modificar el je por un jmp.

 

El desempacado final

Después del largo camino y después de desofuscar y analizar código, por fin el dumpeado funciona por primera vez. Al desempacar se ha quitado también la limitación de uso y el programa se ejecuta con normalidad. Aún así saltan todavía bastantes excepciones que voy corrigiendo (no merecen que escriba más artículos por la sencillez) y esto es porque seguramente el autor ha usado las SDK del packer.

Finalmente, el dumpeado (POR FIN) funciona perfectamente y aparece la interfaz (la he modificado un poco con Gimp evitando la original):

Programa desempacado y funcionando

Al cerrarlo salta igualmente otra excepción pero que tiene también muy fácil solución.

Como conclusión de estas nueve partes destaco lo siguiente:

  • El packer es difícil pero no por la complejidad sino porque modifica tantas cosas y tanto código que se hace muy pesado.
  • Como has podido observar tal vez he sido "demasiado perfeccionista" y en vez de desofuscar el código y entender la máquina virtual, podría haberla copiado tal cual en otra sección. Es cierto, pero como esa forma de trabajar ya la visto varias veces, quería probar y realmente ha sido un trabajo desbordante, repito, no por la dificultad sino porque hay que trabajar mucho y hacer muchas pruebas. Como dije en una de las partes, el plugin Code Doctor falló al desofuscar cierto código y me pegué más de una semana en encontrar el fallo; yo pensaba que era una protección del packer y fue un error del plugin... recuerdo ese momento porque al cabo de 5 días de análisis y depurar y volver a depurar casi tiro la toalla.
  • Mucha información que me ha servido de ayuda la he obtenido de cientos de tutoriales de mi lista preferida y de autores a los que felicito: lista CrackSLatinoS.
  • Lo único que me deja con duda es la parte VI en la que se ejecutó código antes de OEP. La verdad que es curioso y posiblemente los autores hayan estudiado concienzudamente la INIT TABLE del compilador Borland.
Última actualización: Miércoles, 31 Agosto 2011
Comentarios  
+1 # deurus 25-09-2014 17:17
Muy bueno Karmany. Una lectura recomendada.
Responder | Responder con una citación | Citar
0 # karmany 26-09-2014 01:15
Un saludo y gracias por comentar... ;-)
Responder | Responder con una citación | Citar
Escribir un comentario
Antes de publicar un comentario, usted debe aceptar nuestras condiciones de uso: Condiciones de uso. Debido al spam, todos los comentarios serán moderados. Normalmente se responde en unos minutos, refresca los comentarios para comprobarlo.



 
Visitas: 8492823