Comment utiliser ZwQueryInformationProcess pour obtenir ProcessImageFileName dans un pilote de noyau?
Je suis en train d'écrire un simple pilote de noyau pour mon application (pensez à un de très simple, l'application anti-malware.)
J'ai accroché ZwOpenFile()
et utilisé PsGetCurrentProcess()
pour obtenir un handle pour le processus appelant.
Elle renvoie une PEPROCESS structure:
PEPROCESS proc = PsGetCurrentProcess();
Je suis en utilisant ZwQueryInformationProcess()
pour obtenir le PID
et ImageFileName
:
DbgPrint("ZwOpenFile Called...\n");
DbgPrint("PID: %d\n", PsGetProcessId(proc));
DbgPrint("ImageFileName: %.16s\n", PsGetProcessImageFileName(proc));
et essayer d'obtenir le processus FullPath
de cette façon (mais je reçois BSOD):
WCHAR strBuffer[260];
UNICODE_STRING str;
//initialize
str.Buffer = strBuffer;
str.Length = 0x0;
str.MaximumLength = sizeof(strBuffer);
//note that the seconds arg (27) is ProcessImageFileName
ZwQueryInformationProcess(proc, 27, &str, sizeof(str), NULL);
DbgPrint("FullPath: %wZ\n", str.Buffer);
Comme vous le voyez str.Buffer
est vide ou rempli d'ordures. Peut-être un débordement de la mémoire tampon pendant le remplissage du str
via ZwQueryInformationProcess()
déclenche le BSOD.
Toute aide serait appréciée.
OriginalL'auteur fardjad | 2010-09-14
Vous devez vous connecter pour publier un commentaire.
MSDN docs pour cette API indiquent que
Avec cela à l'esprit, je suggère que vous essayez de modifier votre tampon structure comme ceci:
En outre, votre code doit de vérifier et de gérer les cas d'erreur décrit dans la documentation ici. Cela peut être la raison pour laquelle vous avez raté le BSOD déclencher des cas.
OriginalL'auteur Steve Townsend
//Déclarer ce morceau de code dans le fichier d'en-tête si disponible, sinon avant la définition de la Fonction..
//Définition De La Fonction De
//Appel de la fonction.. Écrire ce bout de code dans PreOperation de retour d'Appel et requête d'interruption doit être PASSIVE_LEVEL
dans fullPath variable il est Chemin d'accès Complet de Processus .. Comme si le processus est explorer.exe ensuite, le chemin sera ressembler à ceci:-
Remarque:- \Device\HarddiskVolume3 Chemin d'accès peut être modifié en raison de la Machine et de volumes différents dans le disque dur c'est un exemple dans mon cas.
OriginalL'auteur Kashif Meo
ZwQueryInformationProcess
besoin d'unHANDLE
, pas unPROCESS
!Vous avez besoin d'utiliser
ObOpenObjectByPointer
pour obtenir le handle de la première.OriginalL'auteur Alex