要遍历 Python 进程中的所有句柄,可以使用 ctypes
库来访问 Windows API。下面是一个示例代码:
import ctypes
import sys
kernel32 = ctypes.windll.kernel32
PROCESS_QUERY_INFORMATION =0x0400
PROCESS_VM_READ = 0x0010
def enum_windows_handles(pid):
hModule = kernel32.GetModuleHandleW("kernel32.dll")
psapi = ctypes.WinDLL("psapi.dll")
EnumProcessModules = psapi.EnumProcessModules
EnumProcessModules.restype = ctypes.c_bool
GetModuleBaseName = psapi.GetModuleBaseNameW
GetModuleBaseName.restype = ctypes.c_uint
GetModuleBaseName.argtypes = [ctypes.c_void_p, ctypes.c_void_p, ctypes.c_uint32]
hProcess = kernel32.OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, False, pid)
if hProcess:
modules = (ctypes.c_void_p * 1024)()
cbNeeded = ctypes.c_uint32()
if EnumProcessModules(hProcess, ctypes.byref(modules), ctypes.sizeof(modules), ctypes.byref(cbNeeded)):
nMods = cbNeeded.value // ctypes.sizeof(ctypes.c_void_p)
for i in range(nMods):
module = modules[i]
module_name = ctypes.create_unicode_buffer(1024)
GetModuleBaseName(hProcess, module, module_name, ctypes.sizeof(module_name))
print(module_name.value)
else:
print("Failed to enumerate modules.")
kernel32.CloseHandle(hProcess)
else:
print("Failed to open process with PID %d." % pid)
sys.exit(1)
enum_windows_handles(pid=int(sys.argv[1]))