c++ - 在调用导入之前将钩子(Hook) DLL 注入(inject)到进程中?

标签 c++ process hook dll-injection detours

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

最佳答案

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

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

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

关于c++ - 在调用导入之前将钩子(Hook) DLL 注入(inject)到进程中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27702893/

相关文章:

c# - VSTO Windows Hook keydown 事件调用 10 次

c++ - 在 C++ 中放置内联函数的最佳实践

c++ - 为什么使用 'int' 数据类型而不是 'float' 数据类型?

c++ - gstreamer audiomixer 命令到代码转换

objective-c - 如何获得 NSTask 进程的子进程?

python - 启动进程后,如何在 child 中获取 parent 的PID?

ruby-on-rails - 如何为非 Web 前端进程设置监控?

c++ - 可变参数模板将参数解包到类型名

C# 低级键盘钩子(Hook)不工作

c++ - 暂停低级 Hook 的最佳方法(winapi)