Código:
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.
Código:
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:
Código:
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.