[C/C++]Mise en place d'un hook

    Publicités

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

Status
Not open for further replies.

Zboubi33

Membre
Feb 9, 2014
14
0
121
Bonjour à tous :)
Cela fait maintenant près de quatre mois que je cherche un tutoriel ou un livre qui parle de cela: J'aimerais me lancer dans le game hacking (un fantasme que j'avais à mes 13 ans et que j'ai toujours). Donc, fatalement, je devrais apprendre à mettre en place un hook d'une fonction pour la détourner vers une autre fonction que j'ai écrite. J'ai longtemps cherché sur beaucoup de forums mais, sans succès.
Si quelqu'un a cette compétence ou sait comment se la procurer, j'en serait extrêmement ravi de son partage :)
 
May 23, 2013
508
0
322
'merica
Tu recherches que des articles français ? J'pense pas que tu en trouveras.

Sinon, la base pour un trampoline hook (en utilisant un JMP) :

-Un JMP (distance) sur la fonction que tu veut hook (JMP de la fonction originale vers la tienne)
-Si tu veut utiliser la fonction originale dans ta propre fonction, tu vas devoir exécuter les 5 bytes qui ont été supprimer dans un trampoline
-Apres avoir été exécuté, ce trampoline JMP vers la fonction originale + 5 (pour ne pas exécuter le JMP)


NB: C'est valable pour les exécutables 32bit sous Windows, aucune idée pour les autres OS.
 
Last edited:

Nayres

Membre Banni
Apr 15, 2012
3,431
0
341
Quelque part.
Tu peux toujours utiliser l'en-tête detours.h : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
Ou bien comme l'a dit mon VDD
-Un JMP (distance) sur la fonction que tu veut hook (JMP de la fonction originale vers la tienne)
-Si tu veut utiliser la fonction originale dans ta propre fonction, tu vas devoir exécuter les 5 bytes qui ont été supprimer dans un trampoline
-Apres avoir été exécuté, ce trampoline JMP vers la fonction originale + 5 (pour ne pas exécuter le JMP)
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Merci pour vos réponses, mais j'ai vraiment du mal avec l'anglais et, est-il vraiment indispensable d'apprendre l'asm pour faire un hook ?
 
May 23, 2013
508
0
322
'merica
Non, tu peut utiliser des lib pré-faites, comme MS Detours, mais perso je trouve que c'est mieux de connaitre l'asm pour comprendre comment ça fonctionne.

Et puis sans l'asm tu n'ira pas très loin dans le monde du gamehacking.
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Ok merci de ta réponse :). Est-ce que quelqu'un aurrait la foi de me faire un mini tutoriel sur l'utilisation et ma mise en place basique d'un hook ? Ou sinon simplement me rediriger vers un site proposant un tutoriel expliquant cela de manière assez simple si possible (je suis tombé sur beaucoup de tutos très compliqués destinés à des experts programmeurs de chez microsoft et non à un programmeur cherchant à apprendre)

Si quelqu'un me fait un tutoriel simple expliquant simplement les bases d'un hook, je le vénère comme un dieu jusqu'à la fin de sa vie :D
 
Mar 30, 2011
1,014
1
944
In Your Ass
Solide connaissances en programmation obligatoire
La compréhension de l assembleur est un grand plus également

te lancer dans une injection + hook en mode touriste c est comme une voiture sans moteur ;)

le truc de base d un hook c est effectivement le détournement de la fonction vers la tienne

mais ceci ne seras pas valable pour un autre processus
dans le cas présent tu devras injecter ton code dans le processus cible pour lui faire exécuter la mise en place du hook

on ne parle même pas de la recuperation de l adresse de la fonction ciblée.

Commence le C/C++ et la manipulation des processus , le reste seras plus claire par la suite
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
J'ai de très bonnes compétences en c/c++ et j'ai déjà programmé mon propre injecteur de DLL j'ai pratiquement toutes les compétences requises pour me lancer dans le game hacking, je cherche juste une piste pour véritablement me lancer dedant. C'est pourquoi je fait appel à vous.

Par contre, je ne sais pas vraiment par où commencer pour me familiariser avec la manipulation des processus, si quelqu'un aurrait une piste à me donner ce serait très gentil.

