據我所知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可能是打包的可執行文件。雖然我仍然不知道這些問題。