在c ++中,我想将多个dll挂钩到一个进程。现在我使用CreateProcesswithdll()
,它一次只能挂一个api。我可以做些什么来注入多个dll?
我遇到了这个问题,因为MS绕行要求我们将自定义dll命名为与原始dll相同,以便正确绕开api调用。所以即使我可以在我创建的同一个绕道dll中处理不同的api调用,我需要使用不同的名称来挂接来自不同api的调用,这意味着我需要不同的绕行Dll。这也意味着我需要注入不同的DLL。我是对的吗?
如果我不清楚某些事情,我会尝试更清楚地呈现它:D
谢谢!
P.S:只是为了让我的问题更加清晰。我需要在同一个进程上注入1个以上的dll。CreateProcesswithdll()
创建一个新进程,其线程处于睡眠状态。在完成注入dll并设置挂钩后,它会被唤醒。如果我想注入多个dll,我显然不能多次调用CreateProcesswithdll()
那我该怎么办?或者我对这个错误的某些方面的理解是什么?
答案 0 :(得分:2)
似乎detourattach
和detourdetach
似乎会为我做这个伎俩。谢谢大家!
我发现this blog很有用!
答案 1 :(得分:2)
从DLLMain()调用LoadLibrary()和FreeLibrary()为NOT SAFE。来自TFA:
“入口点功能应该 只执行简单的初始化或 终止任务。一定不要打电话 LoadLibrary或LoadLibraryEx 函数(或调用的函数) 这些功能),因为这可能 在DLL中创建依赖循环 加载订单。这可能会导致DLL 在系统使用之前使用 执行其初始化代码。 同样,入口点功能 不得调用FreeLibrary函数 (或调用FreeLibrary的函数) 在流程终止期间,因为 这可能导致使用DLL 系统执行完之后 终止码。“
编辑:道歉 - 这是对Serge上述答案的评论。
答案 2 :(得分:1)
显然,您可以从注入的第一个DLL中加载任意数量的DLL。
修改强>
当加载DLL时,系统运行你的DLL的DllMain(使用fdwReason == DLL_PROCESS_ATTACH)然后在该函数中你可以做任何你喜欢的事情,例如你可以调用LoadLibrary加载其他DLL。
添加:强> 我完全同意从DllMain调用LoadLibrary是不安全的评论。所以你可以从DllMain中创建的线程调用LoadLibrary(和所有其他棘手的东西)。