Autre question, est-ce que quelqu'un pourrait m'e pliquer ce que serait l'adresse d'u e fonction ? Et comment trouver l'adresse d'une fonction que j'ai écrite dans mon propre programme ?
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
J'ai galéré et j'ai dû écrire certains bouts de code sans savoir ce que cela signifiait précisément. Est-ce que quelqu'un pourrait répondre à ma question ci-dessus ?

---------- Message ajouté à 12h52 ---------- Le message précédent était à 12h27 ----------

J'ai galeré et j'ai dû écrire des parties de codes sans savoir ce qu'ils signifiaient. Est-ce que vous pouvez répondre à ma question ci-dessus svp ?
 
Mar 30, 2011
1,014
1
944
In Your Ass
Comment est-ce que tu as pu créer ton "propre" injecteur de DLL sans savoir ce qu'est une adresse ?

effectivement ;)

Si tu as tout les connaissances que tu pretend alors cet exemple est relativement clair

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

quand a le faire pour une fonction interne au programme que tu a toi même fait , je pense qu un reversing dessus pendant l execution devrais faire l affaire
 
Last edited:

ragnarock

Membre actif
Mar 22, 2010
194
0
917
Salut, comme l'ont dit les autres, mets toi à l'anglais si tu veux pouvoir progresser convenablement en prog^^

Pour avoir l'adresse d'une fonction faut utiliser ça : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

Et y'a plusieurs types de hook :

- Ceux ou tu ajoute quelques bytes (un JMP surtout) au début de la fonction que tu veux hook (seulement dans le process local), t'as un bon exemple dans le post de Casimir.

- Et ceux ou tu mets un breakpoint dans la function, c'est le même principe que quand tu en mets un dans VS. Le thread va s'arrêter -> tu fais ce que tu veux -> tu relance l’exécution du thread. Y'en a 2 types, les HWBP (limités à 4) et les int3 (je te laisse faire des recherches par toi même, je m'y connais pas assez pour donner un cours où des conseils là dessus), et ces hooks peuvent être placés dans n'importe quel process.

Y'a une librairie très bien faite qui permet de mettre en place ces hooks et de comprendre le principe : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Merci de vos réponses, la bibliothèque de ragnarock m'interresse beaucoup, est-ce que tu pourrait me montrer la doc stp ? Je n'arrive pas à la trouver.

Pour ce qui est du hook avec l'utilisation d'un JMP m'interresse beaucoup, mais j'ai toujours du mal à comprendre la démarche à suivre: il faut remplacer quelques bytes qui vont faire un jmp jusqu'à l'adresse de la fonction que l'on veut détourner, et remplacer l'adresse par l'adresse de la fonction que l'on a écrite ?
 
May 23, 2013
508
0
322
'merica
Non, tu place le JMP (0xE9) sur le 1 er byte de la fonction que tu veut hook, sur les 4 bytes suivant, tu place la distance entre ta fonction et la fonction que tu veut hook.
(Le JMP est relatif, donc il agit un peu comme : ADD EIP, *distance* )


Code:
DWORD funcToHook = (DWORD)hookFunc - (DWORD)func - 5;
		memcpy((LPVOID)(jmpFunction + 1), &funcToHook, 4);
 

ragnarock

Membre actif
Mar 22, 2010
194
0
917
Celle librairie n'a pas de doc, c'est normal que tu la trouves pas^^

Et en gros, pour le hook avec un JMP, faut dans l'ordre :

- Stocker les 6 premiers bytes de la fonction que tu veux hook pour pouvoir les restaurer après

- les remplacer dans la fonction par :
JMP // 1 byte
la distance entre l'adresse de TA fonction et celle que tu veux hook // int32 donc 4 bytes
RET // 1 byte

(- Si tu veux call la fonction originale, faut remettre les bytes d'origine à la fonction, l'appeler, et remettre ensuite en place le JMP)

Ta fonction doit avoir les mêmes paramètres que celle qui est hook.


Je viens de voir que y'a un tuto qui explique ça sur le site : http://www.cheat-gam3.com/8-cours-pour-expert/c-api-hook-144860/
 
