Windows驱动程序之cat文件介绍

目录

一、cat文件简介

二、cat文件应用场景

三、cat文件的生成

四、cat文件与数字签名

1、测试签名

2、微软签名

五、参考文档

一、cat文件简介

       cat即目录英文单词catalog的简写形式,.cat文件为数字签名的目录文件。.cat数字签名的目录文件可以用作任意文件集合的数字签名。目录文件包含加密哈希或指纹的集合,目录文件的每个指纹对应于驱动程序包安装的文件。Windows通过使用这些哈希或者指纹来验证驱动程序包在发布后是否未被更改。

        一般双击打开驱动包中的cat安全目录如下所示:

《Windows驱动程序之cat文件介绍》

二、cat文件应用场景

       PnP即插即用设备安装会将驱动包的签名目录文件识别为驱动包的数字签名,驱动程序的INF安装文件通过Version部分中的CatalogFile参数指定驱动程序包的目录文件。

《Windows驱动程序之cat文件介绍》

       在INF安装过程中会对INF文件中的数字签名信息进行检查,INF文件中的CatalogFile参数是必须的,否则将会安装不成功并提示INF文件不包含数字签名信息。如果将Version中的CatalogFile参数行进行删除,再使用pnputil工具对INF文件进行安装操作,那么将会提示“The third-party INF does not contain digital signature information”,如图:

《Windows驱动程序之cat文件介绍》

       另外,在INF安装过程中会对驱动程序包的cat目录文件进行检查,cat目录文件必须是经过签名的,否则也会导致INF安装失败及错误提示。例如,这里将cat目录文件替换成一个未经签名的文件,然后通过pnputil工具进行安装,如图:

《Windows驱动程序之cat文件介绍》

       在驱动程序安装过程中,系统会将cat目录文件拷贝到%SystemRoot%\CatRoot目录下,并将INF文件拷贝到%SystemRoot%\Inf目录下。比如,通过CMD查看本地的系统根目录%SystemRoot%为C:\Windows,那么这里的%SystemRoot%\INF即C:\Windows\INF目录。

       Windows要求每个驱动程序包都应该对应单独的目录文件,且具备唯一的文件名,两个不相关的驱动程序包不能共享单个目录文件,但服务于多个设备的单个驱动程序包只需一个目录文件。

三、cat文件的生成

       驱动程序安全目录的生成通过Inf2Cat.exe工具实现。Inf2Cat.exe为集成在WDK中的一个应用程序,通过下载WDK来获取。比如我本地下载的是Win11操作系统对应的WDK,Inf2Cat.exe位于<WDK安装目录>\Windows_Kits\10\bin\10.0.22000.0\x86\目录下。

       Inf2Cat.exe工具会对驱动程序包的INF文件进行检查是否存在结构错误,并验证驱动程序包是否可以为指定版本Windows版本列表,对驱动程序包的INF文件进行数字签名。如果验证没有问题,那么将生成指定Windows版本的未签名.cat目录文件。

        如下为一个输出cat文件的demo,对当前目录中的文件进行检查和验证,版本标识符为10_x64,即Windows10 x64的系统,检查和验证过程的详细信息将通过verbose参数打印出来。

Inf2Cat.exe /driver:"." /os:10_x64 /verbose

Inf2Cat.exe工具帮助命令如下:

Inf2Cat.exe /?
Version 3.3.0.0
Runs driver signability tests and creates the catalog(s).

INF2CAT /driver:path /os:operatingSystem1[,os2]...
        [/nocat] [/verbose]
        [/drm[:file1[,file2]...]]
        [/pe[:file1[,file2]...]]
        [/pageHashes[:file1][,file2]...]]

  /driver (/drv)    Indicates the path to the driver package follows.

  path              Specifies the path to the driver package.

  /os               Indicates the operating system(s) targeted by the driver
                    package follows. The targeted operating system(s) is a
                    comma separated list of the following values:

  operatingSystem1  2000

                    XP_X86           Server2003_X86
                    XP_X64           Server2003_X64
                                     Server2003_IA64

                    Vista_X86        Server2008_X86
                    Vista_X64        Server2008_X64
                                     Server2008_IA64

                    7_X86
                    7_X64            Server2008R2_X64
                                     Server2008R2_IA64

                    8_X86
                    8_X64            Server8_X64
                    8_ARM

                    6_3_X86
                    6_3_X64          Server6_3_X64
                    6_3_ARM

                    10_X86
                    10_X64           Server10_X64
                                     Server10_ARM64

                    10_AU_X86
                    10_AU_X64        Server2016_X64

                    10_RS2_X86
                    10_RS2_X64

                    10_RS3_X86
                    10_RS3_X64
                    10_RS3_ARM64
                    10_RS4_X86
                    10_RS4_X64
                    10_RS4_ARM64
                    10_RS5_X86
                    10_RS5_X64       ServerRS5_X64
                    10_RS5_ARM64     ServerRS5_ARM64
                    10_19H1_X86
                    10_19H1_X64
                    10_19H1_ARM64
                    10_VB_X86
                    10_VB_X64
                    10_VB_ARM64
                    ServerFE_X64
                    ServerFE_ARM64
                    10_CO_X64
                    10_CO_ARM64

  /uselocaltime     Use local timezone while running driver
                    timestamp verification tests. By default UTC is used.

  /nocat            Prevents the creation of the catalog(s).

  /verbose (/v)     Displays detailed console output.

  /drm              (Deprecated command line arg. Add drm signature attribute in .inf file to add drm signature attribute)

  /pe               (Deprecated command line arg. Add petrust signature attribute in .inf file to add petrust signature attribute)

  /pageHashes       Include page hashes with files.  Optionally
                    followed by a list of files.

          其中,这里并没有直接显示Win11相关版本标识符,在这里10_CO_X64即指代的Win 11  (Cobalt)。另外补充一点的是,Win11操作系统共用Win10的内核。

