避坑Windows驱动签名经验贴

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序把安全装进口袋

在开始讲驱动签名之前,我们先简单的科普一下什么是代码签名。

代码签名(Codesigning)是利用代码签名证书对可执行文件或脚本进行数字签名,以确认软件作者及保证软件在签名后未被修改或损坏的措施,此措施使用加密散列来验证真实性和完整性。简单来说就是进行代码签名后,可以增加程序的可信度。

代码签名证书主要分为两类:

标准代码签名证书

EV扩展型代码签名证书

EV扩展型代码签名证书除了验证企业的基本信息、税务信息外,还会对企业的经营地址、申请人身份进行审查,区别于标准代码签名的重要特点是支持Windows10内核驱动文件签名和消除SmartScreen筛选器安全提醒,此外EV代码签名针对内核模式的驱动文件需要进行微软的交叉签名。

这里需要注意,驱动文件要用EV证书进行签名才可以用。

了解了代码签名之后,再来了解一点关于Windows驱动程序的基础知识:

微软提供的驱动签名有两种方式:

具体步骤如下:

在微软开发者账户设置中选择管理证书。

提交完即可根据自身需求,自由选择签名方式。

PS:证明签名(attestation-signing)在Win7上没法使用,已经尝试的签名组合:

此处不包含驱动开发部分,假设已经编译出驱动release,此时需要的打包文件有:

nacndislwf.cat

NacNdisLwf.inf

NacNdisLwf.sys

创建DDF文件(相当于打CAB包的配置文件),下面是一个打包NacNdisLwf驱动的示例:

;***nacndislwf.ddfexample;.OPTIONEXPLICIT;Generateerrors.SetCabinetFileCountThreshold=0.SetFolderFileCountThreshold=0.SetFolderSizeThreshold=0.SetMaxCabinetSize=0.SetMaxDiskFileCount=0.SetMaxDiskSize=0.SetCompressionType=MSZIP.SetCabinet=on.SetCompress=on;Specifyfilenamefornewcabfile.SetCabinetNameTemplate=NacNdisLwf.cab;Specifythesubdirectoryforthefiles.;Yourcabfileshouldnothavefilesattherootlevel,;andeachdriverpackagemustbeinaseparatesubfolder..SetDestinationDir=NacNdisLwf;SpecifyfilestobeincludedincabfileC:\tmp\Driver\none\NacNdisLwf.InfC:\tmp\Driver\none\NacNdisLwf.SysC:\tmp\Driver\none\nacndislwf.cat打包前可以先对.cat.sys进行签名,这样签名下来可以有两个证书:一个我们的EV证书、一个微软的证明签名。

MakeCab/f"C:\tmp\Driver\DDF\NacNdisLwfWin10.ddf"提交微软的全部文件必须进行EV/sha256签名。

大致逻辑是,需要搭建HLKserver与HLKclient,将需要测试的驱动程序部署在HLKclient上,在HLKserver进行控制,HLKserver会对Client执行各种自动化操作,并在server上生成测试结果。

在Client上安装HLK客户端确保与server处于同一个局域网域下,ControllerName为server端的设备名注意此处不要使用Ip,已踩过坑。

\\\HLKInstall\Client\Setup.cmd另外还有个坑:Client系统语言请使用英语,不然会出现各种奇奇怪怪的报错。

创建机器池:客户端安装完成后会打开HLKStudio,点击Configuration可以看到刚刚安装客户端的设备机器需新建一个机器池,并将这个设备从默认的机器池中拖出去,然后右键更改状态为ready。

之后便可以新建项目,选择测试目标Client上已经安装的驱动进行测试了,这块没啥坑,直接看微软文档即可。

选择Client上的驱动(先在Client上安装自己的驱动,studio这边刷新之后就会显示)。

在Tests上勾选需要运行的自动测试,点击Runselected进行自动测试。

查看测试结果:遇到失败可以查看原因解决。

创建提交包:驱动通过验证后需创建提交包进行提交。

点击CreatPackage进行创建包

签名:微软是推荐使用Usethecertificatestore里面的证书,但我们在插入yubikey打算使用usb密钥的证书对他进行签名时,发现可以选择在yubikey中的证书。但签名时会失败,报错为Unabletousetheselectedcertificatetosignthepackage,进入到Eventviewer中查看详情为:Unabletousetheselectedcertificatetosignthepackage。

研究了很久,在创建HLKX时只能在这里选择签名,因为HLK不支持signtools。

解决方案1:使用C#的CSP对HLkx进行签名,<失败:CSP无法识别sha384签名>,

通过SSL.com签发的OV证书进行签名由于之前SSl.com的OV代码证书没有人在使用,所以需要重新创建CSR提交到SSL上重新生成证书(SSL.com的验证流程很慢,正常要3-5天)。

