Análisis packer 01 - Parte IX
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:
¿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:
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):
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.