2013-02-27 1 views
1

Я пытаюсь понять маленький двоичный файл с использованием gdb, но есть что-то, что я не могу найти для достижения: как я могу найти список переходов, указывающих на указанный адрес ? У меня есть небольшой набор инструкций в разобранном коде, и я хочу знать, где он вызывается. Сначала я подумал о поиске соответствующей инструкции в .text, но поскольку есть много видов переходов, а адрес может быть относительным, это не сработает.gdb: findind every прыгает на адрес

Есть ли способ сделать это?

В качестве альтернативы, если я установил точку останова на этот адрес, есть ли способ узнать адрес предыдущей инструкции (в данном случае, переход)?

ответ

0

Если это некоторая подпрограмма, вызываемая из других мест, тогда она должна уважать некоторые ABI, пока она называется. В зависимости от используемого ЦП адрес возврата (и, следовательно, место, откуда он был вызван) будет храниться где-нибудь (в стеке или в некоторых регистрах). Если вы замените исходный код на тот, который исследует это, вы можете создать список обратных адресов. Или проще, как вы предположили, если вы используете gdb и помещаете точку останова в эту процедуру, вы можете видеть, откуда она была вызвана с помощью команды bt.

Если это был фактический прыжок (по сравнению с «прыжком в подпрограмму»), который привел вас туда (что я сомневаюсь, если он вызван из многих мест, если только это не тип longjmp/setjmp), то вы, вероятно, не будете способный определить, откуда это было вызвано, если только используемый вами CPU не позволяет проследить выполнение в некотором роде.

+0

Да, я говорю о виде longjump, но вы правы, мне просто нужно следовать прыжку в конце, который возвращается к начальной «функции». Мог бы подумать об этом, но я привык к этой функции «найти прыжки, указывающие здесь» в OllyDbg. Однако было бы полезно иметь это в gdb. Другое решение, как вы указали, это использовать обратную линию, но это приводит к родительской функции той, которую я ищу (так как прыжок ничего не помещал в callstack). Может быть решение в любом случае. ** Спасибо за ваш ответ! ** – Foaly