据我所知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可以为空

问题2:为什么MS绕道行驶必须修改IAT,这是怎么回事

编辑:

IAT为空的可执行文件可能是打包的可执行文件。虽然我仍然不知道这些问题。

最佳答案

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

关于portable-executable - PE格式:为什么IAT可以为空,而MS绕开了神话,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33721573/

10-09 16:50