ASM: записать команду перехода в двоичный файл x86-64
Я отлаживаю 64-битное приложение Mac OSX с помощью GDB. Я вижу, что перепрыгивание через кусок кода решает все мои проблемы.
Но:
Как я могу исправить исполняемый файл для реализации перехода? Я хочу, чтобы приложение автоматически переходило к определенной точке кода без отладчика.
Вот что я хочу сделать:
по адресу 0x1000027a9
(предоставляется отладчиком) перейти к адресу 0x100003b6e
, Я очень стараюсь сделать это через HexEdit, но безуспешно. Я где-то читал про jmp по абсолютным адресам опкоды (FF
кажется правильный код операции, но это вызов, а не прыжок...) но ничего не работает. плохой доступ, сигфо.
Как я могу это сделать?
Спасибо.
1 ответ
То, что вы хотите, не call
, но jmp
и вы хотите прямой jmp
, Прямые переходы обычно используют адресацию относительно следующей инструкции rip
(см. мой ответ на вопрос SO: Как закодировать относительно короткий JMP в x86).
Итак, вы на 0x1000027a9
и хочу прыгнуть 0x100003b6e
,
0x100003b6e
- 0x1000027a9
знак равно 0x000013C5
знак равно 5061d
так что окончательно не вписывается в короткий прыжок (rel8
в документации Intel), но вам нужно jmp rel32
, Это будет соответствовать rel16
тоже, но это не поддерживается в x86-64 (в 64-битном режиме).
Итак, вы хотите jmp rel32
, Это закодировано относительно следующей инструкции послеjmp
и, поскольку длина инструкции составляет 5 байт (E9 xx xx xx xx
), rel32
будет 0x000013C0
, Поскольку x86 - это архитектура с прямым порядком байтов, она кодируется как E9 C0 13 00 00
,
Чтобы подтвердить это, я собрал небольшой тестовый исполняемый файл с NASM и разобрал его с помощью ndisasm (обратите внимание, я оставил первым 0x10000000
байт, но поскольку переход является относительным, он ничего не меняет в кодировке):
000027A8 90 nop
000027A9 E9C0130000 jmp dword 0x3b6e ; this is the instruction you need.
000027AE 90 nop