我想知道如何使用內聯程序集檢索調用我的函數的函數的地址。我的想法是將地址放到調用我的函數返回的地方,並使用它之前的指令(即調用函數調用我的函數),檢索調用我的函數的地址並添加到給定的偏移量調用下一條指令的地址(調用我的函數返回的地址)。到目前爲止,我能夠做到這一點,但得到我的地址。這是相當簡單的,它的工作原理:使用內聯程序集獲取調用我的函數的函數的地址
_asm
{
mov eax, [ebp+4]
mov returnTo,eax
}
long addressOfMine = (*((long*)(returnTo - sizeof(long)))) + returnTo)
這檢索我的地址就好了。 (通過知道[ebp + 4]是我的地址將返回的地址)
要做同樣的,但上面的一步,我試圖讓舊的ebp並做同樣的事情。我在一個網站上看到[ebp + 0]是舊的ebp,所以我嘗試過:
_asm
{
mov eax, [ebp]
mov ebx, [eax+4]
mov returnTo,ebx
}
long addressOfCaller = (*((long*)(returnTo - sizeof(long)))) + returnTo)
但它不起作用。所以,我的假設是錯誤的,或者我做錯了,所以我想問你的幫助。
您知道,通過全局交叉函數優化,可能會出現一些非常有趣的問題。如果編譯器正在執行跨功能CSE,則代碼可能並不嚴格位於任何用戶定義的函數中。 – Omnifarious 2010-01-31 02:36:23
我明白事情並不總是簡單,但事實是,我的功能將返回到一個函數,該函數將返回到另一個。所以,我想要的價值必須在某個地方。 – user246100 2010-01-31 02:38:46
除非它被內聯...... – 2010-01-31 02:43:31