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