Me gusta tratar con hooks y todas estas cosas, pero requieren un nivel minimo de asm, por lo menos conocer como funciona.
Luego existen muchos metodos para hookear entre ellos:
DLL Hooking: el mas sencillo, se trata de sustituir una dll (normalmente del sistema) por otra nueva y que todas sus funciones apuntan a la dll original, pero se pueden realizar cambios en los argumentos y retorno de las funciones. Es el mejor para operaciones que realiza winapi o para programas basados en direct3d. Nivel noob requerido
VirtualProtect: este metodo usa la funcion VirtualProtect de windows para desproteger una zona de la memoria donde se almacenan las direcciones donde estan las funciones, y las redireccionas hacia una funcion que tu hayas creado. Nivel informatica de universidad requerido
Detours: Es basicamente lo anterior, pero llevado a un nivel infernal en el que el asm pro es necesario, permite ademas de hookear funciones, parametros en la memoria, y un sin fin de cosas que dan para mucho rato. Nivel dios requerido.
Voy a hacer un pequeño tutorial de dll hooking y lo publicare en un rato.
Entre tanto, os dejo por aqui las funciones que suelo utilizar para hookear mediante VirtualProtect
static long long redirectBackup;
void Redirect(void* source, void* destination)
{
DWORD dwOld;
VirtualProtect(source, 5, PAGE_EXECUTE_READWRITE, &dwOld);
redirectBackup = *(long long*)source;
*((unsigned char*)source) = 0xE9;
*(DWORD*)(((char*)source) + 1) = (DWORD)((DWORD)destination - (DWORD)source) - 5;
}
void Restore(void* source)
{
*(long long*)source = redirectBackup;
}
ejemplo de uso para CreateFileA
void* CreateFileAAddr = NULL;
CreateFileAAddr = GetProcAddress(GetModuleHandle("kernel32.dll"), "CreateFileA");
Redirect(CreateFileAAddr, CreateFileAHooked);
y por supuesto la funcion CreateFileAHooked:
HANDLE WINAPI CreateFileAHooked(
_In_ LPCTSTR lpFileName,
_In_ DWORD dwDesiredAccess,
_In_ DWORD dwShareMode,
_In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
_In_ DWORD dwCreationDisposition,
_In_ DWORD dwFlagsAndAttributes,
_In_opt_ HANDLE hTemplateFile
)
{
//DO SOMETHING WITH ARGUMENTS
Restore(CreateFileAAddr); //RESTAURAMOS A LA FUNCION ORIGINAL
hFile = CreateFileA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile); //EJECUTAMOS FUNCION ORIGINAL
Redirect(CreateFileAAddr, CreateFileAHooked); //VOLVEMOS A HOOKEAR, PARA LA PROXIMA
//DO SOMETHING WITH RETURN VALUE
return hFile;
}
Obviamente para ejecutar este codigo, ya tienes que tener acceso mediante alguna dll inyectada, este metodo es bueno porque inyectando una dll comun, como user32.dll puedes acceder a todas las otras dll cargadas.
La cosa se va complicando cuando las funciones no estan exportadas en la dll, o se quiere hookear una funcion interna en un exe, a partir de ahi se va complicando, y segun los niveles de ingenieria inversa que apliques podras o no conseguir reemplazar una funcion determinada.
En un rato esta el tutorial.