PDA

Ver la Versión Completa : Pasar este mini-codigo a C++Builder


aguml
23-06-2014, 14:50:33
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:

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 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa813706%28v=vs.85%29.aspx).BeingDebugged. Lee esto (http://www.symantec.com/connect/articles/windows-anti-debug-reference) y esto otro (http://www.maxsecureantivirus.com/blog/blog01.htm).

Saludos.

escafandra
24-06-2014, 00:37:02
Te explico el código asm que expones:


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
¿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
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:

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
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.