J’ai un problème. Je vais essayer d’obtenir tous les modules (fichiers dll) pour tous les processus sur ma machine. J’ai essayé de faire cette commande dans CMD:
tasklist /m
Mais c’est un problème avec les systèmes 64 bits. Si vous exécutez un programme 32 bits sur une machine 64 bits, tous les modules ne sont pas répertoriés.
ntdll.dll, wow64.dll, wow64win.dll, wow64cpu.dll
Ensuite, j’ai essayé de faire cela avec un script Python, en utilisant pywin32 (win32api).
C’est du code:
import win32security,win32file,win32api,ntsecuritycon,win32con,win32process processes = win32process.EnumProcesses() for pid in processes: dll_list = [] try: if pid: print('pid:', pid) ph = win32api.OpenProcess(win32con.MAXIMUM_ALLOWED, False, pid) dll = win32process.EnumProcessModules(ph) for dll_name in dll: dll_name_norm = win32process.GetModuleFileNameEx(ph, dll_name) dll_list.append(dll_name_norm) print("dll_list: ", dll_list) print("--------------") except: print("Error") print("--------------")
Mais le résultat est le même. = (S’il vous plaît, aidez-moi avec ceci, comment je peux voir tous les fichiers dll, charger par chaque processus.
PS Il ne peut s’agir que d’outils standard tels que la ligne de commande, la liste de tâches (NOT ListDlls, Process Explorer ou la même chose) ou le script en Python.
Merci beaucoup!
EnumProcessModules
affiche simplement les processus avec les mêmes caractéristiques que Python. Au lieu de cela, appelez EnumProcessModulesEx
avec dwFilterFlag=LIST_MODULES_ALL
.
Votre code actuel nécessite le module win32api
, qui n’a ajouté que récemment EnumProcessModulesEx
, et qui ne se trouve pas dans la bibliothèque standard. Voici une solution qui utilise uniquement la bibliothèque standard:
from ctypes import byref, create_unicode_buffer, sizeof, WinDLL from ctypes.wintypes import DWORD, HMODULE, MAX_PATH Psapi = WinDLL('Psapi.dll') Kernel32 = WinDLL('kernel32.dll') PROCESS_QUERY_INFORMATION = 0x0400 PROCESS_VM_READ = 0x0010 LIST_MODULES_ALL = 0x03 def EnumProcesses(): buf_count = 256 while True: buf = (DWORD * buf_count)() buf_size = sizeof(buf) res_size = DWORD() if not Psapi.EnumProcesses(byref(buf), buf_size, byref(res_size)): raise OSError('EnumProcesses failed') if res_size.value >= buf_size: buf_count *= 2 continue count = res_size.value // (buf_size // buf_count) return buf[:count] def EnumProcessModulesEx(hProcess): buf_count = 256 while True: buf = (HMODULE * buf_count)() buf_size = sizeof(buf) needed = DWORD() if not Psapi.EnumProcessModulesEx(hProcess, byref(buf), buf_size, byref(needed), LIST_MODULES_ALL): raise OSError('EnumProcessModulesEx failed') if buf_size < needed.value: buf_count = needed.value // (buf_size // buf_count) continue count = needed.value // (buf_size // buf_count) return map(HMODULE, buf[:count]) def GetModuleFileNameEx(hProcess, hModule): buf = create_unicode_buffer(MAX_PATH) nSize = DWORD() if not Psapi.GetModuleFileNameExW(hProcess, hModule, byref(buf), byref(nSize)): raise OSError('GetModuleFileNameEx failed') return buf.value def get_process_modules(pid): hProcess = Kernel32.OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, pid) if not hProcess: raise OSError('Could not open PID %s' % pid) try: return [ GetModuleFileNameEx(hProcess, hModule) for hModule in EnumProcessModulesEx(hProcess)] finally: Kernel32.CloseHandle(hProcess) for pid in EnumProcesses(): try: dll_list = get_process_modules(pid) print('dll_list: ', dll_list) except OSError as ose: print(str(ose)) print('-' * 14)