我正在尝试使用CreateRemoteThread将我的代码注入另一个进程,但是如果我的代码是在进程加载DLL时注入的,则线程将被冻结,直到加载DLL(根据MSDN,它是正常的)。我试图通过注入代码并等待结果然后检查EAX来检测是否加载了进程,但它非常慢。
所以,我正在寻找检查进程是否仍在加载DLL的方法,或者它已经加载了所有DLL,我可以调用CreateRemoteThread来等待我的代码立即执行。
答案 0 :(得分:1)
使用Debug API,将目标进程作为debugee运行并让您的注入过程成为“调试器”,然后您将获知所有DLL加载/卸载事件以及加载进程的时间并准备好运行(你点击“加载器断点”)。对于x64来说它变得更加复杂,如果你试图注入托管代码,它仍然会更加复杂。但它运行良好。
我有几个使用此方法的工具(here和here)没有可用的源代码,抱歉。
如果您要做的是挂钩各种API,那么执行此操作的规范方法是始终挂钩LoadLibrary()
,以便您可以挂钩在进程运行时加载的任何新DLL。但是,我仍然觉得使用debug api来控制目标进程很有用,因为它可以让你更快地挂钩(在加载器断点处,在你恢复进程之前)。
答案 1 :(得分:0)
由于您已经有HANDLE
目标流程,请在致电WaitForInputIdle()
之前尝试使用CreateRemoteThread()
。