一、Windows系统中的两种驱动程序类别
在Windows系统中,驱动程序大体上可以分为两大类,一类是功能性驱动(又称NT驱动),另一类是设备驱动(又称WDF驱动)。
功能性驱动比较简单,只包含一个sys文件,不与硬件设备相对应(即“设备管理器”中永远找不到其对应的设备),它仅仅以服务的形式在系统启动阶段被加载。


冰点还原(DeepFreeze)和内核辅助软件YDArk的sys文件都属于功能性驱动
设备驱动相对而言更复杂些,一个设备驱动除了包含一个或多个sys文件外,还包含了一个inf文件和一个cat文件,有的驱动可能还会包含EXE、DLL等其他格式的二进制文件。其中,INF文件记录了必要的硬件安装信息,包括设备类型、设备生产厂商、适用产品等信息,Windows可以据此自动安装驱动程序,而CAT文件则是记录了该驱动所包含的其他所有文件的校验值,包括inf/sys/exe/dll以及其他文件类型,用于确保驱动文件未被修改。设备驱动通常与硬件设备相对应,在“设备管理器”能够找到其对应的设备。

这是博通无线网卡的驱动,其包含了inf/cat/sys/dll文件,属于设备驱动

cat文件中包含了其他所有文件的检验值
二、Windows系统中的内核模式数字签名
关于数字签名的原理和作用,网上其他帖子和视频已经讲了很多了,因此这里重点讨论内核模式数字签名以及微软近几年的政策。
Windows系统中的数字签名模式有两种,分别是应用模式(普通模式)和内核模式。除了少数驱动如打印机驱动可以用普通模式签名外,大部分驱动都需要用内核模式签名,否则Windows将拒绝加载此驱动。

驱动程序没有内核签名将被拒绝加载
微软规定从2021年4月开始,所有新发布的证书都不可以使用内核模式给驱动签名。由于证书的有效期最长为三年,因此至今为止所有可以用内核模式签驱动的证书(即“内核证书”)都已过期。然而,目前还是有高人(比如UP本人)破解了微软的限制,可以将所有未过期的Certum证书、GlobalSign证书和Digicert G4证书变成内核证书给驱动签名,这类签名的缺点是没法通过UEFI安全启动,因为微软规定只有2015.8之前发布的证书才能过安全启动。

这是一个已过期的内核证书
那么如何用内核模式签驱动呢?
对于驱动程序的sys文件,可以用已过期的内核证书对其进行内核模式的签名且不必添加时间戳,也可以用某些未过期的证书对其进行内核签名并添加时间戳,因为Windows不会检查sys签名证书的有效期,只需确保sys签名证书是内核证书就行。当然,对于最新版的Win10/11系统,需要关闭“内核隔离”功能,否则可能无法加载这样签名的sys文件。

这是一个用过期内核证书签名的sys文件
对于驱动程序的cat文件,只能用未过期的证书对其进行签名,因为Windows将检查cat签名证书的有效期,一旦检测到证书过期就会弹出警告甚至拒绝加载驱动。


这是一个用未过期证书签名的cat文件
当然,如果你有钱,也可以将驱动提交给微软进行WHQL认证,认证通过后微软会给驱动加上WHQL签名。WHQL签名的作用等同于内核签名,但是WHQL认证巨贵,而且流程相当繁琐。

这两个是经过WHQL认证的sys和cat文件
三、两类驱动的签名方法
以下均是在不进行WHQL认证下的操作方法。
对于功能性驱动,只需用内核证书(过期/未过期均可)签名其sys文件即可。
对于设备驱动,可以用过期内核证书签名sys配合未过期证书签名cat的方式对其进行签名。这是因为,Windows在验证设备驱动的签名时,会同时检查其sys和cat文件的签名,只要二者中的任意一个具有内核签名或WHQL签名,就允许加载此驱动;而且正如上条所述,Windows只会检查cat签名证书的有效期而不会检查sys的。其实未过期内核证书(破解版)也能签名sys,但没法通过安全启动,因此签sys最好还是用2015.8之前的过期内核证书来签名。
四、对于驱动签名的常见误解
1、误解:由于微软早已禁止内核证书,因此驱动签名都需要进行WHQL认证。
正解:个人用户可以用过期的内核证书给驱动sys文件签名,签名之后照样可以正常加载,因为Windows不会检查sys证书的有效期;也可以破解微软限制让未过期的证书也变成内核证书进行签名。当然,如果是企业用户尤其是那种知名大厂,最好还是老老实实地申请WHQL认证,否则可能会收到微软的律师函。
2、误解:只有EV证书才能给驱动程序的sys或cat文件签名,OV证书和个人证书都签不上,或者签上也加载不了。
正解:未过期的个人/OV/EV证书都可以给驱动程序的cat文件签名,效果完全一样;OV/EV内核证书都可以给驱动程序的sys文件签名。
个人/企业OV/企业EV证书与驱动签名的内核/非内核证书是两套不同的分类标准,EV证书相比于个人和OV证书的最大优势在于它可以完全消除SmartScreen的拦截,且申请WHQL认证的必要条件之一是用EV证书签名一个测试文件提交给微软,否则微软将拒绝后续的认证流程。另外,内核证书中有EV证书也有OV证书甚至个人证书。因此,在不考虑WHQL的情况下,EV证书才能签名驱动的说法完全是无稽之谈。

用OV内核证书签名的SYS文件


用EV非内核证书签名的CAT文件及其在“设备管理器”中对应的设备
3、误解:若修改了驱动,则必须对其sys文件和cat文件都进行重新签名。
正解:驱动修改之后需要对哪些文件进行重新签名,其实要分情况讨论。
如果修改了功能性驱动,则需要重新签名其sys文件。
如果修改了设备驱动的sys文件,则需要根据修改后的文件重新生成一个cat,并且按上述方法对sys和cat文件分别进行签名,也可以只用未过期(破解)的内核证书给cat进行签名。
如果未修改设备驱动的sys文件,只修改了其inf/exe/dll文件或其他文件类型,但原先的sys文件没有内核签名或WHQL签名,则也需要根据修改后的文件重新生成一个cat且对sys和cat分别进行签名。当然也可以直接用破解的未过期的内核证书给cat签名,因为cat的内核签名可以代替相应sys的内核签名。
如果只修改了设备驱动的inf/exe/dll文件而未修改其sys文件,且原先的sys文件已经具有内核签名或WHQL签名,则只需重新生成cat并对该cat文件进行签名即可。
另外,由于sys/exe/dll等PE文件的数字签名不会影响其在cat文件中的检验值,因此可以先生成cat,再对这些PE文件进行数字签名。