据我所知,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 的可执行文件可能是打包的可执行文件。虽然我还是不知道这些问题。
最佳答案
问题一: IAT 目录可以为空,因为它包含的信息对于 Windows 加载程序来说是无用的。所有需要的信息都在导入表中。请参阅 WinNT.h 中的 IMAGE_IMPORT_DESCRIPTOR -> FirstThunk
关于portable-executable - PE格式: Why the IAT can be empty,和MS绕道神话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33721573/