首页
社区
课程
招聘
[原创]win x64平台驱动测试数字签名
发表于: 2014-8-7 01:30 27891

[原创]win x64平台驱动测试数字签名

2014-8-7 01:30
27891

前一段时间一直在做x64平台的内核驱动,期间也看了论坛上的很多文章,受到很多的启迪。在搜集资料的时候发现论坛上一些人对于x64驱动签名也有一些疑惑,所以把一些经验写出来,给和我一样的人看一下,这些资料也是从微软网上弄来的,只是加了一些我的实践和经验;

因为x64平台下需要数字签名,但是正常开发的时候,需要测试的时候是没有数字签名的,所以这个时候一般都会开机后进入F8,选择禁止数字签名强制,但是这个办法的麻烦之处就是每次开机都要这样操作,要是虚拟机的话,一不小心错过了会很麻烦。MSDN上对这个有个解决方案就是使用测试签名;

==========================================================
测试签名获取: 

假设编译好的驱动的位置是: E:\WinDDk\my_test\objchk_win7_amd64\amd64

1. 制作一个测试使用的数字证书: 

使用管理员权限打开命令行(我用的是VS自带的64位命令行或者WDK命令行x64 Checked Build Environment)进入驱动的路径,然后输入以下命令:

makecert –r -pe -ss PrivateCertStore -n CN=Contoso.com(Test) My_Test.cer

这个时候在目录下会生成一个My_Test.cer的测试证书;如果不使用管理员权限可能会失败;如果使用cmd可能会失败;

2. 修改INF文件并生成目录文件: 

一般INF文件都会有一个version节

[version]
Signature   = "$Windows NT$"
Class         = xxx
ClassGUID  = xxx
Provider     = xxx
DriverVer    = xxx

在这个节点的最后增加一个CatalogFile.NtAMD64 = My_Test_AMD64.cat

需要注意的是这个CatalogFile只有CatalogFile.NtAMD64 CatalogFile.Nt CatalogFile三个情况;然后将INF文件也放到驱动sys文件的路径下

使用管理员权限打开WDK自带的命令行进入到对应的驱动程序路径,输入下面的命令

Inf2cat.exe /driver:E:\WinDDk\my_test\objchk_win7_amd64\amd64\ /os:7_x64

这里有几个地方会出问题,首先是/driver:后面不能有空格,否则会出错;其次是os:7_x64指的是win 7的x64平台(这个时候它又不会区分AMD64和IA64了);最后是INF文件必须也在这个目录下,格式不能出错,DriverVer这个节点的值最容易出错;

3. 对cat文件签名:

使用以管理员权限打开WDK带的命令行,定位到驱动程序路径下,输入下面的命令:

Signtool sign /a /v /s zcPrivateCertStore /n zcContoso.com(Test) /t http://timestamp.verisign.com/scripts/timestamp.dll My_Test_AMD64.cat

这里需要联网,不联网会有一个警告,因为它需要去生成时间戳;

4. 注册测试数字证书:

以管理员权限打开WDK命令行,定位到驱动文件路径下,输入以下命令:

certmgr.exe /add My_Test.cer /s /r localMachine root

5. 对驱动文件签名:

以管理员权限打开WDK命令行,定位到驱动文件路径下,输入以下命令:

Signtool sign /a /v /s zcPrivateCertStore /n zcContoso.com(Test) /t http://timestamp.verisign.com/scripts/timestamp.dll xxxx.sys

这里需要联网,不联网会有一个警告,因为它需要去生成时间戳;

6. 安装测试签名:

在目标机上,将xxx.sys xxx.inf My_Test.cer My_Test_AMD64.cat,以及certmgr.exe放在一个路径下,然后以管理员权限打开CMD命令行定位到这个目录,输入以下命令来注册证书以及打开测试模式:

certmgr.exe /add My_Test.cer /s /r localMachine root

certmgr.exe /add My_Test.cer /s /r localMachine trustedpublisher

cd c:\windows\system32\

bcdedit.exe /set TESTSIGNING ON

测试模式打开一次后,即使重启电脑也不用再次设置,除非显式的关闭它;窗体右下角会提示目前是在测试模式,关闭的命令是bcdedit.exe /set TESTSIGNING OFF

需要注意的事项:

1. 如果目标机上没有certmgr.exe,那么可以从主机上直接拷贝一个64位的certmgr.exe过去的;

2. 如果重新生成了sys文件而没有修改inf文件的话,那么只需要在生成sys文件后再次执行对驱动文件的重新签名即可;测试证书和目录文件都不需要重新生成;

3. 最好都使用管理员权限来启动命令行;不用每次都关闭WDK的命令行,事实上可以一直使用同一个WDK的命令行;如果觉得输入太麻烦,那么可以复制粘贴的;在目标机上的注册证书,可以写一个bat文件的;

4. 测试签名可以使用预安装来安装;makecert、Inf2cat、Signtool、certmgr都在WDK中有;

msdn上有一个文档专门讲这个,上面还讲了怎么弄真正的数字签名,不过那个文档一时找不到了,如果有人需要的话我找一下再传上来;
==========================================================


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 3
支持
分享
最新回复 (9)
雪    币: 231
活跃值: (2631)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
楼主辛苦啦
2014-8-7 05:14
0
雪    币: 95
活跃值: (119)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常感谢
2014-8-7 09:03
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
MakeCert -r -pe -ss PrivateCertStore -n "CN=Contoso.com(Test)" testcert.cer
楼主大大少了引号会报错哦~
2014-11-10 14:42
0
雪    币: 15
活跃值: (135)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好贴!!!学习收藏!!!
2014-11-11 01:24
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
辛苦了!的确是一好帖子,收藏了!
2014-11-11 12:52
0
雪    币: 91
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7




flyshit

MakeCert -r -pe -ss PrivateCertStore -n "CN=Contoso.com(Test)" testcert.cer
楼主大大少了引号会报错哦~

感谢flyshit 以及http://www.th7.cn/system/win/201609/180777.shtml 这个文章的作者指出来一些笔误,总结和更新如下: 1. 确实签名时候的执行,就是每次执行Signtool时,它的/s和/n参数后面跟的字符串要分别对应执行makecert时的-ss -n参数的内容,否则会带来Signtool Error: File not find的错误; 2. 这两个字符串确实可以随便更换,似乎在资源中有检查这两个字符串,由于时间关系无法进一步研究;

2017-3-13 04:01
0
雪    币: 106
活跃值: (140)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
看你写的驱动为什么是amd64的?
2020-6-1 11:36
0
雪    币: 171
活跃值: (519)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
薛定谔消失的弦 看你写的驱动为什么是amd64的?
amd64就是x64平台,这里边涉及到intel和amd在x64上的架构之争。所以你就理解为amd64就是PC的x64就行。 
2020-6-1 14:27
0
雪    币: 331
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
x86平台也要签名,每次编译一次签一次真的麻烦,有没有什么方便方法
2020-9-5 10:00
0
游客
登录 | 注册 方可回帖
返回
//