为自己的驱动程序签名

为自己的驱动程序签名

在Windows内核驱动开发中,微软不允许运行未签名的服务。我们可以给自己的驱动签名,这样我们就可以运行自己的驱动程序了。

1. 将Windows设置为测试模式

使用管理员身份运行power shell,执行以下命令并重启:

bcdedit /set testsigning on

2. 生成自己的数字证书

以管理员身份运行powershell,并执行以下命令(将 MyDriverTest替换为你喜欢的名字):

$cert = New-SelfSignedCertificate -Type CodeSigningCert -Subject "CN=MyDriverTest" -KeyUsage DigitalSignature -CertStoreLocation "Cert:\LocalMachine\My"

将证书导出以便后续使用:

Export-Certificate -Cert $cert -FilePath "C:\MyDriverTest.cer"

3. 让系统信任这个证书

  1. 按 Win + R,输入 certmgr.msc并回车,打开证书管理器。
  2. 在左侧展开 “受信任的根证书颁发机构”​ -> 点击 “证书”。
  3. 在右侧右键点击 “所有任务” -> “导入”。
  4. 在向导中,选择你刚才导出的 C:\MyDriverTest.cer文件。
  5. 依次点击“下一步”完成导入,将其放入“受信任的根证书颁发机构”存储中。

4. 使用signtool给驱动签名

使用管理员身份运行power shell:

Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object {$_.HasPrivateKey} | ForEach-Object {
     Write-Host "主题: $($_.Subject)"
     Write-Host "友好名称: $($_.FriendlyName)"
     Write-Host "指纹: $($_.Thumbprint)"
     Write-Host "---"
}

使用如下命令进行签名:

signtool sign /v /fd SHA256 /sm /n "MyDriverTest" /t http://timestamp.digicert.com "驱动路径"

下面说说这条命令是什么意思:


命令结构分解

signtool sign /v /fd SHA256 /sm /n "MyDriverTest" /t http://timestamp.digicert.com "驱动路径"
1. signtool sign
  • 功能:调用 signtool.exe 程序的 sign 子命令,指示其核心操作是“对文件进行数字签名”。
2. /v
  • 全称:Verbose
  • 功能启用详细输出模式。执行此命令时,signtool 会将其查找证书、计算哈希、联系时间戳服务器、写入签名等每一步的详细信息打印到终端。如果签名失败,它能提供最直接的错误线索。调试时必备
3. /fd SHA256
  • 全称:File Digest algorithm
  • 功能指定生成“文件数字指纹”所使用的哈希算法SHA256 是当前安全标准,它会对您的整个驱动文件进行计算,生成一个唯一且不可逆的256位摘要(指纹)。此指纹将被您的私钥加密,形成签名的核心。旧系统可能用 SHA1,但现代 Windows 驱动签名必须使用 SHA256
4. /sm
  • 全称:Store in the Machine store
  • 功能指定在“本地计算机”证书存储区中查找证书,而不是“当前用户”存储区。这是极其关键的选项。
    • 如果没有 /sm 参数,signtool 默认在 Cert:\CurrentUser\My(当前用户的“个人”存储)中找证书。
    • 有了 /sm 参数,signtool 则在 Cert:\LocalMachine\My(本地计算机的“个人”存储)中找证书。
  • 为什么重要:您创建的用于驱动签名的自签名证书,通常(也应该)安装在“本地计算机”账户下,因为驱动程序是系统级服务,不依赖特定用户登录。如果您的证书确实在“本地计算机”下,而您不加 /smsigntool 就会在“当前用户”下找,必然找不到,从而引发 No certificates were found... 错误。
5. /n "MyDriverTest"
  • 全称:Name of the certificate
  • 功能指定用于签名的证书的“主题”或“通用名称”"MyDriverTest" 应与您创建证书时指定的 Subject(例如 CN=MyDriverTest完全匹配signtool 用这个名称在指定的存储区(由 /s/sm 决定)中定位唯一的证书及其关联的私钥。
  • 注意/n按名称模糊匹配,如果存储中有多个名称相似的证书,可能会导致选错。更精确的选择方式是使用 /sha1 参数指定证书的指纹(Thumbprint)。
6. /t http://timestamp.digicert.com
  • 全称:Timestamp server URL
  • 功能向指定的时间戳服务器请求一个权威的时间戳,并将其嵌入签名中
  • 为什么必须:这是保证签名长期有效的核心机制。您的自签名证书有有效期(比如1年)。如果没有时间戳,一旦证书过期,即使文件从未被修改,签名也会因“证书过期”而被判定为无效。添加了时间戳后,验证时会检查“在签名时刻(由时间戳服务器证明)证书是否有效”,而不是“当前时刻证书是否有效”。这样,只要签名时证书有效,即使日后证书过期,签名依然有效。digicert.com 是常用的公共时间戳服务器。
7. "驱动路径"
  • 功能指定要签名的目标文件路径。必须用双引号包裹,特别是路径中包含空格时。这是命令的最后一个参数,signtool 会将前面所有选项确定的签名信息写入此文件。

总结:这条命令在“做什么”?

这条命令指示 signtool 执行以下操作:

  1. 准备:以详细模式执行。
  2. 定位:在本地计算机的证书存储中,找到一个名为 MyDriverTest 的证书,并使用其关联的私钥
  3. 计算:使用 SHA256 算法计算“驱动路径”所指文件的哈希值。
  4. 加戳:联系 DigiCert 的时间戳服务器,获取当前签名时间的权威证明。
  5. 生成签名:用第2步找到的私钥,加密第3步计算出的哈希值,并将此加密结果、证书公钥信息、以及第4步得到的时间戳,打包成一个“数字签名”数据块
  6. 写入:将第5步生成的签名数据块,嵌入到驱动文件的特定位置(通常是文件的“安全目录”节中)。

如果成功,可以得到如下输出:

The following certificate was selected:
    Issued to: MyDriverTest
    Issued by: MyDriverTest
    Expires:   Wed Mar 31 20:23:15 2027
    SHA1 hash: 8FB7008E9A64FA92939ECDCCxxxxxxxxxxxxxxxxxxxxxx

Done Adding Additional Store
Successfully signed: C:\Users\lxz\Desktop\computer\driver\First.sys

Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值