begin process at 2012 05 27 19:56:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > HOOK SUR API (WIN32, NT REQUIS)

HOOK SUR API (WIN32, NT REQUIS)


 Information sur la source

Note :
8,33 / 10 - par 3 personnes
8,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Initié Date de création :09/10/2004 Date de mise à jour :09/10/2004 21:07:37 Vu / téléchargé :9 739 / 975

Auteur : Nebula

Ecrire un message privé
Site perso
Commentaire sur cette source (37)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
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

  • 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 ;-)
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.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

09 octobre 2004 20:58:27 :
Nettoyage du code - le projet compile désormais avec MinGW et Visual C++ sans modifications
09 octobre 2004 21:07:38 :

 Sources du même auteur

Source avec Zip ÉNUMÉRATION DES PROCESSUS ET DÉCHARGEMENT FORCÉ DE DLL
Source avec Zip EXÉCUTABLES SE VÉRIFIANT LORSQU'ILS SONT LANCÉS
Source avec Zip Source avec une capture RICHEDIT AVEC SUPPORT DES THÈMES XP
Source avec Zip CALCUL DE HASH MD5 (WIN32)
Source avec Zip VÉRIFIER QUE L'UTILISATEUR EST ADMINISTRATEUR

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

Commentaires et avis

Commentaire de DeAtHCrAsH le 09/10/2004 11:11:38

Ne fonctionne pas sous XP Pro FR Sp2!

Shell

Commentaire de vecchio56 le 09/10/2004 12:42:20 administrateur CS

Salut,

Je suis d'accord avec les remarques précédentes
J'ai un peu regardé le code, et dans injector.c, pour trouver Notepad, autant faire

DWORD dwNotepad = 0;
HWND hNotepad;
if(hNotepad = FindWindow("Notepad", 0))
GetWindowThreadProcessId(hNotepad, &dwNotepad);
// dwNotepad contient 0 ou ID Process

Commentaire de Nebula le 09/10/2004 13:33:47

Shell > je suis sous XP Pro SP2... c'est quoi qui merde ?

Matt67 > la source originale est ici http://www.cppfrance.com/code.aspx?ID=25603 - et le code est "relativement" crade, mais pas trop non plus... enfin autant qu'un code nocturne quoi lol

vecchio56 > arf j'y avais même pas pensé... je reviens, le temps d'aller me frapper la tête contre un mur !

Commentaire de vecchio56 le 09/10/2004 13:53:01 administrateur CS

(J'ai le même problème que DeAtHCrAsH ou Shell)

Commentaire de Nebula le 09/10/2004 14:03:51

Bizarre, j'ai testé sur trois PC XP différents (deux SP2 et un SP1) et il fonctionne convenablement... Il sort pas d'erreur ?

Commentaire de vecchio56 le 09/10/2004 14:12:32 administrateur CS

Non, il écrit ca:
Handle de notepad: 0x000007E8
Handle du thread: 0x000007F4
Le hook est installé !

Commentaire de Nebula le 09/10/2004 14:19:00

Que le grand cric me croque, je n'y comprend rien... Il nous fait pas une boucle infinie des fois (à 100% du CPU utilisé), j'ai eu çà durant la mise au point de la DLL ?

Et c'est avec les binaires du zip, ou tu les as recompilés ?

Commentaire de vecchio56 le 09/10/2004 14:21:00 administrateur CS

Bianaires du zip, pas de bouclage...

Commentaire de Nebula le 09/10/2004 15:01:13

Alors là... Faudrait essayer de mettre des msgbox dans le code aux étapes importantes, parce que je vois pas du tout d'où çà pourrait bien venir :-/

Commentaire de BruNews le 09/10/2004 15:11:01 administrateur CS

Va bon sur 2 XP SP2 et 1 Server 2003.
Par contre rien a lire, la console se referme illico.

Commentaire de vecchio56 le 09/10/2004 15:13:58 administrateur CS

Moi aussi se referme illico, mais lance dans un cmd.exe
Le principe est bien le suivant?
-Lancer notepad
-Lancer hooker.exe
-Faire a propos dans notepad...

Commentaire de Nebula le 09/10/2004 15:14:20

Pas grave pour ce qu'elle affiche, c'est vrai que j'aurais pu mettre un read mais bon... Merci de confirmer que çà marche ailleurs que chez moi ! :)

Commentaire de DeAtHCrAsH le 09/10/2004 15:15:51

vecchio> Shell ou DeAtHCrAsH , c'est comme tu veux.

Nebula> Moi il ne marche carement pas. Une fenetre MS-DOS s'ouvre et se referme aussi tot.

Shell

Commentaire de Nebula le 09/10/2004 15:16:18

vecchio > oui

Commentaire de Nebula le 09/10/2004 15:19:40

Shell > la console se ferme mais la dll reste chargée, normalement... le about du notepad a changé ou pas ?

Commentaire de DeAtHCrAsH le 09/10/2004 15:44:43

Désolé pour les 2 posts identiques.
J'ai bien un message me disant "hook installé" mais il ne marche pas.


Shell

Commentaire de Nebula le 09/10/2004 15:53:09

Un doute me vient : votre Notepad importe bien ShellAboutW et pas ShellAboutA (ce qui serait étonnant sous XP mais bon) ?

Commentaire de vecchio56 le 09/10/2004 16:36:51 administrateur CS

ShellAboutW of course

Commentaire de vecchio56 le 09/10/2004 17:51:21 administrateur CS

Je remarque que le programme se comporte de la même manière, que hooker.dll soit présente ou pas.

Commentaire de Nebula le 09/10/2004 18:00:38

Hum, peut-être que c'est ma génération du chemin vers la DLL qui merde... Que donne un print(TEXT("[%1!s!]%n"), szModuleName) à la ligne 54 ?

Commentaire de vecchio56 le 09/10/2004 18:10:18 administrateur CS

il me donne le bon truc (chemin exact de la dll)

Commentaire de Nebula le 09/10/2004 18:23:58

Donc cela vient de la DLL... Une MessageBox(NULL, TEXT("in shell32"), TEXT(""), MB_OK) à la ligne 51 de hooker.c et une autre MessageBox(NULL, TEXT("in ShellAbout"), TEXT(""), MB_OK) à la ligne 58, çà donne quoi ?

Commentaire de vecchio56 le 09/10/2004 20:00:24 administrateur CS

BruNews> T'as recompilé avec vs? Parce que moi avec vs ca marche, mais quand je compile avec MinGW ca marche pas, en particulier avec les binaires de Nebula.

Commentaire de Nebula le 09/10/2004 21:00:40

Je viens de mettre la source à jour (MinGW 3.4.2 et Visual C++ 2003). Merci vecchio au passage :)