Last edited:
May 23, 2013
508
0
322
'merica
Si tu veut appeler la fonction originale, vaut mieux passer par un trampoline, ça t’évitera de devoir réécrire le début de la fonction a chaque fois.


Je viens de voir que y'a un tuto qui explique ça sur le site : http://www.cheat-gam3.com/8-cours-pour-expert/c-api-hook-144860/
C'est un très mauvais exemple. Read/WriteProcessMemory et GetCurrentProcess, alors qu'on peut juste utiliser des pointeurs ...
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Merci de vos réponses, elles m'apportent à chaque fois des informations en plus. Donc je commence par remplacer les 6 premiers bytes du processus dans lequel ma dll est injectée, ensuite j'écris la distance entre ma fonction et celle à hooker, mais comment je fais pour la connaître cette différence ? Est-ce que quelqu'un pourraît me mettre un petit exemple ?

Ensuite est-ce que quelqu'un pourraît me definir la fonction writeprocessmemory et ce qu'elle fait svp ? La doc de microsoft est un peu minable je trouve (après chacun pense ce qu'il veut)
 
May 23, 2013
508
0
322
'merica
Il y a pas besoin d'utiliser WriteProcessMemory vu que tu partage de la mémoire avec le processus.

Utilise des pointeurs et memcpy.

Pour répondre a tes autres questions :
-Tu patch les 5/6+ (ça dépend de la méthode utilisée) premiers bytes de la fonction que tu veut hook, pas ceux du processus, ça n'aurais aucun sens (et je pense pas que ce soit possible).

-Pour la distance : regarde le spoiler 5 messages plus haut.
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Mais p***** j'en ai marre ca fait 5h que je vais sur des sites et des tuto en tout genre anglais et francais, je comprends quasiment toutes les fonctions utilisés pour mettre en place le hook mais j'ai vraiment dû mal à comprendre la démarche et l'organisation du code.

Est-ce que quelqu'un pourrait au moins écrire une fonction mettant en place un hook pour montrer quelles démarches suivrent.
 

ragnarock

Membre actif
Mar 22, 2010
194
0
917
L'exemple qui est sur Wikipédia marche très bien... et en plus chaque étape est commentée. Le lien est sur la 2ème page.

Et si tu ne veux pas avoir à injecter la dll, fais une appli console et remplace la fonction DLLMain par :

Code:
void HookMessageBoxW()
{
	pOrigMBAddress = (pMessageBoxW)
	GetProcAddress(GetModuleHandle(L"user32.dll"),               // get address of original 
		"MessageBoxW");
	if (pOrigMBAddress != NULL)
		BeginRedirect(MyMessageBoxW);
}

et dans ton main t'appelle cette fonction puis MessageBoxW, tu verras que la fonction MyMessageBoxW est appelée.
 
Last edited:

Nayres

Membre Banni
Apr 15, 2012
3,431
0
341
Quelque part.
PHP:
void DetoursFunction(PBYTE fAdd, const PBYTE nAdd, const int lengt) 
{
 DWORD old;
 BYTE* jmp = (BYTE*)malloc(lengt+5);
 VirtualProtect(fAdd, lengt, PAGE_READWRITE, &old); // On change la protection de la page au cas où elle est inaccessible et l'enregistre
 memcpy(jmp, fAdd, lengt); // // On copie les octets
 jmp += len; jmp[0] = 0xE9; 
 *(DWORD*)(jmp+1) = (DWORD)(fAdd + lengt - jmp) - 5; // jmp après la trampoline à l'addresse
fAdd[0] = 0xE9; // On change le premier byte en xE9
 *(DWORD*)(fAdd+1) = (DWORD)(nAdd - fAdd) - 5;
 VirtualProtect(fAdd, lengt, old, &old); // On remet la page à son état initial
 return (jmp - lengt); 
}
 
Last edited:

Zboubi33

Membre
Feb 9, 2014
14
0
121
Rebonjour :)
Alors d'abord merci beaucoup pour votre patience car j'ai toujours eu besoin de beaucoup d'assistance pour apprendre et comprendre dans le monde de la programmation merci beaucoup

