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

Posted

技术标签:

【中文标题】在调用导入之前将挂钩 DLL 注入进程?【英文标题】:Injecting a hook DLL into a process before its imports get called? 【发布时间】:2014-12-30 09:36:43 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

如果目标进程是由其他人生成的,你必须在它被初始化之前拦截它的创建。有一些方法可以做到这一点,所有这些方法都没有记录,因此没有未来的证据。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于在调用导入之前将挂钩 DLL 注入进程?的主要内容,如果未能解决你的问题,请参考以下文章

我可以将 LowLevelMouseProc 和 LowLevelKeyboardProc 放在主 EXE 中吗?

如何实现静态dll注入

是否可以通过 MS 绕道注入多个 Dll?

从非托管 dll 文件(注入到正在运行的进程中)调用托管 dll

c++ hooking ws2_32.dll recv

使用挂钩函数时应用程序崩溃