Anti-Debugging Lab Part I - Writeup
January 2025 (396 Words, 3 Minutes)
Autor: 0xH3rshel
Introducción
En este post voy a resolver la Parte 1 del laboratorio Anti-Debugging del libro X86 Software Reverse Engineering: Cracking and Counter-Measures.
El objetivo principal es eliminar la ventana que se abre al iniciar el programa para poder acceder directamente al juego Pong. El programa usa técnicas Anti-Tampering por lo que habrá que eliminar estas también.
Recordar que este y el resto de laboratorios los podéis encontrar en el repositorio de GITHUB.
Lab Part I Pong
Al iniciar el juego, aparece una ventana emergente que interrumpe el flujo. Este es el nag screen que debemos eliminar.
Si seleccionamos la opción “No” en la ventana emergente, el juego se inicia.
Eliminación del Nag
Reinicio el programa, esta vez utilizando la herramienta x32dbg, y realizo una búsqueda de String References con el objetivo de localizar el código responsable de la creación de la ventana emergente.
Las cadenas de texto utilizadas por el nag screen se identifican rápidamente en los resultados de la búsqueda.
Al navegar hacia la dirección del programa donde se hace referencia a estas cadenas, observo una llamada a la función MessageBox. Esto confirma que voy por buen camino.
Suposición
Por el texto de la ventana emergente, supongo que el programa primero realiza una comprobación para determinar si el usuario está previamente registrado. En caso de no estarlo, se muestra la ventana.
El código podría representarse de la siguiente manera:
if (!isUserRegistered) {
displayMessageBox();
}
Teniendo identificada la función encargada de mostrar la ventana, procedo a buscar referencias a las llamadas realizadas a esta función.
Y encuentro una llamada a esta función.
Tal y como era de esperar, justo antes de esta llamada, el programa realiza una comprobación mediante la intrucción cmp.
Para eliminar la ventana emergente, basta con sustituir la instrucción jnz por jmp, de forma que se realice un salto incondicional. Esto asegura que el código del nag screen no se ejecute bajo ninguna circunstancia.
Anti-Tampering
Una vez realizada la modificación en el código, aplico el parche, recargo el programa y…
…aparece un error.
Esto ocurre porque el programa implementa una comprobación anti-manipulación (Anti-Tampering) que detecta modificaciones en su código.
Al revisar nuevamente las referencias a cadenas, observo algunas que llaman la atención:
Al desplazarme a estas direcciones, noto que también realizan llamadas a la función MessageBox y, posteriormente, a Exit:
Además durante la ejecución del programa, estas cadenas son decodificadas y muestran el texto Anti-Tampering que se veía en la ventana emergente de error.
El siguiente paso es analizar el código y realizar modificaciones para evitar que, independientemente de si se detecta un error, se ejecute la ventana emergente o se cierre el programa. Para lograrlo, basta con modificar dos saltos:
Aunque a primera vista parezcan el mismo fragmento de código, se trata de dos operaciones distintas:
Finalmente, tras realizar las modificaciones necesarias, guardo los parches, ejecuto el programa nuevamente y verifico que todo funciona correctamente, sin mostrar ninguna ventana emergente.
Con esto estaría resuelta la primera parte del laboratorio Anti-Debugging.