VEH Api Hook

Iniciado por bizco, 24 Marzo 2010, 15:10 PM

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

bizco

El concepto de todo esto ya lo conocia pero por thread y gracias a Guy de GD conoci esta alternativa que trabaja de forma global en todo el proceso. El concepto base es generar una excepcion cada vez que se llama a la funcion o zona de codigo que nos interesa redireccionar, para eso pondremos PAGE_NOACCESS en la direccion:


api=(DWORD*)GetProcAddress(GetModuleHandle("user32.dll"),"MessageBoxA");
AddVectoredExceptionHandler(1,Redirector);
VirtualProtect(api,1,PAGE_NOACCESS,&oProt);


en AddVectoredExceptionHandler pondremos el primer parametro a 1 para que de todos los manejadores nos llame a nosotros primero, el segundo parametro es la funcion que controlara las excepciones.


LONG __stdcall Redirector(PEXCEPTION_POINTERS ep)
{
if (ep->ExceptionRecord->ExceptionCode==EXCEPTION_ACCESS_VIOLATION)
{
  if (ep->ContextRecord->Eip==(DWORD)api)
  {
   VirtualProtect(api,1,PAGE_EXECUTE,&oProt);
   ep->ContextRecord->Eip=(DWORD)_MsgBox;
   return EXCEPTION_CONTINUE_EXECUTION;
  }
}
return EXCEPTION_CONTINUE_SEARCH;
}


en esta funcion solo controlaremos 1 excepcion, si no es esta o la direccion no es la que nosotros esperamos pasaremos el control al siguiente manejador de excepciones (EXCEPTION_CONTINUE_SEARCH). en caso de ser la direccion que queremos hookear, damos permisos de ejecucion a la zona y la EIP apuntando a  nuestra funcion que seria algo asi:


UINT __stdcall _MsgBox(HWND h,char *Texto,char *Titulo,UINT Tipo)
{
UINT r=0;
r=MessageBox(h,"Mensaje manipulado","titulo",Tipo);
VirtualProtect(api,1,PAGE_NOACCESS,&oProt);
return r;
}


Las posibilidades no son pocas, es facil de implementar y no hay que modificar ni 1 solo byte del codigo original asi que las detecciones por opcodes o crc no serian efectivas. no solo podemos hookear si no implementar formas de evadir software "anti malware".

Se que no es nada nuevo, pero como no vi nada en el foro que hablase sobre esto pues lo dejo para el que le pueda interesar.



Jaixon Jax

  Muy Buen Post Thanks  :D

[Zero]

Está bueno el post, no conocía éste modo de hacer hook, está original  :).

Saludos

"El Hombre, en su orgullo, creó a Dios a su imagen y semejanza.”
Nietzsche

Karcrack

Intente hace un tiempo usar este tipo de Hook.... sin exito :-\

Cuando llegue a casa reviso y juego un poquito con el tema ;)

Muy bueno :D

Hendrix

"Todos los días perdemos una docena de genios en el anonimato. Y se van. Y nadie sabe de ellos, de su historia, de su peripecia, de lo que han hecho, de sus angustias, de sus alegrías. Pero al menos una docena de genios se van todos los días sin que sepamos de ellos". - Juan Antonio Cebrián

Karcrack

He estado probando en casita, y bueno :P He conseguido que vaya, por cierto hay un parametro muy interesante de VirtualProtectEx llamado hProcess :silbar: :silbar: :xD

No he conseguido aun hacerlo funcionar en VB, que raro no? :laugh:

Zzombi

me funciono perfecto  :)
gracias por compartirlo ctlon  :D

bizco

CitarIntente hace un tiempo usar este tipo de Hook.... sin exito :-\

Usarias SEH que es por thread y por eso no te funcionaria, VEH es por proceso.

Karman

Hay un pequeño detalle sobre el uso del veh hook (o esta forma de usarlo), y es que cuando llaman a VirtualProtect no están cambiando el acceso a X bytes de memoria, sino a las páginas donde se encuentran esos X bytes, dicho de otra forma:

Citarpag1   -    pag2
[...     XX][XX     ...]

estarían no solo cambiando los permisos de los bytes XXXX sinó de las dos páginas (cada página suele tener 512 bytes), por lo que podría pasar que al ejecutarse alguna parte de algunas de las páginas externas a los bytes que uno quiere proteger también se provoque una excepción.

S2

PD: se que el post es viejo pero creo que merece aclararse eso :P

pipaman

Si no te gusta el C++ lo mejor que podes usar es algún framework que te resuelva la parte de bajo nivel. Te recomiendo uno muy estable y potente. Con 10 lineas de codigo armas un hook:
http://www.nektra.com/products/deviare-api-hook-windows/

Saludos a todos!