home..

Anti-Debugging Lab Part I - Writeup

rev asm x32dbg patching

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.

img

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.

img

Si seleccionamos la opción “No” en la ventana emergente, el juego se inicia.

img

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.

img

Las cadenas de texto utilizadas por el nag screen se identifican rápidamente en los resultados de la búsqueda.

img

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.

img

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.

img

Y encuentro una llamada a esta función.

img

Tal y como era de esperar, justo antes de esta llamada, el programa realiza una comprobación mediante la intrucción cmp.

img

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…

img

…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:

img

Al desplazarme a estas direcciones, noto que también realizan llamadas a la función MessageBox y, posteriormente, a Exit:

img

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.

img

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:

img

Aunque a primera vista parezcan el mismo fragmento de código, se trata de dos operaciones distintas:

img

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.

Theme  Moonwalk