Как найти адрес jmp во время вызова функции x86? - PullRequest
0 голосов
/ 31 декабря 2010

Предположим, у нас есть оператор call foo.Поэтому, когда ассемблер встречает оператор вызова, он разбивает его на -

push ip + 6
jmp <addr of foo>

У меня есть адрес возврата в регистре ebx.Теперь я хочу выяснить, «addr of foo».Как мне это сделать?Я хочу подтвердить, что оператор push присутствует до jmp.Будет ли карта памяти выглядеть примерно так?

-------
push (what will be the value stored in this byte?? opcode ??)
-------
jmp (what will be the value stored in this byte?? opcode ??)
-------
jmp byte 1
-------
jmp byte 2
-------
jmp byte 3
-------
jmp byte 4
-------
return address stored in ebx
-------

Какие есть коды операций для push и jmp?

Ответы [ 4 ]

4 голосов
/ 31 декабря 2010

Ассемблер не разбивает call на две инструкции.call - это отдельная инструкция, которая имеет свои собственные коды операций машинного языка.

Существуют различные коды операций для call, в зависимости от типа вызова (ближний или дальний, адрес указан как относительное значение или косвенносодержимое памяти и т. д.) Для обычного типа вызова в 32-разрядном режиме (относительно ближнего вызова) вы должны иметь код операции E8, за которым следует 4-байтовое значение, которое указывает целевой адрес относительно следующей инструкции послеcall.

Для получения дополнительной информации см. запись для call в Руководстве Intel , том 2.

2 голосов
/ 31 декабря 2010

Как говорит @ wj32 в комментарии выше, CALL - это отдельная инструкция - она ​​не «разбивается» на PUSH и JMP.Код операции для CALL может быть E8, 9A или FF в зависимости от того, как указан адрес назначения.См. Руководство разработчика программного обеспечения для архитектур Intel® 64 и IA-32, том 2A: Справочник по наборам инструкций, AM в разделе 3.2 в разделе «ВЫЗОВ», для получения полной информации о различных кодах операций.

1 голос
/ 31 декабря 2010

Зависит от типа call.Вы можете получить всю необходимую информацию из руководств Intel .Это включает в себя кодирование команд и т. Д. Я приведу соответствующий бит ниже (для ближних вызовов):

Целевой операнд задает абсолютное смещение в сегменте кода (смещение от основаниясегмент кода) или относительное смещение (смещение со знаком относительно текущего значения указателя команды в регистре EIP; это значение указывает на инструкцию, следующую за инструкцией CALL).Регистр CS не изменяется при ближайших вызовах.

0 голосов
/ 31 декабря 2010

пользуйтесь диссамблером, и я думаю, вы можете получить абсолютный адрес foo потому что компоновщик делает это, а скомпилированный код не имеет имен. то же самое для глобальных переменных Например, если вы собрали, вы получите J Foo но скомпилируйте, затем разложите и получите j 0X45335

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...