Каковы некоторые альтернативы инструкции по вызову x86?
Может быть, что-то вроде толчка обратного адреса, а затем прыжок?
Также их команда для получения текущей позиции в памяти?
Ответ 1
CALL действительно делает это для вас, например
CALL my_func
сделает что-то вроде
push ret_address
jmp my_func
и последующий вызов RET будет просто использовать адрес, который вы просто нажали на JMP в некотором смысле. Есть ли конкретная причина, по которой вы не хотите использовать CALL или она недоступна для вас?
Для текущей позиции в памяти вы можете попробовать прочитать регистр EIP (не можете писать на него).
Ответ 2
Вы можете просто нажать значение dword и jmp для процедуры. Точкой будет адрес возврата:
push return_address (push eax if address in eax)
jmp call_address
Не забудьте также нажать аргументы, если они существуют для этого конкретного вызова.
Что вы подразумеваете под текущей позицией в памяти? Я предполагаю, что вы имеете в виду текущий указатель инструкции. Вы не можете получить это напрямую, но вы можете использовать обработчик seh (структурированный обработчик исключений), чтобы получить это значение при вызове обработанного исключения.
Ответ 3
Если я не получу что-то смешное, я бы сказал, это зависит. Как вы можете видеть здесь есть ближние и дальние звонки, но давайте просто рассмотрим ближний звонок. Есть еще две возможности
E8 <offset> # relative
FF <address> # absolute
тогда как FF означает абсолютный "прыжок" и E8 действительно означает относительный ток eip.