是否可以通过 MS 绕道注入多个 Dll?

Posted

技术标签:

【中文标题】是否可以通过 MS 绕道注入多个 Dll?【英文标题】:is it possible to inject multiple Dlls with MS detours? 【发布时间】:2011-05-26 19:00:16 【问题描述】:

在 c++ 中,我想将多个 dll 挂接到一个进程。现在我使用CreateProcesswithdll(),它一次只能挂钩一个api。如何注入多个 dll?

我遇到了这个问题,因为 MS detours 要求我们将自定义 dll 命名为与原始 dll 相同,以便正确绕过 api 调用。因此,即使我可以在我创建的同一个 detour dll 中处理不同的 api 调用,我也需要有不同的名称来挂钩来自不同 api 的调用,这意味着我需要不同的 detour Dll。这也意味着我需要注入不同的 DLL。我说的对吗?

如果我对某些事情不清楚,我会尝试更清楚地呈现它:D

谢谢!

P.S:只是为了让我的问题更清楚。我需要在同一个进程中注入超过 1 个 dll。 CreateProcesswithdll() 创建一个新进程,其线程处于睡眠状态。在 detours 完成注入 dll 并设置 hooks 后,它会被唤醒。如果我想注入多个dll,我显然不能重复调用CreateProcesswithdll()

那我该怎么办??还是我对此的某些方面的理解有误?

【问题讨论】:

【参考方案1】:

调用 LoadLibrary() 和 FreeLibrary() 是来自 DLLMain() 的 NOT SAFE。来自 TFA:

"入口函数应该 只执行简单的初始化或 终止任务。它不能调用 LoadLibrary 或 LoadLibraryEx 函数(或调用的函数 这些功能),因为这可能 在 DLL 中创建依赖循环 加载顺序。这可能会导致 DLL 在系统有之前被使用 执行了它的初始化代码。 同样,入口点函数 不得调用 FreeLibrary 函数 (或调用 FreeLibrary 的函数) 在进程终止期间,因为 这可能会导致使用 DLL 系统执行后 终止代码。”

编辑:抱歉 - 这是对 Serge 上述回答的评论。

【讨论】:

【参考方案2】:

似乎detourattachdetourdetach 对我有用。谢谢大家!

我发现this blog 很有用!

【讨论】:

很高兴听到您找到了解决方案!请务必将您自己的答案标记为正确,这样您的问题就不会显示为未回答(不过,您可能需要稍等片刻才能这样做)【参考方案3】:

显然你可以从你注入的第一个 DLL 中加载任意数量的 DLL。

编辑。

加载 DLL 时,系统会运行您的 DLL 的 DllMain(使用 fdwReason==DLL_PROCESS_ATTACH),然后在该函数中您可以做任何您喜欢的事情,例如您可以调用LoadLibrary 来加载其他DLL。

添加: 我完全同意 cmets 从 DllMain 调用 LoadLibrary 是不安全的。因此,您可以从 DllMain 中创建的线程调用 LoadLibrary(以及所有其他棘手的事情)。

【讨论】:

@Serge 感谢您的回复!我是 Windows 编程和其他东西的新手,并不完全相信我对 detours 是如何工作的理解。因此,当您提到 detours 注入的第一个 DLL 时,您是指我首先注入的 dll 还是 Detours 在我注入的自定义 dll 之前注入一些东西?如果它没有注入任何东西,那么你的意思是说我可以从我的自定义 dll 加载更多的 dll 吗?如果是这样,那么绕道将正确绕道对该 dll 的调用。抱歉啰嗦了。只要确保我得到你的建议。 @ash:我的意思是你用 Detours 注入的 DLL。加载 DLL 时,系统运行 DLL 的 DllMain(使用 fdwReason==DLL_PROCESS_ATTACH),您可以做任何您喜欢的事情,例如您可以调用LoadLibrary 来加载其他DLL。 @Serge 再次感谢!是的,我了解 DLL 的主要机制。但是您是否建议我将新的 dll 注入到已经注入的 DLL 的 dllmain 中?我想注入多个不同的 DLL! @Serge 如果我只是加载 dll,我不认为绕道将能够连接该 dll 特定的 API ..对吗? 你不应该在 DllMain 中做任何你喜欢的事情,以免你最终与加载程序锁纠缠在一起。

以上是关于是否可以通过 MS 绕道注入多个 Dll?的主要内容,如果未能解决你的问题,请参考以下文章

MS绕道MakeFile错误

是否可以通过 app.config 将 .NET dll“注入”到另一个 .NET 应用程序中?

Dll注入:修改PE文件 IAT注入

为啥我的 DLL 只能通过手动映射注入?

PE 通过导入表注入 Dll

PE 通过导入表注入 Dll