Contenido principal

IsDebuggerPresent y CrackMy.exe

Septiembre 17, 2008

El siguiente programa de prueba fue publicado en una página de juackers. Nuestra misión será averiguar la clave de cualquier usuario generado por el programa.

Especificaciones
Nombre del programa: CrackMy.exe
Autor: Freeze
Compilador: Visual Basic 6.0 Código Nativo
Rutinas antidebugger detectadas: IsDebuggerPresent y OutputDebugStringA
Nivel: Diría que básico (No tiene ninguna complicación)

Para detectar el compilador use el RDG packer detector v0.6.5
Para detectar las posibles rutinas antidebugger use el Visual Basic decompiler pro 5, observando las APIs utilizadas por el programa, entre ellas sólo estaban estas:

'VA: 401D50
Private Declare Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)
'VA: 401D04
Private Declare Sub IsDebuggerPresent Lib "kernel32"()


A modo de resumen, si tenemos el siguiente código en Visual Basic

Private Declare Function IsDebuggerPresent Lib "kernel32" () As Long
Private Sub Form_Load()
    If IsDebuggerPresent Then MsgBox "Estoy siendo depurado"
End Sub

Y ejecutamos el programa generado por dicho código, nos sale el formulario como si no hubiera pasado nada (Sin el mensaje de que está siendo depurado)

Al contrario, si cargamos el ejecutable con Ollydbg, y luego lo ejecutamos con F9, nos aparece este mensaje

Al cargar cualquier programa, en una parte de la memoria se guarda un byte que indica si el programa está siendo depurado o no. Para ubicar este byte con Ollydbg, primero cargamos nuestro ejecutable y sin ejecutarlo (En el punto de entrada), ubicamos el registro EBX que se encuentra en la parte derecha del Ollydbg, damos click derecho sobre él y luego "Follow in dump", tal cual lo muestra la siguiente imagen.

Ahora en el dumpeado, podemos encontrar entre los cuatro primeros bytes el uno que estamos buscando. Si lo ponemos en cero y ejecutamos el programa, no mostrará el mensaje de que está siendo depurado

Si queremos hacer un script para Ollyscript, copiamos el siguiente código

var tmp
IsDebbugerPresent:
mov tmp,ebx       //Al inicia, copiamos EBX a tmp
add tmp,2         //A tmp le sumamos dos bytes que es donde se encuentra nuestro uno
mov [tmp],0       //La dirección en memoria que se encuentra en EBX+2 la ponemos a cero

Y con esto evitamos que en un futuro, esta API nos finalice el programa o haga otra cosa indeseada.

También hay otra forma de evitar la API, y es yendo directamente a donde es llamada, y evitar el salto que verifica que estamos o no estamos depurando.
Así que en el commandbar copiamos

bp IsDebuggerPresent

Cuando ejecutamos, Ollydbg para en la dirección 7C813093 en el momento en que es llamado IsDebuggerPresent

Nos vamos devolviendo a través de los retornos, hasta que luego de unos cincuenta retornos (A visual le gusta mucho llamar otras librerías xD), llegamos a la parte interesante

Así que el salto condicional

00401A12   . /74 68         JE SHORT debugger.00401A7C

Lo vamos a cambiar por un salto incondicional

00401A12     /EB 68         JMP SHORT debugger.00401A7C

Y así hemos evitado el IsDebuggerPresent.

Para aplicarle ingeniería inversa al archivo CrackMy.exe, seguimos los siguientes paso:
1. Cargamos el programa en Ollydbg, y en el commandbar escribimos las siguientes líneas

bp IsDebuggerPresent
bp OutputDebugStringA

Damos F9 para que ejecute y pare en alguna API que hemos encontrado en el VB Decompiler Pro, pero el programa se ejecuta normalmente. Así que esto de las APIs fue solo una falsa alarma.

Entonces con el programa ya cargado, ponemos un punto de depuración en la función __vbaStrCmp, que es propia de visual basic para comparar datos.

bp __vbaStrCmp

Insertamos cualquier nombre de usuario, en este caso "sinfocol" y cualquier contraseña "AAAABBBB"
Damos al botón "Probar", y para en __vbaStrCmp. Si vemos en el stack, está comparando "sinfocol" con algo, pero como no es la clave, entonces volvemos a ejecutar y posiblemente se detenga en las dos cadenas que queremos comparar ("AAAABBBB" y la clave original).

Y como es de esperarse, la función __vbaStrCmp, fue llamada con dos parámetros, el primero de ellos "AAAABBBB", y el segundo de ellos una cadena bastante rara "J4E1F.F7".

Seguimos la ejecución del programa y nos muestra un cartelito que nos dice que vamos mal

Ahora en vez de la clave que habíamos puesto al principio "AAAABBBB", ponemos la nueva clave "J4E1F.F7", y le damos de nuevo en probar.
Primero compara la cadena "sinfocol" con otro dato, y después llega a la comparación de "J4E1F.F7" con "J4E1F.F7", como las cadenas son iguales, hemos pasado la validación. Y listo, nos sale un cartelito diciendonos que lo hicimos bien.

La otra forma de lograr lo que queremos, es buscando el salto condicional. Así que nos devolvemos a través del último __vbaStrCmp, hasta llegar a

Cambiando el salto condicional de

00402238   . /0F84 EB000000 JE CrackMy.00402329

A

00402238     /0F85 EB000000 JNZ CrackMy.00402329

Podemos ingresar cualquier clave, y ésta estará buena; La única clave que no funcionará será la clave original

Tanto el primer ejecutable que contiene la API IsDebuggerPresent, como el "CrackMy.exe", pueden ser descargados en este archivo comprimido.

La clave del comprimido es

www.sinfocol.org

Archivado en: Ingeniería Inversa, Programación, Seguridad |

2 comentarios

  1. FAMAX Julio 1, 2009 @ 10:49 pm

    BUENO AMIGO COMIENZO EN ESTE MUNDO DE LA INGENIERIA INVERSA (ESPERO Y NO ME CORTES) BUENO LA PREGUNTA ES QUE ESTOY MANEJANDO EL OLLY PERO QUIERO ENCONTRAR EL SERIAL A UN PROGRAMA NADA MAS QUE NO SE COMO SABER CON QUE SOFTWARE PUEDO SABER COMO ESTA COMPRIMIDO O CUAL ES SU PROTECCION ESPERO Y ME AYUDES AAHH TAMBIEN ESTUVO MUY BUENA ESTA EXPLICACION APRENDI ALGO NUEVO BYE Y GRACIAS

  2. Sysroot Julio 1, 2009 @ 11:09 pm

    Buenas Famax, sería incapáz de 'cortar' a alguién que tiene ganas de aprender, el mejor programa que yo he usado (Esta opinión es personal), se llama RDG Packer Detector, lo puedes encontrar en esta web: http://www.rdgsoft.8k.com/
    No solo te ayuda a identificar que lenguaje de programación es usado para compilar el programa, o qué programa lo protege, sino que tiene otras utilidades como análisis en busca de algoritmos criptográficos, entropía del archivo, detector del Original Entry Point (OEP), cargador de plugins, entre otras características que puedes encontrar allí.

Deja un comentario