0

在 c++ 中,我想将多个 dll 挂接到一个进程。现在我使用CreateProcesswithdll()which 一次只能挂钩一个 api。我该怎么做才能注入多个 dll?

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

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

谢谢!

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

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

4

3 回答 3

2

似乎detourattach并且detourdetach会为我解决问题。谢谢大家!

我发现这个博客很有用!

于 2011-05-27T18:37:37.027 回答
2

从 DLLMain()调用LoadLibrary() 和 FreeLibrary() 是不安全的。来自 TFA:

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

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

于 2011-05-27T20:52:09.617 回答
1

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

编辑。

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

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

于 2011-05-26T19:04:07.697 回答