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
Другие вопросы по тегам