Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Pasar este mini-codigo a C++Builder (https://www.clubdelphi.com/foros/showthread.php?t=86152)

aguml 23-06-2014 14:50:33

Pasar este mini-codigo a C++Builder
 
Bueno pues sigo con el tema de los antidebuggings y ahora estoy liado con el que creo será el ultimo que mire. Se trata de este:

Código:

xor eax, eax
push offset @being_debugged
push dword fs:[eax]
mov fs:[eax], esp
//any illegal value will do
//must be dword-aligned
//on Windows Vista and later
push esp
call CloseHandle

Se supone que si le pasamos un handle invalido nos devolverá la excepcion 0xC0000008 y con eso podriamos saber si estamos siendo depurados o no ya que si estamos siendo depurado el depurador gestionará el evento STATUS_INVALID_HANDLE y es lo que quiero hacer, detectar al debugger usando ese truco pero todo lo que encuentro está en ensamblador y no me entero. ¿como podria hacer eso en C++builder?

aguml 23-06-2014 22:00:17

lo que quiero es que cuando de esa excepcion poder mostrar que el debugger está presente. He probado a poner e ClosHandle con un __try ... Catch(...), catch(Exception &e), catch(ERROR_INVALID_HANDLE) y no funciona nada. El ejecutable sale de la funcion justo despues de la excepcion. ¿Como puedo hacer para controlar esa excepcion y mostrar un mensaje que diga si esta o no siendo depurado?

escafandra 24-06-2014 00:07:42

Ese fragmento de código suelto no dice mucho, quizás se refiere al PEB.BeingDebugged. Lee esto y esto otro.

Saludos.

escafandra 24-06-2014 00:37:02

Te explico el código asm que expones:

Código:

xor eax, eax                // Ponemos en eax un 0
push offset @being_debugged  // Apilamos la rutina manejadora de excepciones
push dword fs:[eax]          // y añadimos esa rutina
mov fs:[eax], esp            // al manejador de excepciones
push esp                    // Pasamos como parámetro a CloseHandle un valor cualquiera inválido
call CloseHandle            // Tratamos de cerrar el Handle que hemos pasado

Ahora tienes que implementar tu rutina begin_Debugged que si se llega a ella, es que estamos siendo debuggeados.


Saludos.

aguml 24-06-2014 07:21:03

¿y como hago eso en c++?

Casimiro Notevi 24-06-2014 08:10:32

Cita:

Empezado por aguml (Mensaje 478262)
¿y como hago eso en c++?

Si mal no recuerdo, puedes incrustar código asm en c++

aguml 24-06-2014 13:29:49

eso tiene dos peros, el primero que tal y como está no compila si lo encapsulas. El segundo, segun me comentaron, no se podria hacer para programas de x64. Seguro que se puede hacer usando c++.

Casimiro Notevi 24-06-2014 13:41:34

Cita:

Empezado por aguml (Mensaje 478269)
Seguro que se puede hacer usando c++.

Por supuesto que sí.

aguml 24-06-2014 15:42:04

me han dicho que pruebe algo como esto:
Código:

HANDLE pAux;
  __try [throw CloseHandle(pAux);]
  catch[EXCEPTION_INVALID_HANDLE)
[...]

Lo siento por no poder poner las cosas con saltos de linea pero este mobil no me lo permite.

escafandra 24-06-2014 20:15:47

Código:

  HANDLE pAux;
  __try{
    CloseHandle(pAux);
  }
  __except(EXCEPTION_EXECUTE_HANDLER){
    Beep(100, 100);
  }


Saludos.

aguml 24-06-2014 21:09:12

Muchas gracias amigo, ya lo habia conseguido hacer con asm pero esto me gusta mas asi que lo he puesto asi y queda fantastico jejeje.


La franja horaria es GMT +2. Ahora son las 15:01:17.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi