因此,假設我可以訪問程序的寄存器。我可以訪問esp,ebp和eip。 eip指向需要執行的下一條指令,ebp指向另一個幀指針,esp指向堆棧的頂部。我明白這一點,但我不瞭解堆棧的其餘部分或如何解析它。解析堆棧和寄存器(EBP,EIP,ESP)並確定哪個函數與每個幀相關
例如,如果我想獲得一個幀的局部變量,我應該只是減去ebp - esp
(明知ebp
比esp
一個更大的地址),然後再通過這些地址和間接引用他們呢?這是從特定幀獲取局部變量的正確方法嗎?
另一個問題是,找出哪個函數與每個幀相關的最佳方法是什麼?如果我將ebp
地址減1,然後解除引用該值,我應該得到返回地址「0x804 ...」嗎?這個地址和這個函數之間有什麼關係?例如,如果Foo()具有較高的pc地址0x8045555
和較低的pc地址0x8045550
,那麼我將在這些地址之間得到的返回地址是什麼?
感謝了很多先進的,讓我知道,如果我不太清楚..
注意:如果有人有更好的標題表明它,我沒有找到一個更好的。
嗯,我想我想全面瞭解。現在我正在使用Pin來讀取程序中的寄存器,並且我正在開發類似於調試器的東西。問題是我有EBP的地址,我認爲通過減去1然後解除引用我會得到幀的返回地址,但我沒有那樣做。感謝您的鏈接,我會檢查出來! @JameySharp – attis
您可能需要減去4,而不是1,因爲在彙編級別,所有指針算術都是以字節爲導向的。 (至少,在x86上...) –