我正在为Windows NT编写驱动程序,为用户空间应用程序提供Ring-0访问。我想创建一个具有专有权的实用程序来执行任何用户的命令,这些命令可以免受任何外部有害影响。
浏览互联网时我发现有必要挂钩一些本机内核函数,例如NtOpenProcess
,NtTerminateProcess
,NtDublicateObject
等。我已经创建了一个保护工作的驱动程序应用程序,但后来我意识到,最好是防止外部尝试删除驱动程序或禁止在OS启动时加载像防火墙一样。我将任务分为两部分:防止从\system32\drivers\
物理删除驱动程序,并防止更改/删除负责加载驱动程序的注册表项(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
)。
问题是我不明白如何从内核空间挂钩对注册表项的访问,甚至不确定它是否可能:来自ntdll的所有与注册表一起使用的函数都在用户空间中,从内核空间不可用。我可以从用户空间设置的所有API挂钩都在特定进程的内存上下文中。所以我们需要将Dll注入到当前或新的每个进程中。
是否有方法在一个地方挂钩所有NT调用而不将Dll注入每个进程?
答案 0 :(得分:1)
你这样做的方式不对。注册表调用也是nt系统调用并驻留在SSDT中(作为另一个Zw *系统调用)。但挂钩SSDT是不好的做法。主要缺点 - 由于PathGuard,它s don
在x64系统上工作。正确的方法是使用记录的OS特定过滤机制。对于注册表调用,它是Configuration Manager回调。对于这个回调的windows xp版本有一些警告(一些设施未实现或伪造)但xp现在已经死了=)。使用起来非常简单。您可以从本指南http://msdn.microsoft.com/en-us/library/windows/hardware/ff545879(v=vs.85).aspx