begin process at 2012 05 29 07:44:32
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Windows

 > 

Autre

 > 

Lister les process utilisant une dll


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Lister les process utilisant une dll

vendredi 13 novembre 2009 à 20:51:11 | Lister les process utilisant une dll

alphaone

Bonjour, j'aimerai obtenir tout les pids utilisant une dll que je connait d'avance, j'ai donc trouvé ce code:
http://www.cppfrance.com/code.aspx?ID=19391
Mais pas moyen d'isolé juste ce que je vaus, je sais que mais connaissance en win32 sont assez limité.
samedi 14 novembre 2009 à 16:24:54 | Re : Lister les process utilisant une dll

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Regarde ce thread (Le dernier post surtout).
Tout est basé sur CreateToolhelp32Snapshot, que ce soit la recherche des processus ou pour lister les modules (.dll, .exe...) de ces processus.
samedi 14 novembre 2009 à 16:51:09 | Re : Lister les process utilisant une dll

alphaone

J'ai fait ce code:
Code C/C++ :
bool WINAPI DLLEjecteurW(DWORD dwPid,PWSTR szDLLPath)
{
	/* Search address of module */
	MODULEENTRY32W meModule;
	meModule.dwSize = sizeof(meModule);
	HANDLE hSnapshot = NULL;
	
	hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPid);
	if(hSnapshot == NULL)
		return false;
	
	/* Search the right modules of the process */
	Module32FirstW(hSnapshot, &meModule);
	do{
		if((lstrcmpiW(meModule.szModule,szDLLPath) == 0) || (lstrcmpiW(meModule.szExePath,szDLLPath) == 0))break;
	}while(Module32NextW(hSnapshot, &meModule));
	
	/* Get handle of the process */
	HANDLE hProcess;
	
	hProcess = OpenProcess(PROCESS_ALL_ACCESS, false,dwPid);
	if(hProcess == NULL)
	{
		CloseHandle(hSnapshot);
		return false;
	}
	
	LPTHREAD_START_ROUTINE lpthThreadFunction;
	/* Get addresse of FreeLibrary in kernel32.dll */
	lpthThreadFunction = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "FreeLibrary");
	if(lpthThreadFunction == NULL)
	{
		CloseHandle(hProcess);
		CloseHandle(hSnapshot);
		return false;
	}	
	
	/* Creation the remote thread */
	DWORD dwThreadID = 0;
	HANDLE hThread = NULL;
	hThread = CreateRemoteThread(hProcess, NULL, 0, lpthThreadFunction,meModule.modBaseAddr, 0, &dwThreadID);
	if(hThread == NULL)
	{
		CloseHandle(hSnapshot);
		CloseHandle(hProcess);
		return false;
	}
	
	WaitForSingleObject(hThread,INFINITE);
	
	CloseHandle(hProcess);
	CloseHandle(hThread);
	
	return true;
}

