begin process at 2010 02 09 21:07:05
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > REGISTRY GUARD BETA

REGISTRY GUARD BETA


 Description

Cliquez pour voir la capture en taille normale
Registry Guard est un programme très proche de Regmon de Sysinternals (http://www.sysinternals.com/Utilities/Regmon.html ), il permet de visualiser les tentatives d'accés à la registry (Lecture, Ouverture, Création) en temps réel, mais il possédera plus de fonctionnalités que ce-dernier plus tard (notamment une fonctionnalité réseau).

Ce programme est composé d'une DLL codée en C qui permet le hook des fonctions RegCreateKeyEx, RegOpenKeyEx, et RegQueryKeyEx (d'autre fonctions sont à venir...); c'est le moteur du programme. Grâce à la fonction API de hook, cette DLL est executée dans chaque programme actifs, modifie la table d'import de ces programme et les adresses des API de la registry afin de les détourner vers les fonctions de la DLL. Ensuite, la seconde partie du programme est en réalité le programme principal (comprenant la GUI), qui reçoit les messages d'alerte envoyés par la DLL et affiche les tentatives d'accés à la registry. Ces deux parties sont donc totalement complémentaires.

Pour plus d'informations concernant la technique de hook utilisée et son fonctionnement ; des sources sont disponibles sur ce site et un article sur le PE Header (avec l'IAT) pourra vous éclairer : http://olance.developpez.com/articles/windows/pe-i czelion/import-table/

Ce programme n'est qu'une ébauche, plusieurs fonctionnalités sont à venir...

Source

  • // Cf .ZIP pour le code source
// Cf .ZIP pour le code source 

 Conclusion

Programme testé sous Windows XP SP1/SP2 et Windows Vista.
Compilé sous Visual Studio 2005.

Attention cependant, un bug persiste : lorsqu'on est en train d'utiliser MSN Messenger avec Registry Guard en mode actif ; MSN plante, je n'ai pas encore eu le temps de regarder ce bug.

Second bug (minime) : si vous lancez un programme avec RG activé, les API registry seront logguées, mais si vous désactivez RG et que le programme tente d'accéder à la base de registre par la suite, ce-dernier plantera, vu que les adresses originales des API ont été remplacées par celles des fonctions de la DLL et que celle-ci n'est plus présente. Vous pouvez le corriger par vous même, grâce à ma fonction MakeHook que vous appellerez dans DLL_PROCESS_DETACH, afin ques les bonnes adresses soient réaffectées dans l'IAT. Malgré que cette mise à jour soit rapide, je n'ai pas eu le temps de la faire.

Un fichier binaire est présent (.EX_ dans /RG _GUI/Bin).

Je mettrai prochainement en ligne un .ZIP contenant les deux projets Visual Studio complets pour la DLL et RG, pour une compilation rapide et facile.
Pour plus d'infos, faire parvenir des bugs, ou si vous souhaitez être informé lors de la sortie d'une nouvelle version, voici mon mail : touron.guillaume@gmail.com

 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


 Sources du même auteur

IMPLEMENTATION STL (LIST)

 Sources de la même categorie

