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

时间:2018-12-21 20:37:24

标签: python winapi portable-executable

我想使用PEfile或另一个Python库枚举所有模块。我以为自己拥有了,但是后来进入WinDbg,因为缺少了一些明显的东西,而且我看到有很多缺失的东西。

对于filezilla.exe:

To be determined

这是我通过使用类似脚本从pefile获得的输出:

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   

我应该查看Pefile中是否还有其他东西,以获得要加载的模块的更完整列表?

win32api或win32con中是否有某些可以获取此信息的东西?如果可能的话,我希望使用pefile,但是两者都可以。我需要能够输出将要加载的所有模块的清单。我在Python中工作,对更改一无所知。

2 个答案:

答案 0 :(得分:1)

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

  1. 导入的DLL也可能会自己导入DLL。 foobar.exe可能取决于user32.dll,但是user32.dll反过来也取决于kernel32.dll,以便将其加载到您的进程中。如果需要完整的列表,则可能需要检查导入的DLL是否具有可执行文件的依赖性。
  2. 可以使用LoadLibrary()在代码中动态加载模块。您不会在导入目录中看到这些内容。您必须为此拆卸代码,即使这样,库名称仍可以即时生成,因此很难说出来。
  3. 还有更多不受支持的加载模块的方法,恶意软件可以使用这些模块。

如评论所述,通过调试API获取已加载模块的列表可能更简单。但这完全取决于您实际上要如何处理这些数据。

答案 1 :(得分:0)

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

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

我希望有帮助。

enter image description here