协同设计可执行文件并允许修改某些字节
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
的内容已添加到其末尾:
从原始文件的末尾开始:
我用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
的内容已添加到其末尾:
从原始文件的末尾开始: