[C++]Api hook

  • Partenaires

Utilisateurs qui regardent le poste (Total: 0, Members: 0, Invité: 0)

Nayres

Nayres

Membre Banni
15 Avr. 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 /!\
 
Dernière édition:
Astropilot

Astropilot

The Lord
V.I.P
Level 5
Level 4
Level 3
Level 2
Level 1
6 Janv. 2011
9,283
18
1,254
France
Merci du tutoriel.
 
R

ragnarock

Level 4
Level 3
Level 2
Level 1
22 Mars 2010
193
0
917
Et la source ?
 
Nayres

Nayres

Membre Banni
15 Avr. 2012
3,431
0
341
Quelque part.


Le code est réécrit pour le simplifier.
 
Dernière édition: