3

問題が発生しました。マシン上のすべてのプロセスのすべてのモジュール (dll ファイル) を取得しようとします。CMDでこのコマンドを実行しようとしました:

tasklist /m

しかし、これは 64 ビット システムの問題です。64 ビット マシンで 32 ビット プログラムを実行している場合、すべてのモジュールが一覧表示されるわけではありません。

ntdll.dll, wow64.dll, wow64win.dll, wow64cpu.dll

次に、pywin32 (win32api) を使用して、Python スクリプトでこれを実行しようとしました。

これはコードです:

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("--------------")

しかし、結果は同じです。=(各プロセスでロードされたすべてのdllファイルを確認する方法を教えてください。

PSコマンドライン、タスクリスト(ListDlls、Process Explorerなどではありません)、またはPythonのスクリプトなどの標準的なWindowsツールのみを使用できます。

本当にありがとうございました!

4

1 に答える 1

4

EnumProcessModulesPython と同じビットネスのプロセスを表示するだけです。代わりに、 で呼び出しEnumProcessModulesExますdwFilterFlag=LIST_MODULES_ALL

現在のコードには、最近追加されたばかりで、標準ライブラリにないwin32apiモジュールが必要です。標準ライブラリのみを使用するソリューションを次に示します。EnumProcessModulesEx

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)
于 2013-07-04T20:40:26.923 に答える