2011-03-01 29 views

回答

2

相對呼叫用於內部模塊調用,調用直接存儲器地址當然是可能的,但(這是與WinAPI的功能相當多的完成):

FF15 B8401301 CALL DWORD PTR DS:[<&MSVCR100.printf>] ; \printf - note this calling with a pointer to the abs address stored in the IAT 

這主要是由於這樣的事實: windows dll不能被重新分配(再加上他們坐在一個特殊的地址空間,因爲每個應用都有自己的'系統dll'視圖),但用戶dll可以很容易地重新分配(尤其是使用ASLR)。 see wikipedia's article on this as well.

此外,不要混淆間接符號表調用(也稱爲模塊間調用)與純粹的相對調用。如果你調用當前模塊之外的功能,你會得到存儲在符號表中的絕對地址相對呼叫:

CALL MySymb 

MySymb: JMP &MySymbAbs 

或更好的,真實世界的版本:

6FC019E9 E8 300D0000 CALL <JMP.&Storm.#501> ; CALL 6FC0271E without name labeling 
6FC0271E - FF25 8071C06F JMP DWORD PTR DS:[<&Storm.#501>] ; Storm.#501 

所有這些在很大程度上取決於您的編譯器,有些我會直接調用符號來處理所有事情,有些只會在系統dll和/或COM接口上執行。

只是順便說一句,在32位x86上,你在技術上沒有4GB可用的用戶級應用程序,通常3GB。

相關問題