Source avec Zip Source avec une capture [C/WIN32/WMI]SAVOIR SI UNE CLASSE COM EST INSTALLÉE par rt15
Source avec Zip Source avec une capture [C/WIN32][DRIVER] DÉTECTION DE CRÉATION OU DE SUPPRESSION DE... par deck_bsd
Source avec Zip DÉTECTION DE LANCEMENT D'APPLICATION (WIN32, REGISTERSHELLHO... par buno
Source avec Zip Source avec une capture [C/WIN32] INJECTION DE DLL 2 MÉTHODES (REMOTETHREAD PROPRE &... par deck_bsd
PRODUCER CONSUMER C (WITHIN LINUX) par PCBill

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture [C/WIN32/WMI]SAVOIR SI UNE CLASSE COM EST INSTALLÉE par rt15
Source avec Zip HOOK SANS DLL BLOQUANT LE DOUBLE CLICK par Leucistic
Source avec Zip Source avec une capture MOUSECONTROL par NeoUmbrella
Source avec Zip Source avec une capture [WIN32][C][DEV-C++] IMPSCREEN IMPRIME ECRAN PAR HOOK SANS DL... par omnia
Source avec Zip BEEPER, UTILISER UN HOOK CLAVIER INTÉGRÉ À L'EXÉCUTABLE ET G... par ndubien

Commentaires et avis

Commentaire de MuPuF le 17/07/2006 19:24:20

Bonne chance Taron, tu va y arriver !

Signé, le lacheur ;-D

Commentaire de racpp le 18/07/2006 04:12:20 administrateur CS

Salut,
Je n'ai pas encore regardé le code source, mais ça parait très intéressant. J'ai deux petites questions.
1- C'est normal que la taille de l'exécutable soit si grande?
2- Supposons que le programme est déjà lancé, puis on ouvre un programme quelconque. Sera-t-il hooké à son ouverture?
Je regarderai plutard le code.
Merci.

Commentaire de MuPuF le 18/07/2006 12:06:05

je répond pour lui (en attendant sa réponse définitive)
Le programme ne hooke pas l'execution d'un programme, seulement si celui çi accede au registre ou pas.
A la base, c'étais pour faire un antivirus qui demande trés peu de ressource (on est partit du constat qu'un virus écrit à 98% dans la bdr, ça permet d'allerter, à l'utilisateur de faire son travail aprés).
Voila, pour la taille de l'exe, il a mit des images dedans ;-)
Bonne journée

Commentaire de Taron31 le 18/07/2006 12:33:41

Racpp : d'abord merci, en ce qui concerne les questions : la taille de l'executable est importante due aux images oui (icônes, nagscreen) comme le dit Mupuf. Ensuite, pour la seconde question : oui, le programme sera quand même hooké, car la DLL est executée par n'importe quel programme déjà ouvert, ou qui s'ouvrira, sinon quel interêt ? Tu peux tester par toi même (essaye avec le programme de support windows par exemple)...

Voilà.
Merci.

Commentaire de racpp le 18/07/2006 21:53:14 administrateur CS

Salut,
MuPuf >> Merci pour la réponse. Je sais ce que c'est un hook d'API. J'en ai déjà fait. Je parlais donc du hook des 3 APIs pour  un programme nouvellement lancé alors que RegistryGuard est déjà actif.

Taron32 >> Merci pour la précision. En effet, je viens de tester en ouvrant Winzip. Mais il parait que le programme ne détecte pas les processus n'ayant pas une fenêtre ou une boite de dialogue. Que ces processus soient créés avant ou après le lancement de RegistryGuard, ils ne sont pas hookés. Voici un petit exemple de code à compiler et tester:

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev,LPSTR cmd, int show)
{
HKEY keyHandle;
RegOpenKeyEx(HKEY_LOCAL_MACHINE,"SOFTWARE\\Microsoft\\Windows\\CurrentVersion",0,KEY_ALL_ACCESS,&keyHandle);
RegCloseKey(keyHandle);
ExitProcess(0);
}

Il est donc préférable de lister tous les processus existants, avec ou sans fenêtre. Le cas de ceux nouvellement créés (sans fenêtre) est plus délicat. J'avais ce genre de problème dans une application qui doit hooker une API pour tous les processus existants et à venir. J'ai lu quelque part qu'il existe une fonction de ntdll.dll qui permet à une application d'être informée quand un processus quelconque vient d'être créé. Je n'ai pas encore testé cette solution car j'ai encore du temps avant la première mise à jour de mon application.

Pour la taille de l'exécutable, l'un des responsable est, c'est vrai, surtout l'image BMP nagsreen de 263ko. Tu peux la convertir en JPG pour avoir une taille de seulement 25ko en gardant 100% de la qualité originale. Pour l'afficher dans ton programme tu utliseras l'interface IPicture. Ainsi, tu gagneras donc 238Ko. A remarquer aussi que la taille de la DLL est assez garnde aussi (200Ko).

Concernant l'interface du programme, j'ai quelques remarques:
- Puisqu'il n'y a pas beaucoup de fonctionnalités, il est préférable d'utiliser une ToolBar au lieu des menus.
- La ListView doit avoir une ScrollBar vericale.
- Les derniers éléments ajoutés à la ListView doivent être en bas de la liste au lieu du début.
- En actionnant la roulette de la souris, l'affichage de la ListView n'est plus normal.
- L'heure de la détection ne correspond pas à l'heure locale du PC.
- L'affichage de l'heure de détection doit être corrigé. Par exemple ça affiche "21:4 52 sec" au lieu de "21:04:52".

Je sais que c'est une version Beta et que tout cela n'est pas difficile à régler.
Je le répète, je trouve ce code très très intéressant.
J'attends la prochaine mise à jour pour donner une note, qui sera certainement 10/10.
Merci.



Commentaire de BruNews le 18/07/2006 22:18:38 administrateur CS

L'entrée dans un processus par SetWindowsHookEx a ses limites, les services system par exemple ne seront jamais hookés.
De nombreux progs en langages interprétés utilisent les classes WMI pour accès à la BDR (entre autre), idem ils ne seront pas hookés, etc...
Pour un hook complet sur la BDR, il faut passer le code en kernel mode dans un driver.

Commentaire de racpp le 18/07/2006 22:33:29 administrateur CS

Merci BruNews. Et les services non système? seront-ils hookables?
Certains programmes utilisent les fonctions de ntdll.dll. Ils sont également non hookables par la méthode utilisée dans ce code source.
Quand tu dis "kernel mode dans un driver" tu parles du hook des fonctions de la ntdll.dll ou les autres APIs?

Commentaire de BruNews le 18/07/2006 22:55:55 administrateur CS

Même pas évident pour les services ordinaires mais faudrait essayer, je ne me souviens plus.
ZwCreateKey, ZwSetValueKey, etc... Il est clair que si on les appelle direct, on saute le hook des fonctions du mode user.
Si on veut hooker celles ci, il faut suivre l'exemple quej'ai fait pour cacher les progs, ça passe par force par un driver. C'est la seule méthode qui garantit l'interception pour tout le system. Ce sera par contre un gros boulot.

Commentaire de Taron31 le 18/07/2006 23:10:12

Oula, il va falloir parler...

Racpp: c'est vrai j'avais deja remarqué ce problème là, je ne comprends pas vraiment et je ne sais pas comment y remedier ; car si on detecte le nouveau processus, je devrais peut-être injecter la DLL manuellement ? A voir... Concernant encore la taille, un coup d'UPX et ça fera 200ko à tout casser.
Concernant tes remarques sur l'interface, et les menus, je pense le laisser comme ça (pas sûr) car d'autres fonctionnalités seront sûrement à venir. Il y'a aussi le problème de la ToolBar à régler c'est  veridict, enfin bref, je corrigerai tout ça. Je tenterai de lancer une nouvelle version en août dès que j'aurais le temps, parce que là je suis en stage. En tout cas merci beaucoup pour tes commentaires, ça aide.

BruNews, justement c'était un point que je comptais aborder, tout ne sera pas hooké. Et dans d'autre produits (tel que Regmon par exemple) utilisent des Drivers en Kernel Mode pour tout catcher. Et je me pose exactement les mêmes question que Racpp, pour hooker les fonctions agissant sur la registry de ntdll.dll il faut passer obligatoirement en kernel mode ? En fait, je comptais utiliser un driver pour avoir un meilleur impact dans le hook mais j'ai trouvé aucune doc à ce sujet.

Merci pour vos commentaires, j'en attends d'autre...

Commentaire de racpp le 18/07/2006 23:11:25 administrateur CS

Ok merci, je vais regarder.
A propos de programmation de drivers, j'ai le DDK 2000. ça marchait parfaitement sur Win2000. Dernièrement, j'ai voulu l'installer sur Win XP-SP2 puis j'ai dû formatter mon PC et tout réinstaller car ça redémarre tout seul. Je ne sais pas si c'est à cause du DDK ou non. J'aimerais donc savoir si je peux utiliser mon ancien DDK sur XP ou existe-t-il une version spéciale pour XP?

Commentaire de BruNews le 18/07/2006 23:29:39 administrateur CS

Pas le temps d'aller voir le fonctionnement re RegMon mais s'il hooke tout, il est certain qu'il utilise un driver, absolument le seul moyen.
En cas de hook par driver, tu n'as plus à te soucier de quelles fonctions sont appelées pour accès à la BDR, que soit de ntdll ou kernel32 peu importe, elles finiront sur l'entrée modifiée par le driver du ServiceDescriptorTableEntry qui devra repointer sur TA fonction perso.
Pour de la doc sur les drivers, faut lire Walter Oney 2de édition et surtourt collecter tout ce que tu trouveras sur le net car le bouquin suppose pas mal de concepts connus (pas évident pour tout le monde). Il te faudra le DDK, il comporte un gros chm d'aide.

Commentaire de BruNews le 18/07/2006 23:33:41 administrateur CS

Version Win2003 SP1 à installer, couvre depuis Win2000.

Commentaire de racpp le 18/07/2006 23:38:56 administrateur CS

Taron31 >> Je n'ai pas analysé ton code, mais il parait que tu utilises le HWND des fenêtres existantes et celles à venir pour récupérer les identificateurs de leurs processus. Tu peux lister tous les proccessus actuels directement. Pour les nouveaux processus, ça pose problème comme j'ai dit plu haut. Si le programme est informé de la création du nouveaux processus, il pourra donc y injecter la dll sans problème. Le problème se situe donc au niveau de la détection de la création.
A propos de la taille de l'EXE, tu peux la réduire avant même de le passer sous UPX. La taille finale sera encore plus petite.

Commentaire de Taron31 le 18/07/2006 23:59:51

Racpp: non, pour récuperer leur PID, j'utilise la fonction _getpid() executée par le DLL dans le processus, je récupère seulement le HWND du programme principal afin de lui envoyer les WM_COPYDATA. C'est vrai qu'il faudrait trouver un moyen pour detecter la création de nouveaux processus pour pouvoir injecter la DLL.

BruNews: il faudrait modifier quand même plusieurs entrées nan ? pour l'ouverture, la création, la lecture, l'écriture et la fermeture... non ?

Merci

Commentaire de BruNews le 19/07/2006 00:05:53 administrateur CS

Certain si tu veux l'ensemble des fonctions BDR, pour cela que je te dis que sera un gros boulot car faut ensuite négocier le discours entre kernel et user mode. Le moindre faux pas c'est écran bleu et il y en aura avant que ceci ne soit au point.

Commentaire de racpp le 20/07/2006 05:13:29 administrateur CS

Salut,
Taron31 >> Je viens de regarder ton code d'un peu plus près. C'est effectivement l'utilisation de SetWindowsHook() qui permet de ne pas s'occuper de l'énumération des processus et la détection de ceux nouvellement créés. C'est donc le système qui fait ce travail. C'est dommage que cela ne permette pas de hooker les processus sans fenêtre. Pourtant, je trouve l'utilisation de SetWindowsHook() très propre par rapport aux autres méthodes de hook. Je connais plutôt la célèbre méthode de Jeffrey Ritcher qui consiste à:
1- Enumérer tous les processus existants (avec ou sans fenêtre).
2- Ouvrir chaque processus.
3- Allouer de la mémoire dans l'espace alloué au processus.
4- Ecrire le chemin contenant le nom de notre dll dans cette zone mémoire.
5- Récupérer l'adresse de LoadLibary() dans Kernel32.dll
6- Créer un thread dans le processus cible. La fonction de ce thread est l'adresse de LoadLibrary() ayant comme paramètre le pointeur sur la zone allouée contenant le chemin de notre dll.
7- Attendre que ce Thread se termine.
8- Libérer le handle du thread, celui du processus et la mémoire allouée.

Notre dll sera donc chargée dans tous les processus. Elle modifiera leurs tables d'import afin de rediriger tous les appels de l'API voulue vers une fontion contenu dans cette dll.

Je trouve cette solution très élégante. Le problème qui reste à résoudre est celui de la détection de nouveux processus.
Un autre problème apparaitra car il parait que Microsoft a l'intention d'interdire l'écriture dans une zone mémoire allouée dans un processus externe à une application. Dans tel cas, cette méthode ne sera plus utilisable.

