17年新年之后,就一直忙着手中的工作,这次的工作是给windows驱动程序编写预安装程序,修改好了INF文件之后,就一直尝试着给驱动进行预安装。结果是折腾了几天,也没有将驱动预安装上,那时候还不知道查看系统日志以及设备安装时的LOG,只是在设备插入之后反复观察注册表的内容,以此期待找到问题的所在。后来偶然的机会发现了设备安装后会在windows\inf文件夹下产生LOG信息,对照着LOG信息反编译了一下的DrvInst.exe文件以及setupapi.dll文件,查到了一点端倪,隐隐觉得与驱动的安全验证有关,之后在网上查了数字签名以及测试签名内容,总是隔靴搔痒的感觉,最后还是查到了《KMCS_Walkthrough.doc》的内容,引用《Rootkit系统灰色地带的潜伏者原书第2版》6.6节中对此内容的评价--”微软在名为KMCS Walkthrough的文档中详述了一些骇人听闻的细节“。
对照着内容,重新对驱动进行测安装,总算是成功了,重新审视《KMCS_Walkthrough.doc》内容,总觉得其中的一些方法与内容值得仔细研究,故决定将文档翻译出来。初次翻译,心里十分忐忑,加之英语的水平有限,所以翻译出来的东西错误难免,但总算是体会到了技术文档翻译的难处了:有时候直译出来,句子会晦涩难懂;引申出来吧,如果没有相应的技术背景,很容易理解错误。所以感觉,翻译其实也是在研究细节的过程。
《KMCS_Walkthrough.doc》涵盖的内容细节比较多,翻译出来的文档有50多页,两万多字。接下来我会分几回分别发出来,第一部分:简介、代码签名入门、代码签名工具概述。第二部分:如何给一个内核模块进行测试签名、如何安装和加载一个测试签名的驱动程序、驱动测试签名的疑难解答;第三部分:如何给一个内核模块进行发布签名、如何安装和加载一个发布签名的驱动包、驱动发布签名的疑难解答。第四部分:如何禁用测试计算机上的强制签名、资源、术语对照表。
由于翻译的工作大部分都是在8小时之外的时间,所以时间有限,加之手头上工作很多,英语水平一般,所以错误内容难免,希望之后有时间给仔细校对下,这次的内容权作记录使用吧,word版本翻译文档可以到如下地址下载:http://download.csdn.net/detail/wdzzf123/9788101。
好吧,言归正传,回到内容上来,第一部分:
摘要
内核程序必须经过数字签名才能够加载到windows Vista 64位家庭版以及之后的windows 64位家庭版操作系统中。在Vista和之后的windows所有版本中引导-启动时加载的驱动程序都需要数字签名。此外,针对下一代高质量内容的保护策略,为了某些x86系统的配置要求可能需要签名的内核程序。
§新内核的数字签名策略影响范围深远。它在Windows Vista以及之后的windows中给发行商提供了许多启示,包含以下方面:
-
软件没有签名。
发行商必须获得软件发行证书(SPC)并且使用证书给所有的64位内核程序签名。这个需求包括内核服务程序。
-
软件已经通过Windows徽标计划获得签名。
发行商可以通过微软硬件质量实验室(WHQL)的徽标给驱动包的目录文件(.cat)签名。在把驱动包提交给WHQL之前,为了进行充分的测试,发行商可以使用SPC给.cat文件签名。
-
引导-启动的驱动[1]。
有一种引导-启动的驱动的特殊情况,驱动是由windows Vista 操作系统的加载器加载,发行商必须使用一个SPC给驱动的二进制文件嵌入签名。这个需求能够确保最理想的系统启动性能。
注:强制内核模式代码签名策略适用于运行在Windows Vista上64位系统的所有内核模式软件。但是,微软鼓励发行商对所有内核模式软件,包括32位和64位平台的设备驱动程序进行数字签名。Windows Vista根据需要验证32位系统上的内核模式签名,以支持受保护的媒体内容。更多支持受保护的媒体内容,参考白皮书《Code Signing for Protected Media Components inWindows Vista》。
本文提供了一个在x64版本的Windows Vista上如何对内核模式软件进行数字签名从开始到结束的走查。此版本的文档已针对WindowsVista发行版(RTM)进行了更新,并取代了基于Windows Vista Beta2的原始文档。
此文档信息支持以下操作系统:
WindowsVista
WindowsServer 2008
此预览信息的未来版本将在Windows驱动程序工具包中提供。
当前版本的文档维护位置在:
http://www.microsoft.com/whdc/winlogo/drvsign/kmcs_walkthrough.mspx
本文讨论的参考文献和资源列在本文末尾。
免责声明
这是初版文档,本文描述的软件最终商业发布之前可能会改变。
本文档中包含的信息代表微软公司在发布之日讨论的问题当前观点。由于微软必须响应不断变化的市场条件,因此不应将其解释为微软的承诺,微软不能保证发布之后提供的所有信息的都是准确的。
本白皮书仅供参考,微软对本文档中的信息不做任何明示,暗示或法定的保证。
遵守所有适用的版权法是用户的责任。在不限制版权的情况下,未经微软公司明确书面许可,本文档的任何部分不得被复制,存储或引入检索系统,或以任何形式任何手段(包括电子,机械,复印,录制或其他)进行传播。
因为软件可能拥有涉及本文档主题的专利,专利申请,商标,版权或其他知识产权。除非微软的书面许可协议中明确规定,否则本文档不授予您对这些专利,商标,版权或其他知识产权的任何许可。
除非另有说明,本文所述的示例公司,组织,产品,域名,电子邮件地址,徽标,人物,地点和事件都是虚构的,与任何真实的公司,组织,产品,域名,电子邮件地址,标志,人物,地点或事件都是预期的或者可以推断的。
©2006-2007 MicrosoftCorporation。版权所有。
Microsoft,ActiveX,Authenticode,MSDN,Windows,WindowsServer和Windows Vista是微软在美国和或其他国家的注册商标或商标。
本文提及的实际公司和产品名称可能是其各自所有者的商标名称。
简介
本文提供了关于如何使用windows数字签名工具给内核程序签名的详细信息,该工具可支持Windows Vista以及之后的windows版本。该文档覆盖了以下几个方面:
-
从哪获得数字签名工具。
-
如何准备系统使用数字签名工具来制作,签名和测试内核模式程序。
-
列举详尽实例,涵盖了有关如何使用工具测试和发布内核模式软件并解决常见签名的相关问题。
-
如何验证数字签名。
-
如何安装已签名的内核模式程序。
-
如何强制关闭数字签名。
代码签名入门
有好几种途径可以进行创建,签名和测试内核程序。在单个计算机上完成这个文档的所有例子可以更熟悉数字签名工具。但是,本文假设每个过程使用单独的计算机,这通常是生产环境的最佳选择。
-
编译计算机
该计算机可以被用来制作驱动包。至少可以运行windows XP SP2,windows Server 2003,或者之后的Windows版本。
-
签名计算机
该计算机可以被用来对Windows Vista上的内核程序进行签名,至少可以运行windows XP SP2,windows Server 2003,或者之后的Windows版本并且可以安装数字签名的工具。
-
测试计算机
计算机可以被用来测试签名的驱动包,至少可以运行Windows Vista x64 RC1或者之后的64位Windows系统。
数字签名工具可通过以下几个途径获得:
-
Windows Server2003平台上的软件开发包(SDK)包含32位和64位windows开发资料和工具。许多工具也可被当成内核程序来使用。这些工具作为免费软件被下载。
-
Windows驱动工具包包含Windows操作系统开发的资料和工具。包括Windows硬件徽标测试和微软为测试Windows操作系统稳定性和可靠性使用的工具。
-
.NET Framwork SDK包括开发管理应用程序的资料和工具。和SDK平台同样可免费下载获得。
更多信息,参考此文档的结尾的“资源”章节。
注:SDK和WDK平台的工具不再发行。更多信息参考SDK和WDK终止用户序列号协议(EULAs)的资料。
下面的表格概略的列出了数字签名和相关工具的来源。这些来源的Link地址,参考文档结尾的“资源”章节。
数字签名和相关工具的来源
Tool | WDK | Platform SDK | Additional sources |
MakeCert | WDK | SDK | .NET SDK |
CertMgr | WDK | SDK | .NET SDK |
SignTool | WDK | SDK |
|
Capicom.dll v.2.1.0.1 | WDK | SDK | Download Center |
MakeCat | WDK | SDK |
|
Signability | WDK |
|
|
Inf2Cat |
|
| Winqual submission tools |
PVK2PFX | WDK | SDK |
|
SelfSign_example | WDK |
|
|
代码签名工具概述
上个表中的代码签名工具既可用于内核模式代码的测试签名也可以用于内核模式代码的发布签名。本节简要介绍每个工具。下面的内容将演示如何使用工具,包括典型的命令行,参数的示例。
MakeCert
MakeCert生成数字签名以此可以用来进行测试签名,它们既可以自签名,也可以被根代理密钥颁发和签名。在对驱动测试时推荐使用自签名证书。测试证书既可以对一个文件或者一个系统证书文件夹,或者两者一并进行签名。Vista RC1版和RTM发行版可以接受MakeCert工具生成的测试签名证书。
注:一般的,由第三方证书颁布机构(CA)颁布的证书不应该被用来对产品进行测试签名。更多信息,请参考“Code-SigningBest Practices.”。
CertMgr
CertMgr管理证书,证书信任列表(CTLs)和证书吊销列表(CRLs)。这个工具有三个功能:
-
显示证书,证书信任列表,证书吊销列表
-
添加证书,从一个证书存储中把证书信任列表和证书吊销列表添加到另一个证书存储(certificate store)。
-
删除证书,从一个证书存储中删除证书,证书信任列表(CTLs)和证书吊销列表(CRLs)。
SignTool
SignTool是一个集签名,签名验证和时间戳一体的命令行工具,它可以被用来使用微软Authenticode[1]支持的文件格式,包括PE格式(.exe .dll.sys都是使用PE格式的文件格式),目录文件(.cat格式),微软压缩文件(.cab)格式。SignTool可以验证签名证书中以下的信息:
-
是否是被信任机构颁布的。
-
是否过期。
-
可选择使用指定的策略判断证书是否有效。
SignTool可以被用在以下几种目的:
-
验证已签名目录文件中的文件。
-
验证数字签名是否与不同的Authenticode策略冲突。
-
显示数字签名的证书链。
-
显示单个文件的哈希值。
-
显示未验证的文件的错误。
-
从目录数据库中添加和删除目录文件(.cat)
注:Signtool.exe依赖使用Capicom.dll,Capicom.dll也可以在WDK的安装目录中的bin/SelfSign文件夹中找到。如果WDK没有在要运行签名程序的计算机中安装,确保Signtool.exe在更新过去的时候,Capicon.dll也一同被拷贝。
另外,WDK中的SignTool工具是目前唯一一个支持将交叉证书添加到数字签名的工具,前一个版本在windows2003平台的SDK或DDK中的Signtool工具不支持添加交叉证书。更多交叉证书的内容参考“Microsoft Cross-Certificates for Windows VistaKernel Mode Code Signing.”。
Capicom.dll
Capicom.dll导出一个API函数,应用程序开发人员可以使用该API将需要加密的应用程序进行加密增加安全性。因为SignTool使用了这个动态链接库,所以SignTool.exe和Capicom.dll必须都存在于进行签名的计算机中。
MakeCat
MakeCat创建一个没有签名的目录文件,其中包含指定的多个文件及其相关联属性的哈希值。整个软件包可以作为整体生成一个目录文件,而不需要单独给众多的文件挨个签名。
在使用MakeCat之前,使用者必须使用文本编辑器创建一个目录定义文件(.cdf)。这个文件列出了所有需要被签名的文件和它们的属性。MakeCat工具会做以下工作:
-
浏览.cdf文件并且验证每一个被列出文件的属性。
-
添加列出文件的属性到目录文件中。
-
计算每个文件的哈希值,并且将Hash值存储到目录文件中。
注:MakeCat不能修改.cdf文件
用户可以通过使用一个包的签名目录文件来验证接收到的多个文件是否被篡改,有以下几种方法:
-
计算接受到的目标文件的Hash值。
-
比较每个目标文件和目录文件中的Hash值是否一致。
-
验证目录文件的数字签名。
Signability
Signability是一个用于即插即用驱动程序的WDK工具,用于验证驱动程序包的内容并创建未签名的目录文件。为了驱动厂商,这个工具比Makecat.exe工具更容易使用,因为Signability.exe工具不需要.cdf文件,它从驱动包中的INF文件中获得信息。
注:Signability已经被新工具Inf2Cat所代替。
Inf2Cat
Inf2Cat是一个Winqual提交工具,它取代了Signability提供的功能。对于驱动厂商,Inf2Cat用来验证驱动包和使用一个驱动的INF文件创建未签名的目录文件。
注:Inf2Cat不是当前WDK工具包中的一部分;它被加入到Winqual提交工具的工具包中,在Program(x86)\Microsoft Winqual Submission Tool文件夹中。在创建签名的计算机添加该工具需要将Inf2Cat.exe和DLL一起拷贝到%WinDDK%\BuildNumber\bin\SelfSign文件夹下。
PVK2PFX
PVK2PFX将存储在.spc和.pvk文件中的证书和私钥移动到个人信息交换(.pfx)文件。
为了使用内核数字签名,必须将密钥存储在.pfx文件中。然而,一些CA使用.pvk文件格式文件来存储数字证书的私钥,使用.spc或.cer文件存储公钥。特别需要注意的是,Versignclass 3证书将一对.pvk文件和.spc文件打包存储。在准备使用这种证书进行签名的时候,需要把.pvk和.spc文件转换成.pfx格式。
注:如果可行的话,比较好的方法是将私钥存储在硬件安全模块中,例如智能卡。更多管理私钥的信息,参考“Code-Signing Best Practices.”。
数字签名示例脚本
WDK包含了如何正确的给Toaster驱动包进行测试签名的示例,该示例脚本命令展示了每一个步骤.示例在目录WinDDK\BuildNumber\bin\selfsign\selfsign_example。示例命令脚本里简要总结了走查中内容中的说明。
[1]启动方式由注册表HKLM\System\CurrentControlSet\Services中的start键值指定,0为由装载器装载启动。参考《What Determines When a Driver Is Loaded》
链接:
https://msdn.microsoft.com/windows/hardware/drivers/ifs/what-determines-when-a-driver-is-loaded?f=255&MSPPError=-2147217396