Поток команд x86 не является самосинхронизирующимся и может быть только однозначно декодирован вперед.Вам нужно знать правильную начальную точку для декодирования.Последним байтом немедленного значения может быть 0x90
, который декодируется как nop
, или, как правило, 4-байтовое немедленное или смещение может иметь байтовые последовательности, которые являются действительными инструкциями, или любые другие возможности перекрытия с байтами ModRM / SIB.выглядит как коды операций.
Если вы декодируете вперед в коде, который не является преднамеренно запутанным, вы часто возвращаетесь к синхронизации с «правильными» границами команд, поэтому вы можете попытаться запомнить границы команд как заведомо исправныеукажите и убедитесь, что декодирование с начального адреса кандидата с обратным шагом имеет границу инструкций в вашей заведомо хорошей точке.
IDK, если вы могли бы научиться находить более известные хорошие точки в обратном направлении, что в дальнейшемкандидаты также должны согласиться с.
Обязательно выделите для пользователя инструкции, декодированные в обратном направлении, красным или серым или что-то в этом роде, чтобы они знали, что это не гарантированно надежно.
Другой альтернативой является требование функциональных символов (externфункции или любая другая функция с отладочной информацией).
GDB не позволяет прокручивать вверх (в режиме layout reg
), если вы не находитесь внутри функции, которой известен начальный адрес.Затем, я думаю, он декодируется с начального адреса функции, поэтому он знает границы инструкций, когда попадает в ту часть, которая помещается в окне.
Если вы хотите вернуться назад, вам нужно disas 0x12345, +16
, чтобы начать декодирование стам.Затем вы можете прокрутить вниз, но если вы ошибетесь в границах insn, вы получите мусор.