在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)。该工具既可以用来签名文件,也可以用来查询并校验文件的签名信息。