首页 > 解决方案 > 如何挂钩 Windows x64、x86 上的任何 API 调用?

问题描述

我正在研究一种挂钩任何 API 调用以对函数执行一些验证的方法。(我正在创建一个沙盒)

我想到的第一种方法是使用注册键,并将我们自己的 dll 实现到 MicrosoftNT 中,以便能够重定向任何已定义的系统调用。https://www.apriorit.com/dev-blog/160-apihooks。问题?仅适用于 32 位,如果二进制文件正在加载 User32.dll,那么这是一个大问题。

第二种方法是将dll注入进程?简单但不可能,大多数程序都可以防止这些注入,所以这是不可能的。

我认为的最后一种方法是修改 SSDT 以更改我的函数地址并通过创建驱动程序重定向到原始地址。或者通过 InlineHook 修改我想要的每个地址的第一个字节。问题,仅适用于 32 位,因为 windows 在内核上添加了 PatchGuard,所以我们不能这样做。我们可以删除 de PatchGuard 但是,anticheat 会注意到该技术。

对于 Sandbox,我认为删除 PatchGuard 不会有问题。

主要问题是实时分析,我不知道如何在任何 Windows 操作系统上挂钩我想要的每个 API 调用。我的意思是 32 位和 62 位。我是本周开始的这个领域的初学者,所以我愿意接受任何建议。

标签: windowsdllkernelhooksandbox

解决方案


你说你想为一个沙盒挂钩每个 API 调用,然后引用 SSDT?这是两个非常不同的事情。你想挂接 VirtualQuery(Ex) 还是挂接 NtQueryVirtualMemory?从内核或用户模式?或者您可能指的是所有加载的模块导出以及内核系统服务?

WinApi

迭代所有加载的模块并安装一个事件来挂钩所有未来加载的模块。对于每一个,您将迭代所有导出并应用您偏好的钩子,这些钩子都会跳转到某个处理程序。这个处理程序应该是保留 CPU 状态的原始程序集,调用一些执行日志记录和过滤的方法,恢复 CPU 状态,最后跳转到原始状态。

系统调用

  1. 禁用 Patchguard 并将挂钩应用于服务表中的每个方法,类似于上述 WinApi 方法。由于显而易见的原因,这绝对不适合生产。

  2. 使用使用 ZwSetInformationProcess 的检测回调将大多数系统调用重定向到任意组装块。您可以在此处提取系统调用 ID 以及参数。通用支持是一个问题,因为它直到 W7 iirc 才引入,并且在 W10 之前您有很多限制。

  3. 将每个系统调用都有一个钩子的包装器模块映射到内核中每个新加载的进程。这些钩子将应​​用于 ntdll 并简单地使用系统调用 id 和参数调用 NtDeviceIoControlFile 调用,将其转发到内核驱动程序进行处理。这通常被防病毒软件用来监视用户模式系统调用,而不会中断 Patchguard。

  4. 最受认可的方法可能是回调。您可以在内核中注册进程和线程回调,在闲暇时剥离句柄访问。这将使您可以完全控制来自外部进程的进程和线程访问,并且您可以添加文件 minfilter 以类似地限制对文件系统的访问。


推荐阅读