2016-11-09 34 views
0

對進口函數生成的我不知道如果我正確的措辭問題,但基本上我想知道是如何產生的調用指令調用從另一個庫中導入函數時。如何調用指令得到一個編譯的模塊

例如

GetModuleFileName(...) 

被編譯爲

call 0x4D0000 

其中0x4D0000是導入的函數,它是動態的地址。

如何Windows中設置這些電話,並有可能繞過它並設置自定義地址來代替。

+1

您正在尋找的術語叫做* relocation。* – fuz

回答

1

調用語句中使用的地址不是動態的。這是一個相對地址,在鏈接時固定,就像調用任何其他函數一樣。這是因爲這個調用實際上是一個存根,並且這個存根執行間接跳轉到這個實函數。間接跳轉使用引用導入表中位置的內存操作數。當Windows加載可執行文件(或DLL)時,它將使用可執行文件或DLL在鏈接到的任何DLL中使用的所有函數的地址更新導入表。

所以,如果一個可執行這樣的調用指令:

call [email protected] 

然後在其他地方在同一個可執行文件astub這樣的:

[email protected]: 
    jmp [[email protected]] 

而且某處導入表有一個定義像這樣:

[email protected]: 
    DD ? 

Windows設置值[email protected]在加載可執行文件(或DLL)時的導入表中。儘管在加載可執行文件(或DLL)後更改該值並不難,但您可以做些改變。請注意,導入表可能位於只讀部分,這意味着您可能需要更改虛擬內存保護才能執行此操作。

相關問題