2016-09-05 3 views
0

J'utilise les binaires pydbg téléchargés ici: http://www.lfd.uci.edu/~gohlke/pythonlibs/#pydbg comme recommandé dans les réponses précédentes.pydbg 64 bits enumerate_processes() retourner la liste vide

Je peux obtenir la version 32 bits pour fonctionner avec un interpréteur Python 32 bits, mais je ne peux pas obtenir la version 64 bits pour fonctionner avec Python 64 bits. enumerate_processes() retourne toujours une liste vide .. Est-ce que je fais quelque chose de mal?

Code d'essai:

import pydbg 

if __name__ == "__main__": 
    print(pydbg.pydbg().enumerate_processes()) 

32-bit de travail:

>C:\Python27-32\python-32bit.exe 
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:19:22) [MSC v.1500 32 bit (Intel)] on win32 
... 
>C:\Python27-32\python-32bit.exe pydbg_test.py 
[(0L, '[System Process]'), (4L, 'System'), <redacted for brevity>] 

64-bits donne une liste vide:

>python 
Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 27 2016, 15:24:40) [MSC v.1500 64 bit (AMD64)] on win32 
... 
>python pydbg_test.py 
[] 

Répondre

1

Pydbg définit la structure PROCESSENTRY32 mal.

une meilleure utilisation d'un paquet maintenu tel que psutil ou utiliser ctypes directement, par exemple .:

from ctypes import windll, Structure, c_char, sizeof 
from ctypes.wintypes import BOOL, HANDLE, DWORD, LONG, ULONG, POINTER 

class PROCESSENTRY32(Structure): 
    _fields_ = [ 
     ('dwSize', DWORD), 
     ('cntUsage', DWORD), 
     ('th32ProcessID', DWORD), 
     ('th32DefaultHeapID', POINTER(ULONG)), 
     ('th32ModuleID', DWORD), 
     ('cntThreads', DWORD), 
     ('th32ParentProcessID', DWORD), 
     ('pcPriClassBase', LONG), 
     ('dwFlags', DWORD), 
     ('szExeFile', c_char * 260), 
    ] 

windll.kernel32.CreateToolhelp32Snapshot.argtypes = [DWORD, DWORD] 
windll.kernel32.CreateToolhelp32Snapshot.restype = HANDLE 
windll.kernel32.Process32First.argtypes = [HANDLE, POINTER(PROCESSENTRY32)] 
windll.kernel32.Process32First.restype = BOOL 
windll.kernel32.Process32Next.argtypes = [HANDLE, POINTER(PROCESSENTRY32)] 
windll.kernel32.Process32Next.restype = BOOL 
windll.kernel32.CloseHandle.argtypes = [HANDLE] 
windll.kernel32.CloseHandle.restype = BOOL 

pe = PROCESSENTRY32() 
pe.dwSize = sizeof(PROCESSENTRY32) 

snapshot = windll.kernel32.CreateToolhelp32Snapshot(2, 0) 
found_proc = windll.kernel32.Process32First(snapshot, pe) 
while found_proc: 
    print(pe.th32ProcessID, pe.szExeFile) 
    found_proc = windll.kernel32.Process32Next(snapshot, pe) 

windll.kernel32.CloseHandle(snapshot)