协同设计可执行文件并允许修改某些字节

Codesign an executable and allow the modification of some bytes

我用signtool.exe to codesign a Windows executable.

此工具的哪些选项可用于定义应从哈希计算中省略几个字节,从而允许数字签名的可执行文件可以有 8 个或 16 个字节稍后修改字节数?

此技术已被 Mozilla 使用(他们的 .exe 安装程序每次下载都不同,但具有相同的数字签名),请参阅 How can a .exe be modified and still keep a valid digital signature?

WinAPI 函数 ImageGetDigestStream 有一个选项 DigestLevel 可以从哈希计算中排除资源信息,但是在实际使用 signtool.exe 或类似工具时如何使用这个选项?

Didier Stevens 在此处的一篇文章中对此进行了解释:It's in the signature and he also provides a tool "disitool" 以操纵签名。

以下是使用 Authenticode 对文件进行签名并在不破坏签名的情况下向其附加一些数据的步骤:

A) 创建代码签名证书(您需要输入密码):

MakeCert /n "CN=MyOrg" /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /sv MyOrg.pvk MyOrg.cer

注意:1.3.6.1.5.5.7.3.3 是 szOID_PKIX_KP_CODE_SIGNING,1.3.6.1.4.1.311.10.3.13 是 szOID_KP_LIFETIME_SIGNING。这将创建一个私钥文件和一个证书文件。

B) 将证书添加到商店(需要管理员权限,可以是不同的商店):

Certutil -addStore TrustedPeople MyOrg.cer

C) 创建要签名的 Pfx 文件:

Pvk2Pfx /pvk MyOrg.pvk /pi [Password goes here] /spc MyOrg.cer /pfx MyOrg.pfx

D) 签署您的文件:

SignTool.exe sign /fd SHA256 /v /a /f MyOrg.pfx /p [Password goes here] MyFile.exe

此时 MyFile.exe 使用 Authenticode 签名:

E) 创建一些 data.txt 文件。我创建了一个仅包含“[Kilroy was here!]”文本的文本。

F) 现在 运行 disitool:

python.exe disitool.py inject --paddata MyFile.exe data.txt MyFile2.exe

这是结果,MyFile2.exe 仍然有效,无需重新提交文件:

虽然您可以看到 data.txt 的内容已添加到其末尾:

从原始文件的末尾开始: