Замены для инструкции "call" для сборки x86?
Каковы некоторые альтернативы инструкции по вызову 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
.
Итак, если у вас есть, например,
E8 32 45 ab 6f
что означает
call 0x3245ab6f
Это переведет на
push %eip
add $0x3245ab6f, %eip
а не
push %eip
jmp $0x3245ab6f