void HardUnloadDLL(QString myDllName)
{
	//QFile theDllFile(myDllName);
	//myDllName=theDllFile.fileName();
	DEBUGCONSOLE(90,"HardUnloadDLL","start");
	HANDLE hSnapShot1;
	PROCESSENTRY32 uProcess;
	HANDLE hSnapShot2;
	MODULEENTRY32 me32;
	QString DllLoaded = "";
	QString DllLoadedName = "";
	QString DllLoadedPath = "";
	bool bResult;
	bool r;
	short NbProcess;
	NbProcess=0;

	hSnapShot1 = CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);

	uProcess.dwSize = (DWORD) sizeof(PROCESSENTRY32);

	r = Process32First(hSnapShot1, &uProcess);

	while ( r )
	{
		r = Process32Next(hSnapShot1, &uProcess);
		QString myProcessName;
		myProcessName=QString::fromWCharArray(uProcess.szExeFile);
		if (uProcess.th32ProcessID < 99999)
		{
			hSnapShot2 = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, uProcess.th32ProcessID );
			if ((int)hSnapShot2 != -1 )
			{
				me32.dwSize = sizeof(me32);
				bResult = Module32First( hSnapShot2, &me32 );
				while( bResult )
				{
						DllLoaded=QString::fromWCharArray(me32.szExePath);
						DllLoadedName=QString::fromWCharArray(me32.szModule);
						if (DllLoaded == myDllName)
						{
							DEBUGCONSOLE(90,"RegisterShellExtDll","The path: "+DllLoaded);
							DEBUGCONSOLE(90,"RegisterShellExtDll",myProcessName+" ("+QString::number(uProcess.th32ProcessID)+")");
							DLLEjecteurW(uProcess.th32ProcessID,me32.szExePath);
						}
						bResult = Module32Next( hSnapShot2, &me32 );
				}
			}
			else
			{
				DEBUGCONSOLE(90,"HardUnloadDLL","(int)hSnapShot2 != -1 for "+myProcessName+" ("+QString::number(uProcess.th32ProcessID)+")");
			}
			if(hSnapShot2)
				CloseHandle(hSnapShot2);
		}
		else
		{
			DEBUGCONSOLE(90,"HardUnloadDLL","uProcess.th32ProcessID > 99999 for "+myProcessName+" ("+QString::number(uProcess.th32ProcessID)+")");
		}
	}
	CloseHandle(hSnapShot1);
}


Il marche pour:
les process 32Bits -> dll 32Bits
les process 64Bits -> dll 64Bits
Mais pas pour:
les process 64Bits -> dll 32Bits
Comment résourdre ce probléme?


Mon projet Qt: http://ultracopier-fr.first-world.fr/
samedi 14 novembre 2009 à 18:51:08 | Re : Lister les process utilisant une dll

rt15

Membre Club Administrateur CodeS-SourceS
64 bits ? C'est quoi ?

Franchement, je sais même pas comment peut fonctionner une dll 32 bits au sein d'un processus 64 bits. Genre une fonction de la dll prend en argument une chaîne. La chaîne est adressé en 64 bits dans le processus par l'appelant. Il faut cependant donner une adresse 32 bits à la dll... Chaud !

Breuh hum.
Au fait, tu as localisé ce qui coince ? C'est le FreeLibrary qui échoue ou c'est avant ?
samedi 14 novembre 2009 à 19:27:18 | Re : Lister les process utilisant une dll

alphaone

Non je n'est hélas pu localisé ou ça coince, (je pense que je suis trop limité coté windows).


Mon projet Qt: http://ultracopier-fr.first-world.fr/
samedi 14 novembre 2009 à 20:05:46 | Re : Lister les process utilisant une dll

rt15

Membre Club Administrateur CodeS-SourceS
C'est marrant, d'après cet article, c'est impossible de charger une dll 32 bits dans un process 64 bits. C'est vrai que ça me paraît bien aussi.

Et voilà une citation de SetWindowsHookEx :

SetWindowsHookEx can be used to inject a DLL into another process. A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process. If an application requires the use of hooks in other processes, it is required that a 32-bit application call SetWindowsHookEx to inject a 32-bit DLL into 32-bit processes, and a 64-bit application call SetWindowsHookEx to inject a 64-bit DLL into 64-bit processes. The 32-bit and 64-bit DLLs must have different names.



Tu es sûr que c'est possible ?
samedi 14 novembre 2009 à 21:03:59 | Re : Lister les process utilisant une dll

alphaone

Mon but est de décharger un dll 32Bits d'un programme 32Bits depuis un programme 64Bits.
Ma dll est chargé avec sucés.
samedi 14 novembre 2009 à 21:10:39 | Re : Lister les process utilisant une dll

BruNews

Administrateur CodeS-SourceS
Pas de DLL 32 dans proces 64, c'est impossible.
En plus de la taille des params (adresses ou autres), le 64 bosse en fastcall alors que le 32 est en stdcall, ce serait badaboum au 1er appel de fonction.

ciao...
BruNews, MVP VC++
samedi 14 novembre 2009 à 21:15:05 | Re : Lister les process utilisant une dll