Commentaire de AlexMAN le 09/10/2004 21:38:32

Chez moi ca passe sous WinXP SP2 !
Si ca marche pas chez vecchio, c normal, il touche a tt, et fait nimporte koi...;)

Commentaire de Pamaury le 09/10/2004 21:50:34

intéressant, j'ai fait le même mais j'ai fait un truc de plus qui est très util si on veux hacker un exe jusqu'au bout : intercepté :
->Les API loadée dynamiquement(avec un GetProcAddress)
->Les API appelée depuis une dll chargée dans le processus(ex: prog.exe appèle TrucMachin dans machin.dll qui appèle MessageBoxA)

Voilà, sinon c'est vrai que c'est assez crade et surtout, il faudrait faire une fonction qui permet de hacker UNE FONCTION SPECIFIQUE dans UNE DLL SPECIFIQUE d'un EXE ou DLL SPECIFIQUE
ex(tiré de mon code):

int HookAPIEx(LPTSTR lpszModule,LPTSTR lpszDll,LPTSTR lpszApi,LPVOID lpNewApi,LPVOID *lpOldApi)

Commentaire de vecchio56 le 09/10/2004 21:59:06 administrateur CS

AlexMAN> J'ai juste changé 2 ou 3 trucs dans SHELL32.DLL, pas de quoi s'alarmer ;)

Commentaire de vecchio56 le 09/10/2004 22:02:16 administrateur CS

Et la version MinGW marche aussi chez toi?

Commentaire de Nebula le 09/10/2004 22:04:39

vecchio > les deux marchent chez moi... ne me dis pas que tu as encore un problème ? :s

Pamaury > c'est sûr que ce serait mieux, mais là je voulais surtout comprendre comment marchait le truc, ce qui implique un truc simple dans un premier temps ;)

Commentaire de vecchio56 le 09/10/2004 22:07:35 administrateur CS

Version GCC marche pas, désolé.

Commentaire de Nebula le 09/10/2004 22:09:31

Quelle version de GCC / binutils / mingw-runtime / w32api tu as donc ?

Commentaire de vecchio56 le 09/10/2004 22:11:34 administrateur CS

Peu importe, j'utilise TES executables

Commentaire de Nebula le 09/10/2004 22:13:49

Ah... Ben là je vois pas :-/ Tu me permets de t'envoyer deux binaires sans CRT ? Je serais pas étonné que çà vienne encore de celle là...

Commentaire de Pamaury le 09/10/2004 23:26:25

chez moi, les deux exe marche(pas compilé: ceux du zip) . Je vois pas pourquoi il y aurais une différence, j'ai codé le même truc chez moi avec Dev-Cpp et MingW et çà marche impec le pb est surrement autre par comme un paramètre faculatatif qui n'a pas la même valeur par défaut sur les deux compilos(comme les pragma peut-être) .
Pour info, modifier ton code pour le rendre plus propre n'est pas dur, il suffit de remplacer les constante de texte par des variable et d'en faire une fonction .

C'est quoi CRt ????

Commentaire de Nebula le 09/10/2004 23:28:30

CRT = C Runtime Library, les dépendances à MSVCRT.DLL des fichiers générés par MinGW... Mais çà ne venait pas de là, je ne vois pas ce qui cloche chez notre ami vecchio :-/

Commentaire de vecchio56 le 09/10/2004 23:29:21 administrateur CS

C Runtime

Commentaire de chess8 le 31/10/2004 19:45:32

Quelques problemes. Le code d'origine ne marche pas. Pour etre plus précis, l'injection se fait théoriquement bien (message depuis injector.exe correct).

Une précision, je suis sur win2k, sp4.

J'ai fais quelques modifs sur injector pour avancer un peu plus :
- injector n'est plus console mais un prog win, cela marche visiblement mieux.
- J'utilise LoadLibraryA (au lieu de W). Avant cette modif, le message box placé juste aprés le case DLL_PROCESS_ATTACH de hooker ne s'affichait pas.

Le code s'arrete maintenant  sur while (pITDAddr->u1.Function != 0). En fait, il ne rentre pas dans la boucle donc pITDAddr->u1.Function = 0.

Voila. Sinon, j'ai trouvé un code trés ressemblant à hooker.c ici :
http://www.xeberon.net/view.php?id=100&page=0
Il a l'avantage d'etre trés commenté concernant les structures utilisées (entres autres). En revanche, il n'y a pas d'injecteur.

J'essaye de continuer d'avancer. Merci pour le code.


 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,359 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales