Hook sur api (win32, nt requis)

Description

Cette source montre la mise en oeuvre de l'interception d'API sur une API simple : ShellAbout, sur un programme tout aussi simple: Notepad. L'injection se passe en deux parties : tout d'abord, le "chargeur" force Notepad à charger une DLL, et c'est cette DLL qui s'occupera de détourner l'API et de fournir la fonction utilisée à la place. Les deux utilisent Unicode, ce qui m'a posé des problèmes avec certaines parties des binaires qui stockent leurs informations en ASCII...

Source / Exemple :


1) le chargeur : injector.c
Il ne fait pas grand chose : scan des processus en cours d'exécution à la recherche d'un "notepad.exe" (il s'arrête au premier trouvé), allocation de mémoire dans Notepad et appel de CreateRemoteThread pour injecter la DLL. En fait, on force Notepad à appeler "LoadLibrary" avec le nom de la DLL, le tout dans son propre espace mémoire. J'ai essayé d'autres trucs plus bourrins (comme copier le code d'une fonction dans l'espace de Notepad et appeler CreateRemoteThread sur cette fonction), mais je n'ai pas encore réussi à faire fonctionner l'injection ainsi...

2) le hook proprement dit : hooker.c
Toute cette partie de code s'exécute dans l'espace du Notepad. Il faut savoir que le HMODULE récupéré par GetModuleHandle est en fait un pointeur vers le premier octet du fichier en mémoire, et on peut donc le parcourir comme si on le lisait à partir du disque (pratique)... On cherche ainsi la table des imports, et on la modifie pour que ShellAbout ne pointe plus sur SHELL32.DLL mais sur une fonction de notre propre DLL, qui appelera la vraie ShellAbout avec quelques modifications (on peut appliquer le même système à la plupart des APIs je pense... Winsock est la première à me venir à l'esprit)

3) le résultat
Exécutez le chargeur (avec une fenêtre Notepad de lancée, évidemment) puis allez voir le menu "?", option "A propos"... Il y a eu quelques changements ;-)

Conclusion :


Les deux fichiers sources utilisent abondamment les assertions, donc si quelque chose ne marche pas chez vous, il est plus que probable qu'on saura pourquoi... Le code est (relativement) crade, mais j'ai passé la nuit dessus et pas très envie de le retoucher maintenant que çà fonctionne (séparer en conassert.h/c et guiassert.h/c serait un début...) Le parcours de l'import table n'est pas totalement de moi, je l'ai juste un peu amélioré (support d'Unicode, simplification du code et des opérations sur les pointeurs)

Pour GCC (3.4.2 et ultérieur), ne pas oublier -finput-charset=latin1 dans la ligne de compilation, sinon vous aurez des erreurs à cause d'Unicode.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.