据我所知,导入地址表(IAT)是导入函数。但最近我发现在一些可执行文件中IAT为空:在IAT的目录中,VirtualAddress和Size都为零令我惊讶的是,一个没有IAT的可执行文件可以运行。
然后我在MS弯路中发现了一些代码:
// 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的可执行文件可以是打包的可执行程序。尽管我仍然不知道这些问题。
Q1:IAT目录可能是空的,因为它包含的信息对于windows加载程序来说是无用的。所有需要的信息都在导入表中。请参阅WinNT.h 中的IMAGE_IMPORT_DESCRIPTOR->FirstThunk