虽然正如 SamB 所说,在 PDB(格式 7,我的测试是基于 VS2010 生成的 .exe 和 .pdb,以及 windbg 6.9.0003.113 X86)中有一个额外的年龄参考,所以总共会有 3 个年龄需要修改在 PDB 文件中。不幸的是,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,以使co-worker实用程序满意。
: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文件。