虽然正如 SamB 所说,在 PDB 中(格式 7,我的测试是基于 VS2010 生成的 .exe 和 .pdb,以及 windbg 6.9.0003.113 X86)有一个额外的年龄参考,所以在 PDB 文件中总共会有 3 个年龄需要修改. 不幸的是,SamB 没有告诉我们如何找到魔法 3rd age,stream 3?不!根据我的测试,我提取了 100 多个 pdb 流,我尝试了 02(如果 SamB 是 0 索引)和 03,两者都找不到年龄。
只要你有一个十六进制编辑器和windbg,修复其他两个年龄就很容易了。
使用 symchk 获取不匹配的 PDB 文件的签名(GUID): symchk your.exe /v /s 。
通常输出将包含:
[SYMCHK] ------------------------------------
SymbolCheckVersion 0x00000002
Result 0x00010001
DbgFilename CPP_Snippet.dbg
DbgTimeDateStamp 0x00000000
DbgSizeOfImage 0x00000000
DbgChecksum 0x00000000
PdbFilename E:\zrf\C_CPP\CPP_Snippet.pdb
PdbSignature {6D8D99B0-E96B-4093-9D97-8BDC5152B6E0}
PdbDbiAge 0x00000188
搜索 GUID 的最后一部分:8BDC5152B6E0,因为只有最后一部分与大端/小端问题无关,它与 pdb 文件中的完全相同。小心搜索原始十六进制值,以使其更准确,您应该验证 GUID 中的其他值(需要在 X86 中反转字节顺序)完全匹配。在 PDB 文件中将恰好找到 2 个 GUID,伴随的年龄正好在 GUID 的第一个字节之前。修改它。就是这样!
我用粗鲁的方法找出第三个年龄。
转储 PDB 文件的十六进制数,每行一个字节(2 个十六进制数)。od -v -t x1 your.pdb | sed 's/^[0-9a-f]* //;s/ /\n/g' > age_offset.txt
获取每个匹配年龄的行号,在我的情况下,它是 4 个连续行,其值为 88 01 00 00,vim age_offset.txt :g/88\n01\n00\n00/s/^/\= (line('. ') . ':')/
这是一个 ex 模式命令,最近版本的 vim 应该支持它。
:v/:/d
这将删除所有不包含':'的行,剩余的行是行号,它是每个匹配年龄的偏移量。
:%s/:.*//
这将修剪 :88 并单独留下偏移量。
:%s/.*/\=(子匹配(0) - 1)/
该命令将每个数字减 1,我这样做是因为 vim 中的行号是 1-index,并且每个年龄的字节偏移量应该是 0-index 以使同事实用程序满意。
:w
保存文件
现在我们得到一个文本文件,每一行都包含一个十进制数,代表一个偏移量,从这个偏移量开始,接下来的 4 个字节就是你梦想年龄的候选。
接下来,我尝试修改每个潜在的年龄,然后尝试通过 symchk 检查它直到匹配,每次只修补一个偏移量。
首先,我将备份一个修改了 2 个年龄(和 GUID)的 PDB。我们称之为 ori.pdb
这是完成艰苦工作的批处理脚本:
for /F usebackq %%i in (`type age_offset.txt`) DO (
copy /y ori.pdb CPP_Snippet.pdb
@rem dd if=ori.pdb bs=1c count=4 skip=%%i | xxd -g1 | grep "88 01 00 00" || echo "Bad data at %%i" && goto exit
dd if=pdb_age.dat of=CPP_Snippet.pdb bs=1c count=4 seek=%%i conv=notrunc
symchk CPP_Snippet.exe /s . && echo "Found it at offset %%i" && goto exit
)
:exit
幸运的是,我在第 38 个偏移处找到了正确的位置。
这不是尝试错误修复要修补的正确偏移量的最快方法,但它对我有用,这是我的原型,以确保只有 1 个额外的年龄需要修复,否则,可能的组合是巨大的(我有 111 个年龄候选人尝试),因此尝试错误的方式不实用。
我认为编写一个实用程序以更快的方式完成相同的工作非常容易。
顺便说一句:根据我的测试。chkmatch 可能会报告匹配,而 symchk 和 windbg vs 认为它不匹配。
windbg 命令 !itoldyouso 匹配,而 .reload /f your_module.exe 仍然无法匹配。
修复了3个年龄后,不仅windbg,Visual Studio也可以加载pdb文件。