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?
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.
Te acabo de leer ahora.
Es muy interesante, cuando lo tengas postéalo si no te importa.
Muchas gracias.
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 😬