Вопрос о заявлении CALL - PullRequest
       1

Вопрос о заявлении CALL

0 голосов
/ 04 января 2011

У меня есть следующий код в VC ++

Func5(){ StackWalk(); }
Func4{ Func5();}

Я новичок в ассемблере x86.Я пытаюсь узнать начальный адрес Func5 ().Я получаю адрес возврата Func5 () из его стекового фрейма.Теперь перед этим обратным адресом должен быть оператор CALL.Поэтому я извлекаю байты перед обратным адресом.

Иногда это ближайший вызов, например E8 ff ff ff d8.Поэтому для этого оператора я вычитаю смещение 0x28 из адреса возврата функции, чтобы получить базовый адрес Func5 () (где он находится в памяти).

Проблема в том, что я не знаю, как рассчитать это длякосвенный вызов NEAR.Я пытался выяснить, как сделать это в течение некоторого времени.Итак, я извлек первые 5 байтов перед обратным адресом, и они равны ff 75 08 ff d2 Я думаю, что это означает CALL ECX (ff d2), но я не уверен.

Я буду очень признателен, если кто-то может сказать мнеэто как оператор CALL, и как я могу вычислить базовый адрес функции из этого вида вызова.

Ответы [ 2 ]

1 голос
/ 04 января 2011

Для разборки вещей проще всего использовать дизассемблер.

Предполагая, что 32-битный 80x86, NDISASM говорит, что "ff 75 08 ff d2" это:

00000000  FF7508            push dword [ebp+0x8]
00000003  FFD2              call edx

В этомВ этом случае адрес функции будет в регистре EDX.

1 голос
/ 04 января 2011

Сообщите компилятору и компоновщику создать файл подробной карты.Я не знаю о последних версиях, но раньше можно было запросить дамп на языке ассемблера, включая коды операций.

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