Хотя, как сказал SamB, в PDB (формат 7, мой тест основан на сгенерированных VS2010 .exe и .pdb и windbg 6.9.0003.113 X86) есть одна дополнительная ссылка на возраст, так что всего будет изменено 3 возраста в файле PDB. К сожалению, SamB не рассказал нам, как найти волшебный 3-й век, стрим 3? нет! согласно моему тесту, я извлекаю более 100 потоков в pdb, я пробовал 02 (если SamB индексирован по 0) и 03, оба не могут найти возраст.
Исправить 2 других возраста легко, как только у вас есть редактор гексабонов и windbg.
с помощью symchk для получения подписи (GUID) вашего несоответствующего файла PDB:
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
- Исправить 2 более легких возраста
Поиск в последней части GUID: 8BDC5152B6E0, поскольку только последняя часть не имеет порядка следования байтов из проблемы с прямым порядком байтов / байтов с прямым порядком байтов, она точно такая же, как в файлах pdb. Будьте внимательны при поиске как необработанного шестнадцатеричного значения, чтобы сделать его более точным, вы должны убедиться, что другие значения в GUID (необходимо изменить порядок байтов в X86) точно совпадают. В файле PDB будет найдено ровно 2 идентификатора GUID, сопровождающий возраст перед первым байтом идентификатора GUID. Изменить это. Вот и все!
мой грубый способ узнать 3-й возраст.
сбросить шестнадцатеричный номер вашего файла 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 / ^ / \ = (строка ('.'). ':') /
Это команда ex mode, которая должна поддерживаться последней версией vim.
: V /: / d
Это удалит все строки, которые не содержат ':', оставшиеся строки являются номерами строк, которые
смещение каждого соответствующего возраста.
:% s /:.*//
Это урежет: 88 и оставит смещение в покое.
:% s /.*/\= (submatch (0) - 1) /
Эта команда вычитает каждое число на 1, я делаю это потому, что номер строки в vim равен 1 индексу, а смещение байтов каждого возраста должно быть равно 0, чтобы сделать утилиту сотрудника счастливой.
: ш
сохранить файл
Теперь мы получаем текстовый файл, каждая строка которого содержит десятичное число, представляющее смещение, из этого смещения следующие 4 байта являются кандидатами на возраст вашего сна.
Далее я пытаюсь изменить каждый потенциальный возраст, а затем пытаюсь проверить его с помощью symchk, пока он не совпадет, каждый раз, когда будет исправлено только одно смещение.
Прежде всего, я сделаю резервную копию PDB с двумя возрастами (и GUID), которые будут изменены. Давайте назовем это 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 считают, что оно не совпадает.
команда windbg! Совпадение itoldyouso, тогда как .reload / f your_module.exe по-прежнему не может совпадать.
После исправления трех возрастов pdb-файлы могут загружать не только windbg, но и visual studio.