使用Python(pefile/win32api)枚举二进制文件的所有模块

2024-05-23 21:35:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我想使用PEfile或其他Python库来枚举所有模块。我以为我有,但后来我进入WinDbg,因为一些明显的失踪,我看到有一些失踪的。你知道吗

为了文件zilla.exe地址:

00400000 00fe7000   image00400000 image00400000
01c70000 01ecc000   combase  C:\WINDOWS\SysWOW64\combase.dll
6f590000 6f5ac000   SRVCLI   C:\WINDOWS\SysWOW64\SRVCLI.DLL
6f640000 6f844000   COMCTL32 C:\WINDOWS\WinSxS\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.17134.472_none_42ecd1cc44e43e73\COMCTL32.DLL
70610000 7061b000   NETUTILS C:\WINDOWS\SysWOW64\NETUTILS.DLL
70720000 70733000   NETAPI32 C:\WINDOWS\SysWOW64\NETAPI32.dll
72910000 72933000   winmmbase C:\WINDOWS\SysWOW64\winmmbase.dll
729d0000 729d8000   WSOCK32  C:\WINDOWS\SysWOW64\WSOCK32.DLL
72b40000 72b64000   WINMM    C:\WINDOWS\SysWOW64\WINMM.DLL
72b70000 72b88000   MPR      C:\WINDOWS\SysWOW64\MPR.DLL
73c60000 73c6a000   CRYPTBASE C:\WINDOWS\SysWOW64\CRYPTBASE.dll
73c70000 73c90000   SspiCli  C:\WINDOWS\SysWOW64\SspiCli.dll
74120000 741b6000   OLEAUT32 C:\WINDOWS\SysWOW64\OLEAUT32.dll
741c0000 7477a000   windows_storage C:\WINDOWS\SysWOW64\windows.storage.dll
74780000 7487c000   ole32    C:\WINDOWS\SysWOW64\ole32.dll
74880000 74908000   shcore   C:\WINDOWS\SysWOW64\shcore.dll
74910000 7498d000   msvcp_win C:\WINDOWS\SysWOW64\msvcp_win.dll
74990000 74a4f000   msvcrt   C:\WINDOWS\SysWOW64\msvcrt.dll
74a50000 74a72000   GDI32    C:\WINDOWS\SysWOW64\GDI32.dll
74bd0000 74bde000   MSASN1   C:\WINDOWS\SysWOW64\MSASN1.dll
74be0000 74c47000   WS2_32   C:\WINDOWS\SysWOW64\WS2_32.dll
74c70000 74d30000   RPCRT4   C:\WINDOWS\SysWOW64\RPCRT4.dll
74d30000 74d37000   Normaliz C:\WINDOWS\SysWOW64\Normaliz.dll
74d40000 74d79000   cfgmgr32 C:\WINDOWS\SysWOW64\cfgmgr32.dll
74fe0000 75025000   powrprof C:\WINDOWS\SysWOW64\powrprof.dll
75150000 7526e000   ucrtbase C:\WINDOWS\SysWOW64\ucrtbase.dll
75280000 75416000   CRYPT32  C:\WINDOWS\SysWOW64\CRYPT32.dll
75420000 75584000   gdi32full C:\WINDOWS\SysWOW64\gdi32full.dll
755c0000 755c8000   FLTLIB   C:\WINDOWS\SysWOW64\FLTLIB.DLL
755d0000 755e8000   profapi  C:\WINDOWS\SysWOW64\profapi.dll
755f0000 75635000   SHLWAPI  C:\WINDOWS\SysWOW64\SHLWAPI.dll
75640000 7698a000   SHELL32  C:\WINDOWS\SysWOW64\SHELL32.dll
76990000 76b74000   KERNELBASE C:\WINDOWS\SysWOW64\KERNELBASE.dll
76cf0000 76cff000   kernel_appcore C:\WINDOWS\SysWOW64\kernel.appcore.dll
76d00000 76d17000   win32u   C:\WINDOWS\SysWOW64\win32u.dll
76db0000 76e86000   COMDLG32 C:\WINDOWS\SysWOW64\COMDLG32.DLL
76e90000 7701d000   USER32   C:\WINDOWS\SysWOW64\USER32.dll
77020000 77064000   sechost  C:\WINDOWS\SysWOW64\sechost.dll
77100000 771e0000   KERNEL32 C:\WINDOWS\SysWOW64\KERNEL32.DLL
771e0000 77238000   bcryptPrimitives C:\WINDOWS\SysWOW64\bcryptPrimitives.dll
77240000 772b8000   ADVAPI32 C:\WINDOWS\SysWOW64\ADVAPI32.dll
773b0000 77540000   ntdll    ntdll.dll   

这是我使用simlar脚本从pefile获得的输出:

ADVAPI32.dll
COMCTL32.DLL
COMDLG32.DLL
CRYPT32.dll
GDI32.dll
KERNEL32.dll
MPR.DLL
msvcrt.dll
NETAPI32.dll
Normaliz.dll
ole32.dll
OLEAUT32.dll
POWRPROF.dll
SHELL32.DLL
USER32.dll
WINMM.DLL
WS2_32.dll
WSOCK32.DLL

def findDLL():
    pe = pefile.PE(name)
    for each in pe.DIRECTORY_ENTRY_IMPORT:
        print entry.dll

在Pefile中还有什么我应该查看的,以获得将要加载的模块的更完整列表吗?你知道吗

win32api或win32con中有什么东西可以给我这些信息吗?如果可能的话,我更喜欢pefile,但两者都可以。我需要能够输出所有模块,将被加载的列表。我在用Python工作,对变化不灵活。你知道吗


Tags: 模块windowsdllmprmsvcrtwinmmgdi32ole32
2条回答

模块可以通过多种方式加载到进程中。进口DLL只是一种方式。你知道吗

  1. 导入的DLL也可以为自己导入DLL。foobar.exe可能依赖于user32.dll,但user32.dll反过来也依赖于kernel32.dll,因此将加载到进程中。如果您想要一个完整的列表,您可能需要检查导入的DLL,如果您的可执行文件的依赖关系。你知道吗
  2. 模块可以用^{}在代码中动态加载。在导入目录中看不到这些。您将不得不为此反汇编代码,即使这样,库名称也可以动态生成,因此很难判断。你知道吗
  3. 恶意软件可以使用一些更不受支持的加载模块的方法。你知道吗

正如前面提到的,通过调试api获得已加载模块的列表可能更简单。但这一切都取决于你到底想用这些数据做什么。你知道吗

事实上,有不同类型的技术可以导入模块。类型由引用的模块绑定到可执行文件的方式决定。据我所知,PEfile只列出通过Imports表静态绑定到可执行文件的动态链接库。其他类型的动态链接库有:显式的(通过LoadLibrary/GetProcAddress API调用的)、转发的(通过允许转发API调用的PE机制加载的)和延迟的(通过允许延迟加载API调用的PE机制加载的)。你知道吗

请在下面找到表示这些方法的模式(这是我的幻灯片的一部分https://winitor.com/pdf/DynamicLinkLibraries.pdf

我希望这有帮助。你知道吗

enter image description here

相关问题 更多 >