scylla之类的软件如何找到pe文件的开头

How does software like scylla find the start of a pe file

我正在从进程中转储一个 pe 文件,想知道它是如何在 memory.

中找到 pe 文件的

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

如果使用 Windows OS Loader 或 LoadLibrary 以正常方式加载模块,则有许多方法可以在内存中找到已加载的模块,因为进程环境块或 PEB 包含指向PEB_LDR_DATA 名为 'Ldr' 的结构,其中包含所有已加载模块的链表。这与 Windows OS 在使用 API ToolHelp32Snapshot 时使用的加载模块列表相同。

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

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

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

这里有 2 个优秀的回购协议,可以阐明该主题 Hollows Hunter & PE-Sieve