如何对比内存转储校验和与源文件?WinDbg校验相关咨询
WinDbg校验和相关问题解答
关于WinDbg的默认校验行为
WinDbg加载无校验和(未用/RELEASE链接)的模块时弹出的警告,仅为提示模块缺少官方校验和,默认并不会自动执行校验和对比——这是出于调试效率考虑,毕竟开发阶段频繁修改代码重编译是常态,强制校验会打断调试流程。你移除函数重编译后无报错,就是因为这个默认逻辑。
获取存储的校验和
1. WinDbg内置命令
使用!dh <模块基址>命令,在输出的PE头信息中找到CheckSum字段,这就是PE文件头里预存的校验和。如果不知道模块基址,可先用lm命令列出模块,找到对应模块的基址后再执行!dh。
2. Windows API实现
- 直接读取PE头:通过
ImageNtHeader函数获取PE可选头指针,读取IMAGE_OPTIONAL_HEADER.CheckSum字段即可拿到存储的校验和。 - 借助
CheckSumMappedFile函数:该函数不仅能计算文件的校验和,还会通过输出参数返回PE头中已有的校验和值。
执行校验和对比
1. WinDbg内置命令
使用!chkimg -v <模块名>命令,WinDbg会计算目标模块在当前内存中的实际校验和,并与PE头存储的校验和对比,输出两者的差异(若存在)。
2. Windows API实现
调用CheckSumMappedFile计算目标文件/内存映射区域的实际校验和,再与从PE头读取的存储值做直接对比,即可完成校验。如果是内存中已加载的模块,需先将模块内存区域映射为文件视图,再传入该函数计算。
内容的提问来源于stack exchange,提问作者T.D.
相关产品推荐
相关产品推荐

