【问题标题】:How does software like scylla find the start of a pe file像scylla这样的软件如何找到pe文件的开头
【发布时间】:2019-06-03 18:08:42
【问题描述】:

我正在从进程中转储一个pe 文件,并想知道它是如何在memory 中找到pe 文件的。

起初我以为它在寻找DOS 字符串,但软件声明它可以找到未根据文档加载的pe 文件,所以这是不可能的。

【问题讨论】:

  • 嗯,它可能可以查找 PE 标头,与查找 MZ 标头的方法相同。看看 Unix file 实用程序、libmagic 库和 binmiscctl 实用程序。
  • 我的回答是否需要任何澄清或改进才能回答您的问题?如果有,请回复,我会尽力改进。接受答案向更广泛的社区表明您找到了解决方案,并为回答者和您自己提供了一些声誉。没有义务这样做。

标签: windows reverse-engineering


【解决方案1】:

如果使用 Windows 操作系统加载程序或 LoadLibrary 以正常方式加载模块,则有很多方法可以在内存中找到加载的模块,因为进程环境块或 PEB 包含一个指向名为“Ldr”的 PEB_LDR_DATA 结构的指针,该结构包含一个链接所有已加载模块的列表。这与 Windows 操作系统在使用 API ToolHelp32Snapshot 时使用的加载模块列表相同。

如果模块已从此 Ldr.InMemoryOrderList 中删除,或者可能使用手动映射例程加载,则这是不可能的,在这种情况下,您可以通过扫描内存中可预测的 PE 标头来检测模块。

如果PE Header被删除并且模块不在链表中,这是可能的,那么这将变得更加困难。您需要使用某种启发式方法来检测 PE 文件(例如 DLL)的某种可预测性。

例如,您拥有进程的 PE 文件,因此您知道执行了哪些导入和重定位您知道加载了哪些模块以及加载位置,因此如果您发现这些位置之外的内存页面已将页面保护设置为可执行,那么您可以非常确信这些属于隐藏的或至少是未知的模块。

这里有 2 个优秀的 repos,它们可能会对 Hollows HunterPE-Sieve 主题有所启发

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多