2015-11-15 58 views
2

據我所知import address table (IAT)是一個 導入函數表。但最近我發現在一些可執行文件中,IAT是空的:在IAT的目錄中,VirtualAddress和Size都是 零。令我驚訝的是,沒有IAT的可執行文件可以運行。PE格式:爲什麼IAT可以爲空,而MS繞行走神話

然後我發現了一些代碼MS detours

// If the file doesn't have an IAT_DIRECTORY, we create it... 
if (inh.IAT_DIRECTORY.VirtualAddress == 0) { 
    inh.IAT_DIRECTORY.VirtualAddress = obBase; 
    inh.IAT_DIRECTORY.Size = cbNew; 
} 

有一個在MS稱爲DetourCreateProcessWithDllExA的API 走彎路,正如它的名字說,它可以啓動一個可執行文件 指定的DLL - 它會創建一個進程在暫停模式下, 修改導入表(添加DLLs),並恢復主線程爲 運行。上面的代碼是這個過程的一部分。

根據我的測試,如果您對上面的代碼發表評論,進程將會在最初的時候崩潰 。但更令人驚訝的是,你可以 修改其VirtualAddress和大小自由,例如:

// If the file doesn't have an IAT_DIRECTORY, we create it... 
if (inh.IAT_DIRECTORY.VirtualAddress == 0) { 
    inh.IAT_DIRECTORY.VirtualAddress = 123; 
    inh.IAT_DIRECTORY.Size = 456; 
} 

和它的作品!我不知道爲什麼。看來obBase和cbNew做 也沒有任何意義。

Q1:爲什麼IAT可以爲空

Q2:爲什麼MS彎路必須修改IAT,這是怎麼回事

編輯:

的可執行空IAT可能是打包的可執行文件。雖然我仍然不知道這些問題。

回答

0

Q1: IAT目錄可能爲空,因爲它包含的信息對於Windows加載程序無用。所有需要的信息都在導入表中。請參閱IMAGE_IMPORT_DESCRIPTOR - > WinNT.h中的FirstThunk

相關問題