修改已签名EXE的SHA1哈希字节及Windows执行逻辑的技术咨询
关于签名EXE修改与Windows执行逻辑的解答
首先得澄清一个关键误解:你用signtool查到的SHA1哈希(CB7E84887F3C6015FE7EDFB4F8F36DF7DC10590E)是代码签名证书本身的指纹,不是EXE文件内容的哈希,也不是数字签名块里的明文哈希值——这就是你在十六进制编辑器里找不到它的原因。
一、数字签名EXE的核心执行验证逻辑
数字签名的本质是确保文件未被篡改,流程大概是这样:
- 开发者对EXE的可执行内容(会排除后续嵌入的签名块)计算哈希(现在主流用SHA256,SHA1已经被逐步淘汰);
- 用自己的代码签名私钥对这个哈希加密,生成数字签名;
- 把签名、完整的证书链一起嵌入到EXE的PE结构尾部(签名目录区域)。
Windows加载EXE时的验证步骤:
- 检查嵌入的证书是否合法(有效期、是否被吊销、颁发机构是否在系统信任列表里);
- 重新计算EXE可执行内容的哈希;
- 用证书的公钥解密签名块里的加密哈希,和刚计算的哈希比对;
- 任意一步失败,就判定签名无效。
二、如何修改并让签名损坏?
你不需要专门找哈希字节来修改——随便改EXE的任意内容都会破坏签名:
- 工具选择:用HxD、010 Editor、WinHex这类常见的十六进制编辑器就行,打开chrome.exe后,随便修改一个代码段的字节(比如找一个看起来像常量的地方改一个值),保存后签名就直接失效了。
- 如果你执着于修改签名相关的哈希:其实签名块里的加密哈希是用私钥加密后的密文,你就算改了它,Windows重新计算的文件哈希也和它不匹配,验证照样失败,完全没必要这么做。
三、Windows对修改后EXE的处理方式
根据系统安全设置和软件类型,处理逻辑会有差异:
- 强制签名验证场景:如果组策略里设置了“要求所有可执行文件必须有有效数字签名”,执行时会直接弹出错误提示:“Windows无法验证此文件的数字签名。此文件可能已损坏或被篡改。”并阻止运行。
- 普通场景:
- 首先可能触发Windows Defender的恶意软件检测,因为修改后的文件哈希不在信任列表里,会被标记为未知文件甚至直接隔离;
- 就算过了杀毒,执行时UAC提示会显示“发布者:未知”,而非原来的Google LLC;
- 像Chrome这类对代码完整性要求高的软件,修改后大概率直接崩溃,因为代码逻辑被破坏了。
内容的提问来源于stack exchange,提问作者dozer_d
相关产品推荐
相关产品推荐

