驱动签名学习

 

简述如何通过CryptAPI实现签名的生成,并打到pe文件里,时间戳部分还没实现。

获取PE文件签名信息的工程:https://github.com/leeqwind/PESignAnalyzer

下面是一个有效的签名信息

驱动签名学习

参考图片中的签名,签名信息包含有时间戳,版本,摘要算法,后面跟着3小块证书信息。可以看出证书的来源

issuer是颁发者,subject是颁发给。Mirosoft Code Verification Root 颁发给 VeriSign Class 3 Public Primary Certification Authority - G5 颁发给 VeriSign Class 3 Code Signing 2010 CA 颁发给 Qihoo 360 Software (Beijin) Company Limited。

编程实现细节:

签名的存放信息在pe结构中的OptionalHeader中DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY],大小和偏移;

例如:size=0x1000,VirtualAddress=0x8000;表示在文件偏移0x8000处存放安全信息,大小为0x1000,其结构信息参考https://docs.microsoft.com/zh-cn/windows/win32/api/wintrust/ns-wintrust-win_certificate?redirectedfrom=MSDN

签名的生成,一个函数可以搞定SignerSignEx,参考https://docs.microsoft.com/zh-cn/windows/win32/seccrypto/signersignex?redirectedfrom=MSDN

sys和exe的有效签名是不一样的。微软提供的例子好像只能给app签名有效,给sys签名还是加不上。这个时候用前面的工具查看签名信息,证书信息只有一小块,要补齐另外2块,才是完整的有效驱动签名。补齐另外2块实际上就是把证书来源补齐。

在SignerSignEx成功的基础上ppSignerContext会返回签名信息(是最后有效签名的一部分),用CryptMsgControl(*,*,CMSG_CTRL_ADD_CERT,*)添加另外2个证书信息(这个的自己去找了),得到最后有效的签名(注意长度以8字节对齐)

得到完整的签名后,按照相关格式填到pe文件中,最后计算整个文件的checksum 保存到OptionalHeader中CheckSum中。

大功告成。

这个方法是学习wosigncode(比signtool好用多了)。还有另外一种方法是学习signtool的https://stackoverflow.com/questions/32210675/how-to-sign-an-exe-with-additional-certificates-using-cryptoapi-and-signersign,但是我按照上面的提示没得成功,可惜了。