2

我正在为 Windows NT 编写一个驱动程序,为用户空间应用程序提供 Ring-0 访问。我想制作一个具有专有权利的实用程序来执行任何用户的命令,这些命令将受到保护,不受任何外部有害影响。在网上冲浪我发现有必要挂钩一些本机内核函数,例如NtOpenProcess, NtTerminateProcess,NtDublicateObject等。我已经制作了一个可以保护应用程序的工作驱动程序,但后来我意识到最好也防止它受到外部尝试在操作系统启动期间删除驱动程序或禁止其加载,如防火墙。我将任务分为两部分:防止从物理上删除驱动程序\system32\drivers\和防止更改/删除负责加载驱动程序的注册表项(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services)。

问题是我不明白如何挂钩从内核空间对注册表项的访问,甚至不确定是否有可能:ntdll 中与注册表一起使用的所有函数都在用户空间中,从内核空间不可用。此外,我可以从用户空间设置的所有 API 挂钩都将位于特定进程的内存上下文中。因此,我们需要将 Dll 注入到每个进程中,无论是当前进程还是新进程。

有没有一种方法可以在一个地方挂钩所有 NT 调用而不将 Dll 注入每个进程?

4

1 回答 1

1

你这样做是错误的。注册表调用也是 nt 系统调用并驻留在 SSDT 中(作为另一个 Zw* 系统调用)。但是挂钩 SSDT 是不好的做法。主要缺点 -s don由于 PathGuard,它无法在 x64 系统上运行。正确的方法是使用记录在案的操作系统的特定过滤机制。对于注册表调用,它是 Configuration Manager 回调。这个回调的 windows xp 版本有一些警告(一些设施未实现或伪造)但 xp 现在已经死了=)。使用它非常简单。您可以从本指南开始(和结束 =))http://msdn.microsoft.com/en-us/library/windows/hardware/ff545879 (v=vs.85).aspx

于 2012-09-27T09:00:10.910 回答