[TUTORIAL] Antidebug: SEH (structured exception handling) y trampa de flag

  • Hola Invitado, hemos creado un grupo de telegram para GamerzHacking Latino, para mas informacion ingresa al siguiente enlace AQUI


220
Me Gusta
77
Temas

c0de

MOV EAX, EDX
Registrado
19 Abr 2020
Temas
77
Mensajes
166
Ubicación
Localhost
Mejores respuestas
0
Aquí hay un pequeño y lindo truco antidebugs que puede ser bueno conocer o que puedes usar en combinación con otros métodos para proteger tus programas.
He visto algunos artículos que mencionan esto, pero no exactamente cómo implementarlo. Intenté configurar el controlador de excepciones en ensamblado puro, que parece ser el método utilizado en varios crackmes, sin que funcione. Afortunadamente, c/c ++ admite SEH y resultó bastante trivial hacer que esto funcione con c ++ en combinación con unas pocas líneas de ensamblaje en línea.

Esta parte del código a continuación es la parte importante. El registro de la bandera no se puede cambiar directamente, pero empujándolo a la pila puede hacer lo que quiera con él y luego volverlo a colocar en el registro. Al xoring con la máscara correcta, puede establecer campos arbitrarios en el registro. Cuando se realiza xoring con 0x100, el indicador de trampa se establece ya que es el octavo bit en el registro del indicador.

C++:
pushfd
xor dword ptr ss : [esp] , 100H
popfd

Bajo la ejecución normal de un programa, se generará una excepción y se llamará al controlador de excepciones si se establece el indicador de captura. Sin embargo, el indicador de trampa es una característica esencial que los depuradores usan para avanzar un paso por cada instrucción. Establecer el indicador de trampa durante la depuración no dará lugar a una llamada a su propio controlador de excepciones porque el depurador ya se ocupa de las excepciones relacionadas con el indicador de trampa.

En el código a continuación, si se está depurando, simplemente se ignorará la configuración del indicador de captura y se procederá a la ejecución, aquí visualizado mediante la llamada (MessageBoxA (NULL, "debugger is present", "", MB_OK)). Sin embargo, cuando el programa no se esté depurando, se llamará a su controlador de excepciones.

C++:
#include <Windows.h>

/*
Custom epilogue code that overrides the epilogue of the try/finally statements. It prevents the _finally from
being executed after the __try block because the function returns directly to main/winmain instead. It's also responsible
for returning back to main/winmain after execution of the _finally block, without it I get stack corruption and app chrash.

You may ask why I don't just use an _except block instead of dealing with all this, the answer is simply that I didn't get it
to work correctly.
*/
#define EPILOGUE __asm    \
{                         \
   __asm pop edi          \
   __asm pop esi          \
   __asm pop ebx          \
   __asm mov esp, ebp     \
   __asm pop ebp          \
   __asm ret              \
}

void antidebug()
{
    __try
    {
        __asm
        {
            pushfd
            xor dword ptr ss : [esp] , 100H
            popfd
        }

        MessageBoxA(NULL, "debugger is present", "", MB_OK);
        EPILOGUE
    }

    __finally
    {
        MessageBoxA(NULL, "no debugger here", "", MB_OK);
        EPILOGUE
    }
}

int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow)
{
    antidebug();
    MessageBoxA(NULL, "Why do you think I've crashed btw.? I'm running just fine.", "win7 sp1", MB_OK);
}

Este truco por sí solo no es difícil de eliminar, pero en combinación con otros métodos puede hacer que los programas sean más difíciles de revertir. Si alguna vez ve la instrucción "popfd" en un programa que está tratando de revertir, debe tener esto en mente. Hay muchas posibilidades de que lo que el desensamblador muestra que estás ejecutando no sea realmente cierto.

Tengo una pregunta sobre Win7 SP1 por cierto. Este código funciona perfecto en Win10, pero Win7 cree que mi programa se ha bloqueado aunque no lo haya sido. ¿Alguien sabe si algo está mal con SEH en Win7? Cuando ejecuto el programa, aparece un mensaje emergente, pero después de hacer clic en "cerrar el programa", mis cuadros de mensaje aparecen correctamente. Pensé que "cerrar el programa" debería cerrar el programa y no permitirme ejecutar ningún código arbitrario que deseo después de esto.

1588800335337.png

Creditos
Beizer