lunes, 1 de julio de 2013

Reversin: función IsDebuggerPresent

Bueno, esta función nos permite conocer si nuestra aplicación está siendo depurada o ejecutada aunque se suele usar para impedir la depuración de aplicaciones como veréis no es una solución muy efectiva ya que es bastante simple saltarse esta restricción. En este post explicare como se puede saltar dicha validación.
Vale para comenzar voy a crear una  pequeña aplicación en C++ que utilice esa función para impedir la depuración de nuestro ejecutable.

Este es el código de mi aplicación:

#include <cstdlib>
#include <iostream>
#include <windows.h>

using namespace std;

int main(int argc, char *argv[])
{
    bool depuradorActivo;
   
    depuradorActivo = IsDebuggerPresent();
   
    if(depuradorActivo)
    {
       printf("Depurando...\n\n");
    }
    else
    {
       printf("Ejecutando...\n\n");
    }

    system("PAUSE");
    return EXIT_SUCCESS;
}



Como vemos si lo probamos a ejecutar normalmente nos aparece el siguiente mensaje.


En cambio sí lo intentamos depurar mediante un programa de depuración, en este ejemplo he utilizado el OllyDbg nos aparecerá este otro mensaje.


Ahora para saltarnos esta restricción  lo que aremos será abrir el ejecutable con el depurador OllyDbg. Buscaremos la línea de código donde se encuentra la llamada a la función “IsDebuggerPresent()”  y pondremos un punto de ruptura justo hay.


Si miramos el EIP vemos que efectiva mente está apuntando a dicha función.


A continuación avanzaremos hasta la siguiente línea después de ejecutar esta función en el programa principal para ello podremos  ir a 'Debug'  y en  'Execute till user code' o pulsamos ALT+F9.


Como vemos la siguiente orden que se va ejecutar es:

TEST EAX, EAX

Lo que hará que se compare el valor que existe en EAX con EAX el resultado de dicha operación tendrá efecto sobre el registro “Z”. Esta comparación hará que registro “Z” acabe valiendo cero. Por los que se está dando a entender que se cumple la condición.

Ahora lo que podemos hacer es modificar el registro “Z” y cambiarlo por “1”. Esto lo aremos haciendo doble clic sobre el registro “Z”.


Para terminar continuamos con la ejecución del programa pero esta vez el mensaje que nos aparecerá es distinto.




No hay comentarios:

Publicar un comentario