Я получаю отчеты о сбоях от конечных пользователей с информацией доктора Ватсона, и я хочу использовать их, чтобы узнать, где произошел сбой (т.е. в какой строке кода).
Я не могу просто использовать EIP из отчета о сбое, потому что файл, который мы отправляем, имеет цифровую подпись, и это меняет все смещения. Однако информация о сбое также имеет «байты в CS: EIP», которые являются первыми 16 байтами, начиная с EIP, где произошел сбой. Это выглядит так:
Bytes at CS:EIP:
85 c4 14 c3 8b ff 55 8b ec 6a 0a 6a 00 ff 75 08
Эти 16 байтов встречаются в exe ровно один раз. Я могу найти их смещение в EXE, используя только средство просмотра HEX, но чтобы перейти туда во время отладки и посмотреть, какая строка находится в источнике, мне нужно знать их смещение в памяти после загрузки EXE.
Как лучше всего сканировать сегмент кода программы после ее загрузки? Могу ли я добавить код, который находит, где находится базовое смещение EXE-файла, а затем перебрать его и использовать memcmp, чтобы найти, где происходит шаблон байтов.
Кроме того, как я могу найти, где находится базовое смещение EXE?