portable-executable - PE格式: Why the IAT can be empty,和MS绕道神话

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

最佳答案

问题一: 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/

相关文章:

windows - 如何确定 Windows 10 上可执行二进制文件的体系结构

c - 我的dll注入(inject)。编译为 32 位时成功,但编译为 64 位时失败

c - 如何在 Windows 文本编辑器上阻止打印功能(CTRL + P)?

c++ - MS Detours - DetourAttach 失败

C++ 读取 LPCVOID 指针的值

c++ - 如何在特定偏移量处存储变量

linux - PE 和 ELF 二进制格式有什么区别?

c++ - 每次重新编译后exe校验和不同

c++ - CreateRemoteThread - ERROR_ACCES_DENIED

c++ - 使用detours Hook 在记事本中书写文字