PE格式:为什么IAT可以为空,而MS绕道而行

时间:2015-11-15 15:47:20

标签: portable-executable dll-injection detours

据我所知,import address table (IAT)是一张表 导入功能。但最近我发现在一些可执行文件中 IAT为空:在IAT的目录中,VirtualAddress和Size都是 零。令我惊讶的是,没有IAT的可执行文件可以运行。

然后我在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 - 它将以挂起模式创建进程, 修改导入表(添加DLL),并恢复主线程 跑。上面的代码是此过程的一部分。

根据我的测试,如果你评论上面的代码,进程会 一开始就崩溃了。但更令人惊奇的是,你可以 自由修改VirtualAddress和Size,例如:

// 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的可执行文件可能是打包的可执行文件。虽然我仍然不知道这些问题。

1 个答案:

答案 0 :(得分:0)

Q1: IAT目录可以为空,因为它包含的信息对于Windows加载程序是无用的。所有需要的信息都在导入表中。见IMAGE_IMPORT_DESCRIPTOR - > WinNT.h中的FirstThunk