2013-02-27 88 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