2011-01-05 62 views
0

這是我在VC++項目中插入的一個簡單的asm代碼。 return_addr是堆棧幀的返回地址。我有一個StackWalk函數(不是我寫的codeproject.com/KB/threads/StackWalker.aspx),它使用StackWalk64()來提取幀。這個細節不相關。使用返回地址,我從當前正在檢查的堆棧中的函數代碼中提取一個字節。在彙編代碼中讀取訪問衝突

__asm{ 
     push eax 
     push ecx 

     mov eax, return_addr 

     mov cl, BYTE PTR [eax - 5] //Problem Statement 
     mov ret_5, cl 

     pop ecx 
     pop eax 
} 

我運行我的代碼以及其他應用程序,如gtalk,vlc等。應用程序總是崩潰時,我包括問題陳述。當我刪除這些聲明一切正常。我運行了一個調試器,並在顯示訪問衝突讀取位置0xzzzzzz錯誤的問題陳述處中斷。我想應用程序試圖讀取某些受限制的dll或代碼段的代碼,並引發錯誤。我用了一個try catch塊,但沒有幫助。對我能做什麼有任何建議?

+0

你能澄清一下「堆棧幀的返回地址」是什麼意思?似乎這可能是您所遇到的核心問題。 – 2011-01-05 16:02:53

+0

0xzzzzzz?如何發佈實際地址? – 2011-01-06 07:27:22

+0

@Jonathan:每個堆棧幀都有一個返回地址,一旦函數終止,控制權就會被轉移。它在呼叫者功能中。 – Bruce 2011-01-07 03:56:30

回答

0

很明顯,無論return_addr的值是什麼,它都不會指向有效的內存位置,否則將不會發生訪問衝突。所以這些細節非常相關。

+0

return_addr包含一個有效值。我記錄了所有數據,並在日誌文件中獲得了有效的ret_5值,但對於return_addr的某些值(請參見上文),程序崩潰。 googletalk模塊的基地址是0x400000。所以這些地址看起來有點可疑。 – Bruce 2011-01-07 04:02:16