使用rcedit/Reshacker修改Windows.exe后,signtool签名失败求助
解决修改Windows EXE资源后signtool签名报0x800700C1错误的办法
错误原因
0x800700C1错误提示“无效的EXE格式”,本质是修改PE资源后,文件的校验和(CheckSum)未更新,或者资源编辑工具破坏了PE文件的结构规范,导致signtool在代码签名的校验环节判定文件格式非法。
具体解决步骤
1. 更新PE文件校验和
修改资源后,必须更新PE文件的校验和,确保结构符合Windows规范。使用Windows SDK自带的editbin工具执行以下命令:
editbin /RELEASE %outputFile%
该命令会自动计算并写入正确的校验和,修复PE结构的完整性。
2. 检查资源文件的合规性
- 图标文件:必须是标准Windows ICO格式,需包含多种尺寸(16x16、32x32、64x64、256x256)和32位带Alpha通道的版本,避免使用PNG转ICO的非标准文件。
- 版本字符串:
ProductName和FileDescription不能包含非ASCII字符、控制字符等非法内容,确保符合Windows版本资源的字符串规范。
3. 临时排查:跳过页面哈希检查
如果更新校验和后仍报错,可尝试在signtool命令中添加/ph参数跳过页面哈希校验(仅用于排查问题,不推荐正式环境使用):
signtool sign /f 你的证书文件.pfx /p 证书密码 /ph %outputFile%
若此命令成功,说明问题确实出在PE结构的哈希校验上,需重新确认步骤1的校验和更新是否生效。
4. 使用严格合规的资源编辑方式
若第三方工具(rcedit、Reshacker)始终导致结构问题,建议改用Windows SDK原生工具通过资源脚本修改:
- 编写资源脚本(如
app.rc):
#include <windows.h> IDI_MAIN_ICON ICON "你的图标文件.ico" VS_VERSION_INFO VERSIONINFO FILEVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0 BEGIN BLOCK "StringFileInfo" BEGIN BLOCK "040904B0" BEGIN VALUE "ProductName", "你的产品名称" VALUE "FileDescription", "你的文件描述" END END BLOCK "VarFileInfo" BEGIN VALUE "Translation", 0x409, 1200 END END
- 编译资源脚本生成
.res文件:
rc app.rc
- 将资源嵌入目标EXE:
link /nologo /dll /noentry /out:%outputFile% %outputFile% app.res
内容的提问来源于stack exchange,提问作者Wayne
相关产品推荐
相关产品推荐

