REGISTRY GUARD BETA

MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008 - 17 juil. 2006 à 19:24
pianopariss Messages postés 6 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 13 avril 2007 - 13 avril 2007 à 19:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38646-registry-guard-beta

pianopariss Messages postés 6 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 13 avril 2007
13 avril 2007 à 19:23
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.
wxccxw Messages postés 755 Date d'inscription samedi 15 mai 2004 Statut Membre Dernière intervention 30 janvier 2011
23 août 2006 à 14:00
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
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
20 juil. 2006 à 10:06
En effet on dirait que WinRar effectue énormément d'appels à RegOpenKeyEx...
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 juil. 2006 à 05:30
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.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
20 juil. 2006 à 05:13
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! :)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
19 juil. 2006 à 00:05
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.
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
18 juil. 2006 à 23:59
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
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
18 juil. 2006 à 23:38
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.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juil. 2006 à 23:33
Version Win2003 SP1 à installer, couvre depuis Win2000.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juil. 2006 à 23:29
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.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
18 juil. 2006 à 23:11
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?
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
18 juil. 2006 à 23:10
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...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juil. 2006 à 22:55
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.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
18 juil. 2006 à 22:33
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?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
18 juil. 2006 à 22:18
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.
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
18 juil. 2006 à 21:53
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.
Taron31 Messages postés 199 Date d'inscription vendredi 16 avril 2004 Statut Membre Dernière intervention 28 février 2008
18 juil. 2006 à 12:33
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.
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
18 juil. 2006 à 12:06
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
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
18 juil. 2006 à 04:12
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.
MuPuF Messages postés 536 Date d'inscription mercredi 27 avril 2005 Statut Membre Dernière intervention 22 août 2008
17 juil. 2006 à 19:24
Bonne chance Taron, tu va y arriver !

Signé, le lacheur ;-D
Rejoignez-nous