alphaone


Mon but est de décharger un dll 32Bits d'un programme 32Bits depuis un programme 64Bits.
Ma dll est chargé avec sucés.

Mon projet Qt: http://ultracopier-fr.first-world.fr/
samedi 14 novembre 2009 à 21:36:48 | Re : Lister les process utilisant une dll

rt15

Membre Club Administrateur CodeS-SourceS
Ah ok ! Ca me rassure.

Bon par contre c'est normal que ton programme en 64 bits ne fonctionne pas sur une dll 32.

Sur cette ligne :
Code C/C++ :
lpthThreadFunction = (LPTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "FreeLibrary");

Tu récupère un handle sur kernel32 dans ton propre processus, donc sur une kernel32... 64 bits ! De même l'adresse de FreeLibrary que tu récupères est sur 64 bits.

Donc forcément, quand tu fait CreateRemoteThread, tu lui passe cette adresse sur 64 bits qui ne correspond à rien dans l'autre processus qui a un kernel32 32 bits, et qui en plus est dans un adressage 32 bits...

Même si tu ne peux pas passer physiquement d'adresse sur 32 bits à CreateRemoteThread, il est probable que l'on peut s'en servir en mettant une adresse de 32 bits dans les 32 bits de poids faible de l'adresse sur 64 bits attendue.

Par contre, faudrait que tu trouves l'adresse de FreeLibrary dans l'autre processus... Ce qui n'est pas évident ! Tu dois cependant pouvoir récupérer l'adresse de kernel32 avec CreateToolhelp32Snapshot (Comme tu l'as fait pour ta dll à décharger), ensuite utiliser ReadProcessMemory pour exploiter le header PE et ainsi déterminer l'adresse de FreeLibrary. Mais c'est quand même assez lourd...

1 2

Cette discussion est classée dans : code, dll, process, lister


Répondre à ce message

Sujets en rapport avec ce message

Dll en c++ dans du code C [ par rurouni41 ] bonjour, je dois integrer une DLL codee en C++ dans un programme en c...Donc je voulais savoir s'il y avait moyen(et comment faire) d ouvrir et d'util Lien explicite de DLL [ par garslouche ] Bonjour,j'aimerai savoir si quelqu'un sait comment on accède à une variable (et pas à une fonction) en ayant lié explicitement une DLL ? En gros mon c (MS VCpp) Problème de variables [ par YS1 ] J'ai créé une DLL C+PP que je souhaite utiliser dans un programe VB.La fonction principale de la DLL renvoie un certain nombre de variables, qui sont gestion des exceptions dans Visual C++ 6 [ par devmail ] Bonjour a tous,je suis en cours de developpement d'un programme compose d'un prg principale et de plusieurs dll. J'ai terminer les traitements et souh DLL activeX [ par guiguimac ] Bonjour,n'ayant jamais rien fait de trés poussé en C++, j'aimerai savoir si qq'un dispose d'un tut ou d'un exemple de code permettant la réalisation d Idle - Hook - dll [ par Manson ] Bonjour,voila, j'ai trouve le code d'une dll permettant de savoirdepuis combien de temps le PC est inactif.Mais voila, elle a un probleme, quelque foi processus [ par sebseb42 ] Bonjour,voila, j'utilise l'API Process Status (PSAPI) pour lister tout les process existant ainsi que leur modules...La seul information que j'arrive Utilisation DLL SANS .lib [ par nasedo47 ] J'ai récupéré une DLL sur un site ainsi qu'une page avec les prototypes de toutes les fonctions contenues dans cette DLL.J'aimerais utiliser ces fonct Dll LoadLibrary --> Erreur [ par mortiis ] Bonjour à tous J'ai fait un prog qui devrais utiliser une dll pour faire un test j'ai fait un dll qui me fait afficher un MessageBox.Le problème est q dll et lib [ par petitou ] Salut, j'ai un problème lors de l'édition de lien à la compilation avec ma dll dans visual studio.Lorsque je crée ma dll qui utilise une lib, ça ne p


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

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