2012-12-26 49 views
1

我學習上的Windows XP環境 FASM而我讀了FASM的源代碼,我發現調用宏調用從裝配的Windows API,但沒有硬編碼地址

invoke MessageBox,0,[_strbuf],_msgcap,MB_ICONINFORMATION+MB_OK 

和導入宏。

import user,\ 
    MessageBox,'MessageBoxA',\ 
    wsprintf,'wsprintfA' 

但我無法找到MessageBoxA的任何硬編碼地址,也無法在彙編代碼中加載user32.dll。 只有標記字符串但不是地址的宏定義。

我的假設是這樣的

  1. 有是加載user32.dll中和=>回到這裏加載的DLL的起始地址代碼,讓我們調用返回地址位置的

  2. 有(如MessageBoxA = 0x00000000)

  3. 所以指令'call'可以調用MessageBoxA標籤(它將被轉換爲位置A + MessageBoxA偏移量)

是我的假設錯了嗎? 我不知道如何調用API。

感謝

回答

1

Read the FASM documentation,它說明了如何MessageBoxA() user32.dll中被引用。

然後read the MSDN documentation關於Windows可執行文件的實際工作方式。請特別注意PE文件導入部分,它解釋了在運行時如何解析導入的DLL函數的地址。

簡而言之,FASM中的import語句在編譯後的EXE文件中的查找表中設置了一個條目。當EXE在其代碼開始運行之前加載到內存中時,操作系統會填充該查找表。

0

下面是自由的Dependency Walker工具的屏幕截圖。

注意:有一個函數名稱,序數和入口點。

所以是的,你推斷的是非常多的。這些函數在運行時鏈接而不是在編譯時鏈接。 (DLL動態鏈接庫)。

enter image description here

相關問題