Заменяет x86 сборку инструкции вызова? - PullRequest
16 голосов
/ 15 августа 2011

Какие есть альтернативы инструкции вызова x86?Может быть, что-то вроде нажатия адреса возврата, а затем прыжка?

И есть ли команда для получения текущей позиции в памяти?

Ответы [ 3 ]

20 голосов
/ 15 августа 2011

CALL фактически делает это для вас, например,

CALL my_func

будет делать что-то вроде

push ret_address
jmp my_func

, а последующий вызов RET будет просто использовать адрес, который вы только что передали в JMP обратночувство.Есть ли конкретная причина, по которой вы не хотите использовать CALL или она недоступна для вас?Для текущей позиции в памяти вы можете попробовать прочитать регистр EIP (не могу записать в него).

6 голосов
/ 15 августа 2011

Вы можете просто вставить значение dword и jmp в процедуру. Толчком будет адрес возврата:

push return_address (push eax if address in eax)
jmp call_address

Не забудьте также выдвигать аргументы, если они существуют для этого конкретного вызова.

Что вы подразумеваете под текущей позицией в памяти? Я предполагаю, что вы имеете в виду текущий указатель инструкции. Вы не можете получить это напрямую, но вы можете использовать обработчик seh (структурированный обработчик исключений), чтобы получить это значение при возникновении обработанного исключения.

1 голос
/ 28 октября 2017

Если я ничего не перепутаю, я бы сказал, что это зависит.Как вы можете видеть здесь есть ближний и дальний вызовы, но давайте просто рассмотрим ближайший вызов.Снова есть две возможности

E8 <offset> # relative
FF <address> # absolute

, тогда как FF означает абсолютный «скачок», а E8 действительно означает относительно тока eip.

Так что если у вас есть, например,

E8 32 45 ab 6f

, что означает

call 0x3245ab6f

Это будет означать

push %eip
add $0x3245ab6f, %eip

, а не

push %eip
jmp $0x3245ab6f
...