我只是想了解修补内核和编写驱动程序的区别。
我的理解是内核模式驱动程序可以做任何内核可以做的事情,并且在某些方面类似于 linux 模块。
那么,当微软阻止他们修补 Windows 内核时,为什么 AV 制造商会如此沮丧呢?
你可以通过内核补丁来做哪些你不能通过驱动程序做的事情?
在这种情况下,修补内核意味着修改其(未记录的?)内部结构以实现某些功能,通常挂钩各种功能(例如打开文件)。你不应该乱搞不属于你的内部内核结构。过去微软官方没有提供一些东西的钩子,所以安全公司对内部进行逆向工程,直接钩子内核。最近微软官方提供了一些东西的hook,所以直接hook内核的需求没有那么强。
确实,内核模式驱动程序可以做任何内核可以做的事情——毕竟,它们都在 ring 0 中运行。这里的关键问题是:这有多难?修补事物依赖于可能在不同内核版本之间发生变化的内部细节。例如,系统调用号NtTerminateProcess
会在版本之间发生变化,因此挂钩SSDT的驱动程序会在版本之间中断(尽管可以通过其他方式获得系统调用号)。读取或修改内部结构的字段,例如EPROCESS
orETHREAD
也是有风险的,因为这些结构在版本之间会发生变化。对于司机来说,这一切都不是不可能做到的,但这很难。
如果提供了官方的 hooking 接口,Microsoft 可以保证版本之间的兼容性以及能够控制谁可以做什么(例如,只有签名的驱动程序可以使用对象管理器回调)。但是,微软不能对所有事情都这样做,因为有些事情只是驱动程序不应该知道的实现细节。