2013-02-27 80 views
1

我想了解一个使用gdb的小二进制文件,但有些东西我找不到实现的方法:如何才能找到指向指定地址的跳转列表? 我在反汇编代码中有一小组指令,我想知道它在哪里被调用。 我首先想到了在.text中搜索相应的指令,但由于跳转有很多种类,并且地址可以是相对的,所以这是行不通的。gdb:findind每跳转一个地址

有没有办法做到这一点?另外,如果我在这个地址上放置一个断点,有没有办法知道前一条指令的地址(在这种情况下是跳转)?

回答

0

如果这是一些子程序从其他地方调用,那么它必须在调用时尊重某个ABI。 根据使用的CPU,返回地址(以及调用它的位置)将被存储在某处(在堆栈或某些寄存器中)。如果您将原始代码替换为检查此代码的代码,则可以创建返回地址列表。或者更简单一些,如你所建议的那样,如果你使用gdb并在该例程中放置一个断点,你可以通过使用bt命令来查看它被调用的位置。如果它是真正的跳转(相对于“跳转到子程序”),导致你在那里(我怀疑,如果它是从很多地方调用的,除非它是一种longjmp/setjmp),那么你可能不会是能够确定这是从哪里调用的,除非您使用的CPU允许您以某种方式跟踪执行。

+0

是的我正在谈论一种longjump,但你是对的,我只需要在最后跳转到最初的“功能”。可以考虑一下,但我习惯了OllyDbg中的“在这里查找跳跃”这个功能。尽管在gdb中有这个可能会很有用。 正如你所指出的,另一个解决方案是使用回溯,但是它会导致我正在寻找的父功能(因为跳转没有在callstack上放置任何东西)。无论如何可以是一个解决方案。 **感谢您的回复!** – Foaly 2013-02-28 12:16:11