Ensuite, je ne cherche pas une fonction de hooking toute faite, sinon j'aurais directement copié une fonction trouvée sur un site, l'utiliser et j'aurais laissé tomber ce topic. Si je fais autant d'effort (vous ne pouvez pas imaginer le nombre d'heures que j'ai passé à chercher et comprendre cette satané technique de détournement de fonction, ça m'obsède) c'est pour chercher à comprendre en détail les différentes étapes du hooking car il y a beaucoup de choses que je ne comprends pas(par exemple ajouter du code assembleur dans un processus) c'est pour moi de nouvelles notions.

Vraiment je suis désolé si je vous paraît lourd ou stupide, j'ai vraiment envie de la comprendre, ça me tient vraiment le cœur.
 
May 23, 2013
508
0
322
'merica
Pose des questions précises si tu veut des réponses détaillées.
-Quel genre de hook veut tu faire : IAT ? JMP ? CALL ?


il y a beaucoup de choses que je ne comprends pas(par exemple ajouter du code assembleur dans un processus)

Quand tu injecte ta DLL, TOUTE ta dll fait parti du processus, les fonctions aussi. Donc tu n'as pas besoin "d'ajouter" le code manuellement si tu veut faire un hook IAT/CALL. Tu manipule le code pour qu'il fasse ce que tu lui "dit" de faire.
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Ok merci de ta réponse :)

Ce que je souhaite, c'est pour l'instant apprendre à hooker avec une dll injectable c'est ce qui me parait le moins compliqué pour l'instant (les autres techniques je verrais plus tard quand j'aurais bien compris)

J'ai lu et relu la page wikipédia sur la page 2 du topic et j'ai remarqué qu'ils y avait plusieurs fonctions que je ne connaissait pas: virtualprotect() et memcpy()

Et maintenant, j'aimerais bien que vous me disiez (dans un hook via une dll) quand se produit l'étape où l'on détourne l'adresse de la fonction à hooker. Ce serait trè gentil de votre part :)
 
May 23, 2013
508
0
322
'merica
-VirtualProtect/Ex sert a changer la protection d'une page de mémoire.
Si une adresse a la protection PAGE_EXECUTE_READ(0x20), tu sais que cette adresse contient du code, et que tu as le droit de lire les opcodes. Dans le cas d'un hook, tu as besoin d’écrire a une adresse, donc utilise VirtualProtect avec l'argument flNewProtect = PAGE_EXECUTE_READWRITE(0x40).
Et quand tu as fini d’écrire a cette adresse, tu reset la protection avec flNewProtect = fplOldProtect (que tu as récupérer la première fois que tu as appeler VirtualProtect).
Plus d'info : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris! Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!


-memcpy sert a copier un buffer vers une adresse, le buffer peut être de n'importe quel type (void*). Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!
ex :
Code:
memcpy(func, jmpFunction, 5);
Ce bout de code copie les 5 bytes a l’adresse de jmpFunction(BYTE*) vers les 5 premiers bytes de func(LPDWORD).


-Ça dépend que quel type de hook, mais habituellement c'est au moment ou tu patche les premiers bytes de la fonction que tu veut hook. Le CPU ne fais qu’exécuter les instructions, si la première instruction dans la fonction est un JMP vers ton code, alors l'EIP (Extended Instruction Pointer), va pointer vers ton code, et le CPU va l’exécuter.
En cas de hook avec l'IAT c'est différent parce que ça saute directement a ton code sans passer par la fonction originale.
 

Zboubi33

Membre
Feb 9, 2014
14
0
121
Merci de ta réponse :)
Bon, comme vous êtes un peu mon dernier espoir, je vais vous demander une dernière chose:
Est-ce que quelqu'un pouraît écrire une mini-fonction, se trouvant dans une dll injectée dans le processus cible, avec le strict minimum pour hooker une fonction (même pas une fonction unhook, vraiment le strict minimum) avec un code commenté au maximum pour assurer ma compréhension (en gros faites comme si vous parlez à quelqu'un qui s'y connaît quasiment pas en programmation, même si j'ai de solides bases).

Je sais que c'est un peu trop vous demander, mais qui tente rien n'a rien ; je suis un peu à bout de force j'en ai marre de chercher sur tout et n'importe quels sites pour réussir à comprendre comment marche cette foutue fonction.
 
Status
Not open for further replies.