【问题标题】:Enumerating all modules for a binary using Python (pefile / win32api)使用 Python (pefile / win32api) 枚举二进制文件的所有模块
【发布时间】:2018-12-21 20:37:23
【问题描述】:

我想使用 PEfile 或其他 Python 库来枚举所有模块。我以为我有,但后来我进入 WinDbg,因为一些明显的缺失了,我看到有很多缺失的。

对于 filezilla.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 中工作,对改变不灵活。

【问题讨论】:

  • PE 节中定义的静态模块与调试时加载的模块不同。这两套你想要哪一套?
  • 我希望能够访问所有将在成为进程后加载的内容。有没有办法使用 Python 静态确定这些信息,例如使用 pefile、win32api 或类似文件?
  • 否,除非使用调试 API。为什么你仍然需要这些信息?如果你对底层工作感兴趣,那么 Python 是一个糟糕的选择。
  • 您还可以使用 toolhelp32 API 获取快照(可以随时更改),但所有这些内容最好使用较低级别的语言来完成。
  • 它适用于低级工作,我同意它可能不是最好的,但我已经让它满足我的需要。它是我一直在创建的一个更大工具的一部分。

标签: python winapi portable-executable


【解决方案1】:

可以通过多种方式将模块加载到流程中。导入的 DLL 只是一种方式。

  1. 导入的 DLL 也可以自己导入 DLL。 foobar.exe 可能依赖于user32.dll,但user32.dll 反过来也依赖于kernel32.dll,以便将其加载到您的进程中。如果您想要一个完整的列表,您可能需要检查导入的 DLL 以了解您的可执行文件的依赖项。
  2. 可以使用LoadLibrary() 在代码中动态加载模块。您不会在导入目录中看到它们。您必须为此反汇编代码,即使这样库名称也可以即时生成,因此很难分辨。
  3. 还有一些更不受支持的加载恶意软件可以使用的模块的方法。

正如 cmets 所提到的,通过调试 API 获取已加载模块的列表可能更简单。但这一切都取决于您实际尝试使用这些数据做什么。

【讨论】:

    【解决方案2】:

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

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

    希望对你有帮助。

    【讨论】:

    • 我知道加载它们的其他方式。从静态分析的角度来看,我正在寻找一种通过 Python 发现这些转发和延迟的方法。它是我正在开发的一个更大工具的一部分,它将对这些工具进行一些低级别的分析。
    • 嗯,关键问题是静态枚举与动态枚举。要获得模块的“完整”枚举,必须采用动态方式(并希望采用所有路径来枚举后期绑定的模块)。
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多