在调用导入进程之前将钩子DLL注入进程?

时间:2014-12-30 09:36:44

标签: c++ process hook dll-injection detours

我有一个目标进程,它在调用主代码之前加载DLL。它通过DLL将其名称添加到文件的ImportsTable(使用StudPE)来实现。我的目标是创建一个钩子DLL,它将注入此进程并在加载其导入之前拦截其调用。因此,目标进程将在其安全DLL之前加载我的hook dll。我尝试使用传统方法,但我没有成功,因为安全DLL总是在我的钩子DLL的DllMain被调用之前被调用。有人能告诉我一个解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:0)

DLL按顺序加载,顺序与PE头中的导入条目相同。大多数PE编辑器会让您重新排序导入。您还应该注意,如果另一个DLL X依赖于安全DLL,那么它将与DLL X同时加载。此外,如果安全DLL使用静态加载,则通过在运行时修改导入表来挂钩仍然应该是即使你的DLL稍后加载也会有效,尽管你会错过在此期间完成的调用(但不应该是任何调用)。

答案 1 :(得分:0)

您可以创建暂停的目标进程并使用CreateRemoteThread()进行注入,但请注意以下限制:

  1. 您应该将远程线程的线程主例程复制到目标进程的地址空间。
  2. 此代码不能包含任何外部引用(例如CRTL或直接WinApi调用)。我通常会将此代码限制为加载DLL并从中执行函数,或者依赖DllMain来完成所需的工作。为了调用LoadLibrary和GetProcAddress方法,我获取它们的地址和包含此信息的复制结构到目标进程,并将远程结构的地址作为CreateRemoteThread()中线程主例程的参数传递。您可以使用VirtualAllocEx()在远程进程中分配内存。
  3. 这种情况下的远程线程将在主线程之前执行,包括进程和一些Win32 / 64初始化。因此,在这种情况下,并非每个Win32 API都可以安全地调用。
  4. 如果目标进程是由其他人生成的,则必须在初始化之前拦截其创建。有一些方法可以做到这一点,所有这些方法都是无证的,因此不是未来的证据。