据我所知,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的可执行文件可能是打包的可执行文件。虽然我仍然不知道这些问题。
答案 0 :(得分:0)
Q1: IAT目录可以为空,因为它包含的信息对于Windows加载程序是无用的。所有需要的信息都在导入表中。见IMAGE_IMPORT_DESCRIPTOR - > WinNT.h中的FirstThunk