vendredi 14 mars 2008

API hooking by IAT Patching : hook global de TerminateProcess()

Bonjour/Bonsoir,
voilà un bon bout de temps que j'étais sur ce projet que je viens juste de "finir", le hook d'API. Il s'agit en fait de détourner une API afin de la contrôler.
Le projet s'organise en 2 parties majeures, tout d'abord on injecte une dll dans un processus, j'ai déjà fais un article expliquant comment faire ça (article) cependant j'ai quand même apporté quelques modifications au code que j'avais fais, je l'ai mis à jour, et ensuite, une fois la dll chargée en mémoire dans le processus, on va modifier l'IAT de celui-ci afin de faire pointer la fonction que l'on veut hooker sur un fonction déclarée dans notre dll.Pour les explications de la 2e partie je vous renvoie à cet article : article .

Afin d'illustrer ce code, je vous propose d'hooker la fonction TerminateProcess() sur tous les processus.
Je prends par exemple un code que j'avais fait qui permet de terminer un processus et je vais essayer de lui appliquer mon code :


>loader C:\killprocess.dll KillProcess.exe

Injecting dll C:\killprocess.dll into process KillProcess.exe ...


Adresse de LoadLibrary() : 7c801d77
Process ID : 244

[+]Processus ouvert : 7d0
[+]Mémoire allouee : 510000
[+]Ecriture dans le processus reussie
----Avec 19 bits ecrits
[+]Donnees executees



Donc en premier lieu on injecte la dll (Si ça ne marche pas c'est peutêtre à cause d'un AV ou firewall).
Ensuite la dll va faire son travail et on va voir si ça marche :



(Ne faites pas attention au fautes d'anglais, c'était mes debuts ^^)
Super, on nous demande confirmation de l'arrêt du processus.
Maintenant on peut faire la même chose en hook global, c'est à dire sur tous les processus sauf les systèmes pour éviter de se prendre un BSOD.


>loader C:\killprocess.dll all

Injecting dll C:\killprocess.dll into process MDM.EXE ...


Adresse de LoadLibrary() : 7c801d77
Process ID : 2812

[+]Processus ouvert : 6ac
[+]Mémoire allouee : a00000
[+]Ecriture dans le processus reussie
----Avec 19 bits ecrits
[+]Donnees executees
Injecting dll C:\killprocess.dll into process devcpp.exe ...


Adresse de LoadLibrary() : 7c801d77
Process ID : 316

[+]Processus ouvert : 6a0
[+]Mémoire allouee : 15f0000
[+]Ecriture dans le processus reussie
----Avec 19 bits ecrits
[+]Donnees executees
Injecting dll C:\killprocess.dll into process codeblocks.exe ...


Adresse de LoadLibrary() : 7c801d77
Process ID : 3252

[+]Processus ouvert : 694
[+]Mémoire allouee : 1090000
[+]Ecriture dans le processus reussie
----Avec 19 bits ecrits
[+]Donnees executees
Injecting dll C:\killprocess.dll into process explorer.exe ...

...



On tente de terminer un processus avec taskmgr.exe et on vois apparaitre notre jolie messagebox qui demande une confirmation :). Juste un petit cafouilla sur le nom du processus victime, je me suis pas embêté pour ce qui est de récupérer le nom des processus.

Bien évidemment TerminateProcess() n'est pas la seule API qu'on peut hooker, à présent tout dépend de votre imagination ;).

Maintenant ce que vous voulez, les codes :

Le loader :

projet
loader.c
code+binaire en zip



La dll :

projet
main.c
code + binaire en zip


Le programme qui sert d'exemple, KillProcess.exe :

projet
main.cpp
code + binaire en zip

Je tiens également à remercier Overclok et Ivanlef0u qui m'ont aidé pour ce projet. Un article sur l'API hooking est également présent sur le blog d'Overclok.

Have Fun ;)
lilxam.

3 commentaires:

sQb3Ta a dit…

Hello

Bravo, bien sympa cet exemple d'IAT Patching...

Hmm pas sure qu'il fonctionne sous Vista.

Allez je le télécharge et je test sous XP et Vista (sous VS2008)

Moi j'ai un autre code qui ressemble pas mal à ça mais qui ne fonctionne pas sous vista et je m'arrache les cheveux pour savoir pkoi..

Alors si on peut communiquer ensemble par mail pour échanger des trucs ce serait cool (on peut aussi me trouver sur qlques forums

squalb3ta AT yahoo DOT fr

lilxam a dit…

Salut :)
merci pour ton commentaire. Pour ce qui est de Vista je ne l'ai pas sous la main, mais je vais essayer de me le procurer. A mon avis, mais c'est pas du tout sur, ça doit venir de la fonction CreateRemoteThread() qui est par exemple hooké par certains firewall donc peutêtre que vista fais de même. Tu as essayé de voir ce que renvoi GetLastError() ?
Je te tiens au courant si je trouve.
Lilxam.

Anonyme a dit…

Merci beaucoup.

Je découvre l'IAT hooking depuis peu et le nombre de possibilités fait peur :)

Par contre lorsqu'on injecte la dll, les processus doivent être déjà lancés. Il y a possibilité que la dll s'injecte "automatiquement" dans chaque processus au démarrage?

[Ryscrow]