【发布时间】:2010-09-25 08:46:05
【问题描述】:
我的安装程序在构建过程中使用代码签名证书构建 DLL。
我注意到,如果我尝试连续构建两次,第二次构建会失败,因为 DLL 已经签名,所以 signcode 会阻塞。显然我可以通过在构建中签署 DLL 的副本来解决这个问题,但这个问题引起了我的兴趣:
是否可以“取消签名”DLL,如果不可以,为什么不...?
【问题讨论】:
标签: winapi dll code-signing
我的安装程序在构建过程中使用代码签名证书构建 DLL。
我注意到,如果我尝试连续构建两次,第二次构建会失败,因为 DLL 已经签名,所以 signcode 会阻塞。显然我可以通过在构建中签署 DLL 的副本来解决这个问题,但这个问题引起了我的兴趣:
是否可以“取消签名”DLL,如果不可以,为什么不...?
【问题讨论】:
标签: winapi dll code-signing
signtool remove /s C:\path\to.exe.or.dll
signtool 在 Windows SDK 中可用,并且必须至少来自 Windows 8 SDK 工具包(版本 6.2.9200.20789)才能支持 remove 命令。
【讨论】:
remove 命令。自己检查一下。它未在您提供的链接中列出。所以我问,你在写这个答案时使用的是什么 signtool.exe 版本?我检查了产品版本 6.1.7600.16385。
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC>signtool /? Usage: signtool <command> [options] Valid commands: sign -- Sign files using an embedded signature. timestamp -- Timestamp previously-signed files. verify -- Verify embedded or catalog signatures. catdb -- Modify a catalog database. remove -- Remove embedded signature(s) or reduce the size of an embedded signed file. For help on a specific command, enter "signtool <command> /?"
当然有可能,但不是微不足道的。
虽然保存预签名 DLL 的副本会更容易。
此数字签名只不过是附加到 PE 文件末尾的一个额外部分。如果需要,您可以编写一个删除签名的程序。
这并不像截断文件那么简单;您必须删除文件头中对签名的引用。如果 DLL 有多个签名而您只想删除一个签名,这可能会变得复杂。
PE 文件的格式公开记录在here
【讨论】:
使用ImageRemoveCertificate API 从 .dll 文件中删除签名相当容易。
您的标签中没有指定任何语言,但本文展示了如何在 C# 中实现它。 Remove digital signature from a file using C#
除此之外,如果您正在寻找一个简单的工具来为您完成工作,您可以使用FileUnsigner。
【讨论】:
另一个可能的选择是切换到SignTool.exe。它带有Windows SDK,并且对已签名的二进制文件进行签名不会产生错误。我在构建过程中使用 signtool.exe 并且没有任何困难,即使已经签署了某些内容。
另外,请查看问题What's the main difference between signcode.exe and signtool.exe?
【讨论】:
您可以从XDA Forum post 使用 delcert.exe。
这是一个剥离(去除)数字签名的小工具(Authenticode) 来自 *.exe、*.dll、*.mui 等 PE 可执行文件。
【讨论】:
ImageRemoveCertificate API,效果很好。
检查您的构建工具是否支持“重新签名”。这应该会替换所有现有的签名。
如果没有,您可以使用Stud_PE 删除签名块。 在 Stud_PE 中打开 DLL 或 EXE,转到部分选项卡,右键单击数字签名部分并选择“删除部分”。但是,这需要用户交互。该工具的旧版本可能会破坏该文件。
【讨论】: