如何在Windows x64,x86上挂接任何API调用?

问题描述 投票:0回答:1

我正在研究一种方法来挂钩任何API调用,以对该功能执行一些验证。 (我正在创建一个SandBox)

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

第二种方法是将dll注入进程吗?简单但不可能,大多数程序都不受这些注入的攻击,因此这是不可能的。

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

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

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

windows dll kernel hook sandbox
1个回答
0
投票

[您说您想挂接到沙箱的每个API调用,然后引用SSDT?那是两件事。您是否要挂钩VirtualQuery(Ex)还是要挂钩NtQueryVirtualMemory?是从内核还是用户模式?还是您指的是所有已加载的模块导出以及内核系统服务?

API迭代所有已加载的模块,并安装一个事件以挂接所有将来加载的模块。对于每个出口,您将迭代所有出口并应用您喜好的钩子,这些钩子都跳到某个处理程序。此处理程序应为原始程序集,该程序集可以保留CPU状态,调用某些方法进行日志记录,恢复CPU状态并跳转到原始方法(如果是沙盒,则可能在过滤之后)。

系统调用1.禁用Patchguard并将钩子应用于服务表中的每个方法,类似于上述API方法。由于明显的原因,这绝对不适合生产。

  1. 您可以使用'instrumentation回调,该回调使用ZwSetInformationProcess将所有(或在W10下大多数)系统调用重定向到任意程序集块。您可以在此处提取syscall ID以及参数。通用支持在这里是一个问题,因为直到W7 iirc才引入通用支持,并且在W10之前您有很多限制。

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

  3. 您可以将一个包装器模块映射到内核中每个新加载的进程,该包装器模块具有每个系统调用的钩子。这些挂钩将仅使用syscall id和参数调用NtDeviceIoControlFile调用,以将其转发到内核驱动程序进行处理。防病毒软件通常使用它来监视用户模式系统调用,而不会中断Patchguard。

© www.soinside.com 2019 - 2024. All rights reserved.