[C++]Api hook

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

Nayres

Membre Banni
Apr 15, 2012
3,431
0
341
Quelque part.
/!\ 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

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: