可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?

Posted

技术标签:

【中文标题】可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?【英文标题】:Can Microsoft Detours be used to hook system-wide calls without injecting into every proc? 【发布时间】:2017-09-26 05:27:47 【问题描述】:

我想将 每个 调用挂接到 CreateProcess(以及一些其他相关的 API),无论过程如何。可以使用现代 Detours 来做到这一点,而无需枚举所有进程并执行注入吗?

我已经阅读了几篇关于 API 挂钩和专门使用 Detours 的文章,回复:

API Hooking with MS Detours

API Hooking with MS Detours (InfoSec Institute)

API Hooking Revealed

我对这些文章有两个问题:

    它们已经很老了,情况可能已经发生了变化。

    他们没有专门使用 Detours 彻底解决系统范围的挂钩问题。

我知道这可以通过驱动程序完成,但据说 Detours 是一个强大的工具,并且目前仍受支持,所以我想知道如何使用 Detours 完成。

到目前为止,我阅读的文献都是针对使用 Detours 的特定程序,虽然它提出了如何枚举每个进程并执行 DLL 注入然后尝试使用 Detours 的想法,但这似乎像一个非常不可靠的方式。

【问题讨论】:

你了解绕道的工作原理吗?你真的希望一个你不注入的过程被绕道吗? 是的,但我发现很难相信这可能是一种连接此类广泛调用的可行方法,例如用于防病毒或黑客软件。我的假设错了吗? 您认为某个随机过程会在您不要求的情况下开始向您发送消息。如果您真的考虑过什么是弯路,您可以回答自己的问题。 @the_endian:防病毒、防火墙等的运行级别远低于用户级应用程序通常运行的级别。他们使用定制的系统驱动程序、低级系统挂钩和回调等。挂钩CreateProcess 是针对低级问题的高级方法。这听起来像XY Problem。 @the_endian 不,它没有。它只是直接在内存中修补功能。所以它不能跨越进程边界。阅读 technical paper,它解释了 Detours 是如何实际工作的 【参考方案1】:

没有

如果没有按进程注入,则无法全局使用 Detours。

但是,当您想在系统已经运行后设置初始挂钩时,您只需要手动枚举进程一次。一种选择(如果您小心的话)是使用AppInit_DLLs Registry setting 将您的DLL 加载到新进程中(好吧,至少是使用user32.dll 的进程,并且不会选择不让AppInit_DLLs运行,并提供 AppInit_DLLs is even enabled on the system 开始)。

否则,另一种方法是编写一个内核驱动程序来实现通过PsSetCreateProcessNotifyRoutine() 注册的process creation callback。每次创建或销毁进程时都会调用该回调。

【讨论】:

AppInit_DLLs should be renamed Deadlock_Or_Crash_Randomly_DLLs. 在 2017 年,AppInit_Dlls 并没有比现在更频繁。请参阅:reverseengineering.stackexchange.com/a/16329/3939 此外,它注入“每个新进程的声明总是是错误的。 @IInspectable:Raymond 的论点在那里非常薄弱。表示不要从DllMain 调用LoadLibrary 的guideline 类似于说不要从DllMain 调用CreateThread 的准则。它本身很好。当您做出无法保证的假设(例如,当LoadLibrary 返回时初始化 DLL)或采取额外步骤(在您创建的线程上等待)时,问题就开始了)。 如果您知道自己在做什么,那么两者都可以。这些指南适用于不了解的人,MSDN 为他们提供了一个安全缓冲区,限制性更强。

以上是关于可以使用 Microsoft Detours 来挂钩系统范围的调用而不注入每个 proc 吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Microsoft Detours - 一堆未定义的

构建 32 位 Detours 库

Microsoft Detours 如何工作以及如何使用它来获取堆栈跟踪?

Microsoft Detours 2.1简介

C/C++ Detours 库 - 在哪里可以找到?

Detours简介 (拦截x86机器上的任意的win32 API函数)