获取SSL.com带私钥的OV证书

查看OV证书是不是带sha256RSA类型,与EV证书采用相同的操作(下载SignableFile.bin本地使用SignTool签名,上传到微软开发者验证)。在Usethecertificatestore中选择导入本机OV证书,签名成功。

提交微软认证

签名问题小结:签名会失败的原因由于EV证书的签名算法为Sha384ECDSA,HLKStudio不支持认证该算法,只能使用SHA256RSA来解决;只使用HLK认证的签名依然会失败,这是由于Win10以下的驱动使用HCK认证(与HLK一样HLK是其升级版本),可以在创建HLK提交后在Package页面选择mergepackage将HCK数据包合并到HLK中才可以认证Win7。

HCKserver版本可以使用server2012及server2008,建议使用2008英文版。

原因:server2012默认开启domincontrller会导致安装失败,且这个domincontrller不是很好关闭,

需要关闭IEESC配置。

不关闭IEESC安装,.net4.5会失败(点击servicemanager关闭IEESC),

server与client请都使用英文版,避免不必要的问题。

安装后,操作流程与HLK一致,最后package需注意:

不需要签名,直接生成不签名的HCKX文件;

生成后发送hckx文件到HLKserver上进行mergepackage操作。

建议使用微软的VHLK虚拟机,在本地装hyper-v直接使用虚拟机运行server可以省很多事情。

使用英文版!使用英文版!使用英文版!重要的事情说三遍。

最后再补充一点关于代码签名安全方面的东西,那就是在已签名PE文件里注入shellcode,不会影响签名的有效性,也就是白加黑的手法。虽然这是个老技术,但很多机器都没打这个补丁(KB2893294)。

为了不把本文弄得又臭又长,这里只做个简单的演示。具体原理可见末尾引用:

这里用到的工具(需自行编译)。

开始把shellcode注入到hr.exe,指定加密key为test,需要注意的是文件的hash会变的,但是数字签名仍有效。

再看看注入后(hrxx.exe)的签名,还是有效的。

用loader配合白应用(hrxx.exe)执行shellcode,可以看到calc顺利弹出。

