Hook DLL [Résolu]

Signaler
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008
-
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour,





Voilà, j'ai écris une petite DLL de hook pour une certaine fonction de
l'API win32, je voulais tout simplement savoir comment la charger dans
tous les programmes existants en memoire j'ai fait un petit programme
client qui lance le hook de la DLL, cela fait que tous les appels à la
fonction hooked dérivent correctement vers la fonction faite-maison,
mais est-ce que la dérivation sera bien effectuée pour les autres
progrs en memoire ? La DLL est-elle bien chargee dans tous les prog
dans la memoire ?





Voila, Merci.

18 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Je ne suis pas sur, mais normalement la DLL est chargée automatiquement dans tous les processus, sinon le hook ne marcherait pas
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Il te faut la même convention d'appel sur la tienne que pour celle déroutée sinon registre ESP non remplacé et erreur stack.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Je le pense aussi, Merci Vecchio.

Une derniere question : l'appel de la fonction faite-maison est bien
effeectué mais apres la sortie de celle-ci j'ai une erreur fatale
concernant la convention d'appel, quelle serait diferente d'une autre
ou un truc comme ça (c'est peut-etre parce que je n'ai pas mis les
memes arguments dans la fonction faite-mason que l'originale ?), dans
la DLL je l'ai mise en __stdcall.

Une idee ?

encore Merci.
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Oui c'est exact c'est un probleme d'ESP (pourquoi ESP non remplacé ?)

Je trouverai donc la convention d'appel de la fonction API sur msdn je suppose...



Merci !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
replacé voulais-je dire ('m' a accroché en tapant).

Quasi toute API est en stdcall à part certaines de l'API native en fastcall et wsprintf en cdecl.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Ok merci, mais lors du remplacement de l'adresse dans l'import address table j'ai une erreur de type :



<hr size= "2" width="100%">cannot convert from 'int (__stdcall *)(struct
HKEY__ *,const char *,unsigned long,char *,unsigned long,unsigned
long,struct _SECURITY_ATTRIBUTES *,struct HKEY

__ ** ,unsigned long *)' to 'int (__stdcall *)(void)'

This conversion requires a reinterpret_cast, a C-style cast or function-style cast

<hr size ="2" width="100%">

J'ai defini les 2 addresses avec PROC... Faire un cast serait vraiment
propre ? si oui je le fais comment (dans le cas de ces fonctions)

Merc.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
long (WINAPI *pMyRegFunc)(HKEY, LPCTSTR, ULONG, LPTSTR, ULONG, ULONG, LPSECURITY_ATTRIBUTES, PHKEY, PULONG);
*(DWORD*)&pMyRegFunc = (DWORD) addrRecup;

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Je dois donc d'abord faire ça avant de remplacer l'adresse dans l'import table address ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Regarde exemple dans source de arnotic.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Sinon ici en kernel mode, c'est radical:
http://dev.winsysdev.com/viewsrc.php?id=28

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

ok merci...

mais pour en revenir a ton bout de code :





long (WINAPI *pMyRegFunc)(HKEY, LPCTSTR, ULONG, LPTSTR, ULONG, ULONG, LPSECURITY_ATTRIBUTES, PHKEY, PULONG);

*(DWORD*)&pMyRegFunc = (DWORD) addrRecup;



tu fais pointer pMyRegFunc sur la fonction de remplacement et apres
il faudrait modifier l'adresse dans l'import address table avec ce
pointeur de fonction ? ce serait de la donc que viendrait l'erreur de
cast ?



Encore merci (j'ai pas pu encore essaye je suis pas chez moi)

Ciao.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
Le mieux est d'aller voir les sources et tu demandes explications sur place si besoin.
Pour terminer avec ta question initiale, la dll hook ne sera pas mappée dans les processus system. Pour réellement toucher à la table d'import du système il faut passer au kernel mode.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

ok merci !


mais en ce qui concerne ma source je me suis inspire de celle-ci : http://www.cppfrance.com/code.aspx?ID=32374

dans cette source, une modification de la table import effectuée...



PS : quand tu dis la dll hook ne sera pas mappée dans les processus system tu veux dire quoi ? les processus reservés au system ?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
WMI, LSASS etc... un hook user mode n'a jamais prise sur eux.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Ha ok je comprends...



Je voulais savoir, dans le petit programme qui injecte la DLL j'utilise
SetWindowHookEx et je voulais savoir si la DLL etait bien injectée dans
les processus en marche (mise a part les processus system) ?

Et si oui le hook devrait avoir effet sur tous les programmes en marche utilisant la fonction API spécifiée n'est-ce pas ?



Ou si la DLL n'est pas injectée automatiquement, je devrai utiliser
VirtualAlloc, WriteProcessMemory, CrateRemoteThread et sa bande ?



Encore merci de prêter attention a mon topic :-)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
C'est le hook OU CreateRemoteThread mais pas les 2. Si hook le system mappera code de la dll dans tous les processus "normaux". Tu peux faire un log fichier et écrire le nom des modules dans lequel elle entre, utiliser GetModuleFilename pour cela.

Je ne pense pas que CreateRemoteThread passera sur les process system mais tu peux essayer, on verra bien. Si vraiment tu veux dérouter pour tout le systeme, je pense que le kernel mode est plus approprié mais nettement plus délicat à faire.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++
Messages postés
199
Date d'inscription
vendredi 16 avril 2004
Statut
Membre
Dernière intervention
28 février 2008

Ha je comprends mieux, moi j'ai utilisé le hook même si le
CreateRemoteThread reste intéréssant (attention aux prochains SP tout
de même si MS decide de la jouer la secu). Je ne souhaite pas dérouter
tout le system nan, donc le hook fera l'affaire...



Pour le debugging j'affiche dans une MessageBox le path du prog qui utilise la DLL.

Je tiens compte de tes conseils concernant le kernel mode pour un hook integral.



Merci beaucoup, et aurevoir !
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
MessageBox surtout jamais dans l'initialisation d'un hook, tu risques un timeout excessif et en ce cas Windows considèrera qu'il y a un problème donc ne mappera pas dans le process. Sans parler de tant de cas où ça pourrait embarquer le systeme dans des boucles infinies.

ciao...
http://dev.winsysdev.com
BruNews, MVP VC++