怀德维宁

大邦维屏,大宗维翰。怀德维宁,宗子维城。

0%

获取windows多签名文件的签名信息

在windows系统下进行开发工作时,往往会遇到文件的检验操作,需要检查文件是否合法。这时通过检查文件的签名是一个有效的方法,但是也会遇到文件包含多个签名信息,这时使用通常的powershell就会遇到难题,因为powershell上相关指令只能显示出一个签名信息,多余的签名无法显示,本文针对这一问题进行阐述。

以阿里的云服务器的网络驱动netkvm为例,从驱动的属性信息来看,可以得知该驱动包含3个签名信息,分别为:

表1

index subject serial thumbprint digestAlgorithm
1 Alibaba Cloud Computing Co., Ltd. 09c730c35c9f41a1018acf4c8906d490 4484ba511350dfa6adb00cc720496e54877f6042 sha1
2 Microsoft Windows Hardware Compatibility Publisher 3300000062f45cf99e58a96a89000000000062 fac666005546d6be881a31c1267717879401a950 sha256
3 Alibaba Cloud Computing Co., Ltd. 09c730c35c9f41a1018acf4c8906d490 4484ba511350dfa6adb00cc720496e54877f6042 sha256

查看windows文件签名最简单的办法就是直接使用powershell的Get-AuthenticodeSignature指令,但是使用该指令查看基于上述多签名的netkvm文件签名信息,只得到了一个序列号为“3300000062F45CF99E58A96A89000000000062”的签名信息,即表1中的第2条信息,并没有找到其他两条签名的信息,与预期不符。

后续继续查找资料,发现了一个开源项目(https://github.com/leeqwind/PESignAnalyzer)支持该功能,利用项目中自带的文件进行签名查找,得到了两条签名信息,分别对应表1中的第1条和第2条签名信息。

该项目使用CryptQueryObject函数对文件的签名信息进行查询,关于该函数的详情可以参考微软官方链接:https://learn.microsoft.com/zh-cn/windows/win32/api/wincrypt/nf-wincrypt-cryptqueryobject。

但是该工具显示的信息仍然不全,3个签名只显示了两个,继续查找方法,发现了微软提供的签名工具signtool(https://learn.microsoft.com/zh-cn/dotnet/framework/tools/signtool-exe)。该工具既可以用来签名文件,也可以用来查询并校验文件的签名信息。