Saltarse truco antidebug de Windows 10

Iniciado por aguml, 30 Mayo 2020, 12:14 PM

0 Miembros y 1 Visitante están viendo este tema.

aguml

Hola amigos, uno de los trucos que quiero implementarlo en mi clase para crear loader debuggers es saltarse la protección antidebugger para Windows 10 basada en RaiseException para provocar evento OutputDebugEvent. Lo que hace es que si no hay debugger no se envía el mensaje y da una excepción que la aplicación controla y si hay debugger no se produce excepción y por ahí nos pilla. Os pongo un código de ejemplo:
void __stdcall _OutputDebugStringW(LPCWSTR lpOutputString)
{
        char outputDebugStringBuffer[1000] = {0};
        WideCharToMultiByte(CP_ACP, 0, lpOutputString, -1, outputDebugStringBuffer, sizeof(outputDebugStringBuffer), 0, 0);

        ULONG_PTR args[4];

        //unicode
        args[0] = (ULONG_PTR)wcslen(lpOutputString) + 1;
        args[1] = (ULONG_PTR)lpOutputString;

        //ansi for compatibility
        args[2] = (ULONG_PTR)wcslen(lpOutputString) + 1;
        args[3] = (ULONG_PTR)outputDebugStringBuffer;

        __try
        {
                RaiseException(0x4001000A, 0, 4, args);//DBG_PRINTEXCEPTION_WIDE_C
                ShowMessageBox("DBG_PRINTEXCEPTION_WIDE_C -> Debugger detected");
        }
        __except(EXCEPTION_EXECUTE_HANDLER)
        {
                ShowMessageBox("DBG_PRINTEXCEPTION_WIDE_C -> Debugger NOT detected");
        }
}

La cosa es ¿Como puedo implementar un truco para saltarse esa protección? Se me ocurrió poner un bp en esa api y estando en ese bp devolverle EXCEPTION_EXECUTE_HANDLER ¿Alguna sugerencia?

aguml

Creo que he conseguido solucionarlo. Cuando lo confirme mañana lo explico. Me ayudaron en el grupo de Telegram de x64dbg donde me orientaron por dónde debía entrarle.

karmany

Te acabo de leer ahora.
Es muy interesante, cuando lo tengas postéalo si no te importa.
Muchas gracias.

aguml

Pues si lo solucioné. La cosa es que yo me mareaba intentando atacar a la función RaiseException que es la que usan para el truco antidebug y que lo usan para enviar un mensaje al debugger. Si hay debugger no da ninguna excepción porque el debugger la gestiona y por ahí es por dónde te pilla ya que precisamente el chico bueno lo tiene en un seh. La cosa es que no hay que hacer nada a RaiseException, simplemente puse un condicional en donde gestiono OutputDebugString y si tengo activado el truco para evitar ese antidebug devuelvo DBG_EXCEPTION_NOT_HANDLED y listo, ya con eso ni se entera y entra en su manejador y ya no me pilla 😬