应用程序如何识别 DLL 文件

逆向工程 视窗 聚乙烯 dll
2021-06-23 20:34:40

对不起,如果这是一个基本问题,因为我对此很陌生。

我试图让一个 .exe 加载一个虚拟的 .dll。我在 VC++ 2019 中创建了一个示例 .dll 项目,添加了 .exe 的导入表中列出的函数,确保声明extern "C" __declspec(dllexport),使用十六进制编辑器更改了导入表中的序数以匹配新的 .dll 并确保文件名匹配。尽管如此,当我在其文件夹中运行带有此 .dll 的 .exe 时,我收到此类错误消息:

在动态链接库 MyDll.dll 中找不到过程入口点 MyFunction2

我已经重新检查过我没有遗漏导入表中的任何函数名称,并且 .dll 中的函数名称都没有被破坏。.dll 文件中函数入口点的偏移量是否以 PE 格式硬编码?我错过了什么可能导致应用程序拒绝 .dll 的问题?

编辑:该程序不导入LoadLibrary, CreateProcessShellExecute也没有我知道的任何其他处理进程和库的函数。

3个回答

程序可能正在对 DLL 旁加载采用缓解措施,并且不会从当前目录加载 DLL。检查库的安全加载以防止 DLL 预加载攻击

您可以检查程序实际尝试使用 Process Monitor 的路径(请参阅链接文章中的使用 Process Monitor 动态检测非安全负载)。

PS 强制program.exe检查当前目录中的 DLL,创建一个名为 .dll 的空文件program.exe.local但是,如果它LoadLibrary显式调用,这可能还不够

有一种更简单的解决方案:

使用 Microsoft Detours:https : //github.com/microsoft/Detours

开发得很好,开箱即用,可以使用 nmake 在 VStudio shell 上轻松编译(只需按照构建说明进行操作),许多小示例

可以将部分(或全部)Dll-Function 绕道到您自己的代码中,而无需替换原始 Dll 或修补可执行文件,甚至可以拦截您知道地址的任何函数/方法

setdll 和 withdll 非常有用

我知道这不是一个直接的答案,但我不能在这里评论我的代表数量。

也许加载应用程序正在检查存储在加载的 DLL 中的 DLL 名称。标题中的某处有一个字段,其中包含编译时 iirc 的 dll 名称。

有可能 dll 被延迟加载并且错误消息只是具有误导性,因为错误是在 dll 加载期间而不是在检索命名函数期间引发的。

它是节表头上的第一个字段

节表头 PE 文件