/!\ Ce code n'est pas à C/C, vous devez avoir des bases en C++, ainsi qu'en detours et asm pour le modifier à votre goût /!\
Pourquoi utiliser l'API hooking ?
--> L'API hooking est généralement utilisé pour contourner une fonction, et la remplacer par une autre, celle-ci est utilisé généralement dans le GameHacking pour contourner les fonctions d'un Anti-cheat
Comment procéder à un API hooking ?
--> Tout d'abord, on prend l'address des fonctions qu'on souhaite contourner, puis on fait un redirection ou un saut vers notre propre fonction, ou la fonction désirée.
Dans ce tuto, on va hook la fonction MessageBox se trouvant dans user32.dll
Tout d'abord la fonction Main
Voici notre fonction :
On garde la fonction initiale :
On remet les premiers bytes
/!\ Ce code n'est pas à C/C, vous devez avoir des bases en C++, ainsi qu'en detours pour le modifier à votre goût /!\
Pourquoi utiliser l'API hooking ?
--> L'API hooking est généralement utilisé pour contourner une fonction, et la remplacer par une autre, celle-ci est utilisé généralement dans le GameHacking pour contourner les fonctions d'un Anti-cheat
Comment procéder à un API hooking ?
--> Tout d'abord, on prend l'address des fonctions qu'on souhaite contourner, puis on fait un redirection ou un saut vers notre propre fonction, ou la fonction désirée.
Dans ce tuto, on va hook la fonction MessageBox se trouvant dans user32.dll
Tout d'abord la fonction Main
PHP:
#include <windows.h>
#include <stdio.h>
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup);
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup);
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
BYTE hook[6];
void WinMainCRTStartup()
{
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
MessageBox(0, "tutoriel", "", MB_OK);
}
Voici notre fonction :
PHP:
int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType)
{
UnHookFunction("user32.dll", "MessageBoxA", hook);
char msg[strlen(lpText)];
sprintf(msg, "hooked!!nn%s", lpText);
int x = MessageBox(hWnd, msg, lpCaption, uType);
HookFunction("user32.dll", "MessageBoxA", MyMessageBoxA, hook);
return x;
}
On garde la fonction initiale :
PHP:
DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
BYTE jmp[6] = { 0xe9, //jmp
0x00, 0x00, 0x00, 0x00, // Les address à contourner
0xc3
}; //retn
ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0);
DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5); //(De) (à) -5
memcpy(&jmp[1], &dwCalc, 4); //build the jmp
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0);
return dwAddr;
}
On remet les premiers bytes
PHP:
BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup)
{
DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName);
if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0))
return TRUE;
return FALSE;
}
/!\ Ce code n'est pas à C/C, vous devez avoir des bases en C++, ainsi qu'en detours pour le modifier à votre goût /!\
Last edited: