将所有模块加载到进程中,然后获取它们的导出

Posted

技术标签:

【中文标题】将所有模块加载到进程中,然后获取它们的导出【英文标题】:Getting all modules loaded into a process and then getting their exports 【发布时间】:2017-04-16 13:09:18 【问题描述】:

我有一个 DLL,我试图在不使用 GetModuleHandle 的情况下获取进程中的所有模块,然后在不使用 GetProcAddress 的情况下获取导出...我读了一点 PEB 结构和 PEB_LDR_DATA,但我不确定是否这是正确的道路。我不能使用它们的原因是它们接受了一个 const char* 参数,而我需要通过字符串的哈希而不是字符串本身进行比较。

【问题讨论】:

为什么不为此使用 API? 执行此操作的大多数 API 函数,据我所知,这需要您传入一个 const char*。此外,api 调用很容易被拦截。 那又怎样。这有什么问题。 我需要比较哈希并通过哈希获取模块句柄及其导出。我需要手动完成。 Module32First/Module32Next 不使用名称作为输入参数。所以你可以使用它 【参考方案1】:

是的,遍历PEB_LDR_DATA 中的列表将为您提供所有已加载的模块,但您至少应该首先尝试记录的Module32First 函数。在不持有加载程序锁的情况下遍历列表可能会有风险。

一旦您知道模块基地址,您就可以在PE file 中解析导出目录后检查导出目录。

【讨论】:

有没有办法简单地获取指向 LDR_DATA_ENTRY 的指针,这样我就可以在不使用内联 asm 的情况下遍历模块列表? 所以我可以这样做吗? PEB* peb_ = (PEB*)__readfsdword(0x30);然后从那里找到列表中的第一个条目? 您可以尝试使用 NTDLL 中未记录的 LdrLockLoaderLockLdrUnlockLoaderLock 函数获取和释放加载程序锁,或者通过专用 DLL 的 DllMain 中的 PEB_LDR_DATA(同时避免调用几乎任何其他有趣的 API)。

以上是关于将所有模块加载到进程中,然后获取它们的导出的主要内容,如果未能解决你的问题,请参考以下文章

枚举进程加载模块

枚举进程加载模块

枚举进程加载模块

枚举进程加载模块

枚举进程加载模块

Node中的模块系统