THE END
1.C#实现RSA算法实现案例C#实现RSA算法实现案例 staticvoidMain(string[] args) { strings = p.EncryptByPublicKey("2882e099-c705-43ed-93a3- 02cb2cd67559","MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtGlTbBJzXF1fVv/+cB37QUwC5bmlm+p5KIuPIMuPX4PrhXl63R3e2bCfwhootzUdOcmmFAX6f9fWBj1Bc4lQem+FvFvE3Y53tNvGUdlNakysfXhttps://blog.csdn.net/shghdgdd/article/details/145450691
2.Certum代码签名证书恶意软件、病毒、木马等威胁层出不穷,严重威胁着用户的数据安全和隐私保护。为了应对这一挑战,代码签名证书应运而生,成为保障软件安全的重要手段之一。而Certum,作为欧洲知名的数字证书颁发机构,其提供的代码签名证书在市场上广受好评,为软件开发者和用户提供了全面、可靠的安全保障。https://www.jianshu.com/p/02de54b2012e
3.C#获取PDF中的数字签名证书C#教程PDF中的加数字签名是对文档权威性的有效证明。我们在向PDF文档添加签名时,需要准备可信任的签名证书。同时,对已有的签名,可验证签名是否有效,也可以获取文档中的签名证书信息。下面,以C#代码示例展示如何来获取PDF中的数字签名证书信息。 环境准备 需要在程序中导入Spire.Pdf.dll。这里以一个控制台应用程序为例,引用https://m.jb51.net/article/230413.htm
4.authenticode.zip代码签名ca证书工具码农集市专业分享IT编程学习悲欢**自饮 上传624.03 KB 文件格式 zip 代码签名 ca证书 openssl authenticode authenticode.zip代码签名ca证书工具 点赞(0) 踩踩(0) 反馈 所需:1 积分 电信网络下载 VMware macOS 实用程序.zip 2025-02-05 19:55:05 积分:1 云壁纸小程序2.0.1.rar 2025-02-05 17:47:25 积分:1 https://www.coder100.com/index/index/content/id/167703
5.Docker从入门到精通搭建认证加密功能的仓库(生成证书并启动registry) 搭建registry的认证功能 系列文章目录 一、harbor仓库(最小化安装)的搭建及用法 二、 harbor仓库添加功能模板(安全模块签名和扫描) 系列文章目录 一、本文内容 二、 docker原生网络 2.1容器间如何通信 2.1.1桥接模式 http://www.zsrm.cn/news/49457.html
6.如何:使用独立的X.509证书进行签名和加密定义一个自定义的IdentityVerifier。 因为使用不同的证书来加密请求和对响应进行签名,所以服务具有多个标识。 备注 在下面的示例中,出于演示的目的,提供的自定义标识验证程序不执行任何终结点标识检查。 建议在生产代码中不要这样做。 C# classMyIdentityVerifier:IdentityVerifier{ IdentityVerifier defaultVerifier;publicMyhttps://msdn.microsoft.com/zh-cn/library/ms729856.aspx
7.简单Unity3D安卓游戏逆向思路腾讯云开发者社区1.3 生成重新打包的自签名证书 修改完 apk 之后,需要对 apk 进行签名。该命令用于生成签名的证书。 代码语言:txt 复制 keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 0validity 10000 # 记住设置的密码,最后自签名应用的时候需要输入密码 https://cloud.tencent.com/developer/article/1395726
8.BURP商店插件官方目录及功能介绍(翻译)创建一个新的套件选项卡“ Adhoc Payload Processing”,允许用户使用单个ruby函数快速定义新的payload处理器,该函数的签名类似于使用Ruby字符串的Burp Extension这包括蜘蛛在客户端代码中找不到的未链接端点,或在客户端代码中完全未使用的可选参数。 支持的框架: C#/ ASP.NET MVC C#/ Web表单https://www.t00ls.com/articles-58902.html
9.gRPC这项技术真是太棒了,爆赞csr: 证书签名请求文件,用于提交给证书颁发机构(CA)对证书签名。 crt: 由证书颁发机构(CA)签名后的证书,或者是开发者自签名的证书,包含证书持有人的信息,持有人的公钥,以及签署者的签名等信息。 gRPC 代码 证书有了之后,剩下的就是改造程序了,首先是服务端代码。 https://www.51cto.com/article/685433.html
10.认证为例VistaAPI平台,框架和库signtool.exe,代码签名工具。它的Visual Studio 2005 SDK和Windows Vista SDK的一部分。(当然你可以找到单独下载这些文件在互联网上搜索,但我更喜欢点的quot; officialquot;源。)第五,你需要创建一个数字证书文件,为您的组织的全权证书文件和私钥文件。你需要做的所有的应用程序只有一次。下面是步骤:下载,解压缩和https://www.orcode.com/article/API_20128007.html
11.签名及认证服务器白皮书ER500A.docx产品功能签名认证服务器向上为应用系统提供开发接口,向下提供统一的密码算法接口并管理各种密码设备。签名认证服务器的主要功能是:为应用提供统一的、透明的API接口,接口形式可为Java Servelet、Com组件、ActiveX控件和动态连接库,支持C/C++,VB,C#,Java,Delphi等多种编程语言;为应用提供各种安全服务,包括:基于证书的单向https://max.book118.com/html/2021/0223/6232000012003110.shtm
12.微软商店的应用appx签名有关代码签名和证书的一般详细信息,请参阅代码签名简介。 必备条件 应用包 若要了解手动创建应用包的详细信息,请参阅使用 MakeAppx.exe 工具创建应用包。 有效的签名证书 有关创建或导入有效签名证书的详细信息,请参阅创建或导入应用包签名证书。 SignTool.exe https://www.wosign.com/Support/app_package_using_signtool.htm
13.电子商务技术论文(通用8篇)通过数字签名可以对电子商务交易事项的真实性做出判断。5)数字凭证。数字凭证是利用电子手段来判断用户的身份,在电子交易过程中,双方利用各自的数字凭证来进行各项操作。公匙对应各自的数字证书,私匙则通过安全的方式传给用户。在凭证中,常用的是个人凭证与企业凭证,个人凭证在单人用户的电子商务交易过程中保障其的安全,https://www.360wenmi.com/f/fileqtdek5bj.html
14.VS2017签名时出错:未能对bin\Debug\app.publish\*.exe签名PS:其实错误信息也提示很清楚了:"No certificates were found",大意就是:签名错误的原因是没有找到符合给定规范的证书,所以要么证书丢了要么证书有问题咯。我的项目是一个控制台应用程序(只是用来测试几段代码的),VS2017用的是社区版本的。 二、总结与归纳 https://shiyousan.com/post/636422963761134191
15.ClickOnce部署详解一:ClickOnce介绍及总体概览,最简单的ClickOnceClickOnce应用的安装,除了点击安装时会有弹窗询问是否确认安装,之后大多数情况下,都不需要任何介入操作就会安装完成。除了,要求权限提升(比如管理员),或者应用没有信任证书的签名,会再次询问用户是否授权和继续安装。 受信任证书是机器或企业级别的,因此,受信任证书签名的ClickOnce程序可以静默安装。 https://article.juejin.cn/post/7182971872512835639