我正在尝试使用Python pefile提取.text并进行一些反汇编。我在这方面很成功。我还希望能够对与二进制映像关联的所有DLL进行相同的处理。我还无法弄清楚该怎么做,我不确定pefile是否可行。
我可以使用pefile枚举可执行文件导入的所有DLL。这很容易做到,而不是问题。然后如何使用Python或pefile查找DLL的绝对路径,以便随后从每个DLL中提取.text?
我研究过的一种方法是简单地找到所有DLL的绝对路径。我进行了广泛的搜索,但没有找到在Python中执行此操作的方法。如果我可以找到绝对路径,即文件位置,那么我可以去提取.text节吗?
另一种可能是创建一个进程,然后尝试以这种方式获取DLL位置。这可以通过使用来自kernel32的GetModuleHandleW来完成,可以与win32api一起使用。我想尽可能避免这种解决方案。为了执行此功能,首先需要使其成为一个过程。即使执行此操作,该函数的参数也需要一个句柄,而且我不确定如何以句柄的形式获取DLL。但再次,我想避免使可执行文件成为一个进程。如果有人对如何进行这项工作提出建议,那将是很好的,尽管我不愿这样做,因为我希望没有一个可执行文件成为活跃进程。
我关心但没有看过的另一种可能性是让pefile枚举所有DLL,然后在硬盘上搜索它们。这可能是不准确的,因为可能存在多个同名的DLL,并且搜索所有这些DLL都将花费很长时间。
我认识到ASLR将与许多DLL一起使用。我对此并不担心,因为我只是在寻找补偿。我在这里只考虑格式正确的非恶意PE。我只能考虑Python解决方案。
我希望找到一种优雅的方法来实现此目的,方法是能够找到所有DLL的文件位置/绝对路径名,或者找到一种使用Pefile能够从某种方式提取.text的方法。可执行文件的导入DLL,而无需向其提供每个DLL的文件位置。
答案 0 :(得分:2)
PE文件不包含有关其所需模块的绝对路径的信息,并且无法从PE文件中解析出该文件。您可以做的是模拟操作系统使用LoadLibraryEx
查找这些文件的方式(传递LOAD_LIBRARY_AS_DATAFILE
标志will load the module without running any code),然后将这些路径传递给pefile。
答案 1 :(得分:0)
正如@mnistic建议的那样,带有设置为数据加载标志的LoadLibraryEX将起作用,如果您想显式计算路径并检查磁盘文件,则应参阅DLL Search order
在此之下,请注意桌面应用程序的标准搜索顺序
部分从根本上讲,您必须模拟ldr
在做什么。