是否可以通过 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】:似乎detourattach
和detourdetach
对我有用。谢谢大家!
我发现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?的主要内容,如果未能解决你的问题,请参考以下文章