2012-07-11 79 views
2

有人能向我解釋,在x64平臺上的以下行爲: 如果我從我的可執行文件在64位另一個DLL調用一個函數的反彙編代碼看起來是這樣的:64調用另一個DLL的功能

000000014000149E FF 15 34 CF 00 00 call qword ptr [__imp_CFuncInDll (14000E3D8h)] 

我意識到調試器計算相對地址到這個絕對地址14000E3C0h。然而不同於x86代碼,如果我拆開14000E3D8h它看起來像垃圾地址:

__imp_CFuncInDll: 
000000014000E3D8 19 10    sbb   dword ptr [rax],edx 
000000014000E3DA 25 FC FE 07 00  and   eax,7FEFCh 
000000014000E3DF 00 14 10    add   byte ptr [rax+rdx],dl 
000000014000E3E2 25 FC FE 07 00  and   eax,7FEFCh 
000000014000E3E7 00 00    add   byte ptr [rax],al 
....... 

當我踏進電話,我可以看到的是,而不是進入代碼跳轉到一個有效地址的垃圾地址:

000007FEFC251019 E9 62 00 00 00  jmp   CFuncInDll (7FEFC251080h) 

我的問題:
如何調用指令在x64解碼時的目標是在另一個模塊? 在86這個碼的呼叫目標:

FF 15 34 CF 00 00 call 

是:目標=下一個指令地址在x64 + 0x0000CF34
儘管它看起來像這樣情況並非如此。

回答

7

call qword ptr [__imp_CFuncInDll (14000E3D8h)]是通過指針進行的間接調用。指針的地址是0x14000E3D8。如果你看看你的無感拆卸代碼的字節,他們變成包含以下內容:

19 10 25 FC FE 07 00 00 

這是一個小端四字是:000007fe.fc251019 - 在jmp CFuncInDll指導你到時的地址你單步。

基本上,對導入函數的調用正在通過地址表中的條目被調用爲一個跳轉到實際函數實現的小「thunk」的調用。

1

您試圖反彙編代碼而不是代碼的指針。

該指令

000000014000149E FF 15 34 CF 00 00 call qword ptr [__imp_CFuncInDll (14000E3D8h)]

讀取從相對於所述指令的開始地址的指針跟隨它,也就是,它增加了14000149EH,6(此call指令的長度)和0CF34H ,到達地址14000E3D8H,從那裏讀取8個字節,那(這8個字節:19H,10H,25H,0FCH,0FEH,7H,0,0)是這個call傳輸控制的地址7FEFC251019H。

您應該在地址7FEFC251019H處進行拆卸。