可以使用 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 吗?的主要内容,如果未能解决你的问题,请参考以下文章