La solution du hook avec SetWindowsHook() sera toujours supportée.
Je te conseille donc de garder cette solution dans la prochaine mise à jour de ce code source en essayant d'y apporter quelques améliorations. Dans beaucoup de cas, ce genre de solution suffit largement.

Pour perfectionner les choses, on sera donc obligés d'utiliser la solution proposée par BruNews. Je vais m'y mettre bientôt. je suis sûr que ce sera passionnat et plein de découvertes.
Vive la programmation! :)

Commentaire de racpp le 20/07/2006 05:30:39 administrateur CS

Je viens de remarquer que ce programme empêche WinZip de fonctionner normalement et l'oblige à se fermer. Winrar lui, fait carrément planter le programme. Je ne sais si c'est seulement chez moi ou non.

Commentaire de Taron31 le 20/07/2006 10:06:37

En effet on dirait que WinRar effectue énormément d'appels à RegOpenKeyEx...

Commentaire de wxccxw le 23/08/2006 14:00:07

vraiment bien jouer, voila plusieur mois que je fait du hooking detouring, je vais recommencer le meme projet, sa pourrait etre un entrennament pour moi

Commentaire de pianopariss le 13/04/2007 19:23:26

Lu,

C'est un très pratique programme (même si il fait planter MSN etc.) :-).
Je me suis moi (pas tout seul) lancé dans la construction d'un antivirus, (c.f. http://www.viropy.com ) et je cherche à faire quelque chose se rapprochant mais comme l'a dit Brunews avec un driver, donc, si quelqu'un trouve quelque chose (documentation, etc.) ce serait gentil de poster ici ou bien de me le dire (MP etc.) car je pense que ça en ferait profiter tout le monde.


++, PianoPâriss.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

RegOpenKeyEx() et RegCreateKeyEx() en C [ par shadow1779 ] Bonjour,est ce que qqn pourait me fournir un exemple facil illustrant comment creer une cl&#233;e de registre en C et comment l'ouvrir, ainsi meme que Port COM [ par julienbj ] Je cherche &#224; r&#233;cup&#233;rer la liste des ports COM existant sur un ordinateur &#233;quip&#233; d'un windows. Auriez-vous une id&#233;e de la creer une clé de registre en C [ par shadow1779 ] Bonjour, j'ai trouv&#233; ca sur msdn pour creer une cl&#233; de registre en C, cepandant je n'ai vraiment pas compris donc si quelqu'un pouvait me le la base de registre [ par anonyme_man_in_this_world ] salut !! je voudrais savoir comment acceder ,ecrire et lire une valeur dans la base de registre.ça sera simpa de m'aider a trouver un tutorial su [C] Lecture éronnée de valeurs dans le registre [ par nitrique ] Bonjour,Je travaille en Dev C et j'aimerais lister les valeurs des ports com dans le registre.voici mon code:#include &lt;stdio.h&gt;#include &lt;stdl base de registre [ par anonyme_man_in_this_world ] salut !! supposant qu'une chaine de caractere est stocké sous forme de REG_DWORD ou REG_BINARY .comment puis je la lire sous forme de chaine de ca Problème de registre [ par rvkiki ] Bonjour,j'ai un petit probl&#232;me de registre. J'utilise un service pour d&#233;clencher automatiquement l'ex&#233;cution d'une appli au d&#233;marr Au secours !!! encore un pb de registre [ par rvkiki ] bonjour,je bosse toujours sur une appli dans laquelle j'impl&#233;mente un syst&#232;me de serviceLe probl&#232;me est que actuellement l'appli stocke registre de base [ par halwas ] bonne programationbonjour, je cherche &#224; savoir la marque de mon pc en utilisant la programmation et les registre de base .pa vbscript + registre [ par unionx ] salut tout le monde je me demande si il a 1 moyenne&nbsp;&nbsp;pour&nbsp; <A href="http://www.google.com/search?hl=fr&amp;q=sauvegarder


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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,608 sec (3)

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