Unable to verify checksum 当 PE 标头中的校验和不可验证时发出。
如果有问题的 exe 是在未使用 /RELEASE 链接器选项的情况下编译和链接的,则可能会发生这种情况。
基于普通项目的编译链接器设置此选项。基于 nmake 或批处理文件的编译可以省略此开关并导致此输出。
一个简单的 hello world 编译和链接,使用和不使用 /RELEASE 链接器选项(PDB 不是为了简单而生成的,并且差异显示时间戳和校验和的差异)。在 WinDbg 中加载,并且仅针对 PE 标头中没有校验和的 exe 生成校验和警告。
简单的 hello world.cpp 内容
testrelease:\>dir /b & type testrelease.cpp
testrelease.cpp
#include <stdio.h>
int main (void) {
printf("hello my relase\n");
return 0;
}
不使用 /RELEASE 编译
testrelease:\>cl /nologo testrelease.cpp
testrelease.cpp
重命名 exe 并使用 /RELEASE 编译相同的源代码
testrelease:\>ren testrelease.exe testrelease_norel.exe
testrelease:\>cl /nologo testrelease.cpp /link /release
testrelease.cpp
比较两个 exes
testrelease:\>fc /b testrelease.exe testrelease_norel.exe
Comparing files testrelease.exe and TESTRELEASE_NOREL.EXE
000000E0: D6 CE
00000130: A3 00
00000131: 95 00
00000132: 01 00
分析比较的输出
testrelease:\>xxd -s +0x3c -l 1 testrelease.exe
000003c: d8 .
testrelease:\>xxd -s +0x3c -l 1 testrelease_norel.exe
000003c: d8 .
testrelease:\>echo d8 = NT_HEADER so e0 = TimeDateStamp and 130 = CheckSum
d8 = NT_HEADER so e0 = TimeDateStamp and 130 = CheckSum
在 windbg 中加载两个 exe,只为一个没有校验和的 exe 生成警告
testrelease:\>cdb -c ".reload /f ; q" testrelease.exe
.*** ERROR: Module load completed but symbols could not be loaded for image00400
testrelease:\>cdb -c ".reload /f ; q" testrelease_norel.exe
.*** WARNING: Unable to verify checksum for image00400000
*** ERROR: Module load completed but symbols could not be loaded for image004000
没有可用的符号头错误意味着 exe 编译时没有调试信息。
除非您在从头开始重新创建调试信息方面拥有丰富的专业知识,否则您无能为力。
上面编译的两个可执行文件都会产生错误,因为我故意没有创建调试信息。
DBGHELP: image00400000 missing debug info. Searching for pdb anyway
DBGHELP: Can't use symbol server for image00400000.pdb - no header information available