【问题标题】:Is there a way to list all DLLs loaded in Windows by ALL processes using Python?有没有办法使用 Python 列出所有进程在 Windows 中加载的所有 DLL?
【发布时间】:2017-04-04 14:13:13
【问题描述】:

我想使用 Python 获取 Windows 上 每个 进程加载的所有 DLL 的列表

在 PowerShell 中,我可以做到:

Get-Process | Select -Expand Modules

有没有一种方法可以在 Python 中使用 Windows api 执行此操作,而无需生成命令 shell(例如,我想避免使用 subprocess.popen(...))?

【问题讨论】:

  • 你需要ctypes,还是依赖PyWin32好吗?
  • 老实说,我对 python 的熟悉程度不足以解决您的问题。我只是希望能够看到所有进程(无论是否是 python 程序)加载的 DLL。
  • PyWin32 是一个封装了 Windows API 和 COM 的扩展模块包。这是一个相当大的依赖关系,因此对于应该更轻量级的脚本,您可能更喜欢使用 ctypes,即使它需要更多的工作来定义 WinAPI 结构和函数原型。
  • 在这种情况下,ctypes。我正在改进 win32pdh 以获取所有进程信息,所以我认为我可以为这些进程的 DLL 使用同一个库。
  • win32pdh 是 PyWin32 的一部分。

标签: python windows dll process


【解决方案1】:

下面的list_processes生成器使用PyWin32调用EnumProcessesEnumProcessModulesEx。我编写它是为了临时启用SeDebugPrivilege,以便获得尽可能多的进程的虚拟内存读取访问权限。提升的管理员应具有此权限。

import os
import win32con
import win32api
import win32process
import win32security
import collections

PROCESS_QUERY_LIMITED_INFORMATION = 0x1000

def adjust_privilege(name, attr=win32security.SE_PRIVILEGE_ENABLED):
    if isinstance(name, str):
        state = (win32security.LookupPrivilegeValue(None, name), attr)
    else:
        state = name
    hToken = win32security.OpenProcessToken(win32process.GetCurrentProcess(),
                win32security.TOKEN_ALL_ACCESS)
    return win32security.AdjustTokenPrivileges(hToken, False, [state])

def get_process_modules(hProcess):
    imagepath = win32process.GetModuleFileNameEx(hProcess, None)
    imagepath_upper = imagepath.upper()
    modules = []
    for hModule in win32process.EnumProcessModulesEx(hProcess,
                        win32process.LIST_MODULES_ALL):
        modulepath = win32process.GetModuleFileNameEx(hProcess, hModule)
        if modulepath.upper() != imagepath_upper:
            modules.append(modulepath)
    return imagepath, sorted(modules)

Process = collections.namedtuple('Process', 'name path pid modules')

def list_processes():
    prev_state = adjust_privilege(win32security.SE_DEBUG_NAME)
    try:
        for pid in win32process.EnumProcesses():
            hProcess = None
            path = ''
            modules = []
            if pid == 0:
                name = 'System Idle Process'
            elif pid == 4:
                name = 'System'
            else:
                try:
                    hProcess = win32api.OpenProcess(
                        PROCESS_QUERY_LIMITED_INFORMATION |
                        win32con.PROCESS_VM_READ,
                        False, pid)
                except win32api.error:
                    try:
                        hProcess = win32api.OpenProcess(
                            PROCESS_QUERY_LIMITED_INFORMATION,
                            False, pid)
                    except win32api.error as e:
                        pass
                if hProcess:
                    try:
                        path, modules = get_process_modules(hProcess)
                    except win32process.error:
                        pass
                name = os.path.basename(path)
            yield Process(name, path, pid, modules)
    finally:
        if prev_state:
            adjust_privilege(prev_state[0])

【讨论】:

    猜你喜欢
    • 2011-07-30
    • 2021-12-30
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多