四、cat文件与数字签名

       如前文所述,驱动程序包中的cat目录文件必须经过数字签名,否则将导致INF安装失败及错误提示。无论cat安全目录的预期操作系统是什么,都不影响加密技术对安全目录的数字签名。

       数字签名可以用来防止软件/文件被篡改。Windows 设备安装使用数字签名来验证驱动程序包的完整性,并验证供应商 (软件发行者) 提供驱动程序包的标识。如果驱动程序包中的文件如INF文件、目录文件以及INF中CopyFiles参数相关的文件被更改,那么PnP设备安装时会认为驱动程序包的数字签名无效。另外,设备硬件或者固件的更改会涉及到HWID的修改,那么对应INF中的HWID的值需要修改,那么也会涉及到数字签名的更新,需要重新提交WHQL或者Authenticode签名。

       在对驱动程序包进行数字签名后,相关文件的属性页面将多出一个“数字签名”菜单,显示签名者姓名、摘要算法以及时间戳。如果驱动包已过微软WHQL认证,一般情况下驱动程序包的sys文件或者dll文件会同时带有厂商的签名以及微软签名,cat目录文件将会带有微软签名,即在cat目录文件的属性页面显示数字签名信息;反之,如果cat目录文件没有经过任何数字签名,那么将不会显示“数字签名”页面,如下图。因此在拿到驱动程序包之后,通过直接查看cat目录文件属性的方式也可以确认此驱动程序是否有经过微软签名。

《Windows驱动程序之cat文件介绍》

 《Windows驱动程序之cat文件介绍》

1、测试签名

        测试签名是指使用测试证书对预发行版本得驱动程序包进行签名,以在测试计算机上使用。 

        在通过Inf2Cat工具对驱动程序的INF文件生成cat目录文件之后,通过signtool工具借助测试签名文件对目录文件进行测试签名。demo如下:

signtool.exe sign /fd sha256 /f xxx.pfx /p 1234 xxx.cat

       其中,/fd 指定用于创建文件签名的文件摘要算法,默认为sha1;/f 指定文件中的签名证书,仅支持Personal Information Exchange (PFX) 文件格式, 可以使用 Pvk2Pfx 工具将 SPC 和 PVK 文件转换为 PFX 格式;/p指定打开 PFX 文件时要使用的密码。

        补充:

        生成cat目录文件之后使用signtool工具对目录文件进行数字签名,需要先准备好pfx文件。这里需要先生成一对公钥和私钥,然后进行pfx文件格式转换。主要涉及到makecert.exe以及pvk2pfx.exe工具:

makecert.exe -r -pe -a sha256 -eku 1.3.6.1.5.5.7.3.3 -n CN=Foo -sv xxx.pvk xxx.cer pvk2pfx.exe -pvk xxx.pvk -spc fwu.cer -pi 1234 -spc fwu.cer -pfx xxx.pfx

2、微软签名

       通常,测试签名驱动程序仅用于开发和测试,不得用于生产出货或者发布给客户。如要实现后者需求,驱动程序必须通过微软的正式签名。

       微软正式签名会在“创建新硬件提交”过程中完成。Parter Center用户在dashboard上传提交驱动程序包对应的.hlk包之后,后台将经历程序包验收、准备、验证、安全目录创建以及签名等过程。在这个过程中,将重新创建.cat安全目录文件,如果驱动程序包中已包含.cat目录文件,微软将用微软已签名的.cat文件替换此文件。值得一提的是,在创建新硬件提交过程中会需要指定驱动程序应包含哪些操作系统签名,这里应该与生产使用的OS对应,比如21H2或者22H1。如果只过了20H2的驱动程序搭配22H1的OS进行生产,那么这可能将不会通过WHQL测试。

       在Win10之前,微软仅对.cat文件进行签名;在Win10以后,微软将对驱动程序包中的所有可移植可执行文件进行签名。即微软签名之后的驱动程序包中的sys文件、dll文件等都会带有微软签名。

       补充:

  • 用户驱动提交微软签名认证过程:提交写好驱动程序–>HLK测试–>pass后创建.hlk文件–>提交dashboard进行“Create a new hardware submission”–>等待流程完成–>下载获取签名驱动程序包。
  • 不同Windows版本换代,如21H1至21H2,系统将允许使用之前版本操作系统的驱动程序,并提供90天的缓冲期。如Filter 81316描述如下:

《Windows驱动程序之cat文件介绍》

五、参考文档

1、Catalog Files and Digital Signatures – Windows drivers | Microsoft Docs

2、Download the Windows Driver Kit (WDK) – Windows drivers | Microsoft Docs

3、Inf2Cat – Windows drivers | Microsoft Docs

4、Components of a Driver Package – Windows drivers | Microsoft Docs

5、MakeCert – Windows drivers | Microsoft Docs

6、Pvk2Pfx – Windows drivers | Microsoft Docs

    原文作者:星河Cynthia
    原文地址: https://blog.csdn.net/VinWqx/article/details/122558565
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