为什么 IAT 填充的是静态地址而不是函数名?

逆向工程 开箱 我在 进口改造
2021-06-22 10:54:08

当程序被打包时,OriginalFirstThunk 往往会被丢弃。当加载程序解析导入时,它如何知道要查找哪些函数?出于某种原因,IAT (FirstThunk) 甚至在系统加载之前就神奇地填充了地址,而不是函数名称。这是为什么?就好像链接器在编译时将 DLL 名称和 DLL 中的所有函数地址直接写到 IAT 中一样。谁能说地址在 DLL 更新时不会改变?还是在 ASLR 上?

为什么首先在 IAT 中有地址?不是应该指向函数名称并在运行时更改吗?如果 IAT 中已经存在“预编译”地址,那么为什么我们还需要在加载可执行文件时设置 IAT?

考虑到这一点,为什么我们甚至需要 OriginalFirstThunk?如果 IAT 有函数名称或地址,对我来说似乎没用。

1个回答

当加载程序解析导入时,它如何知道要查找哪些函数?

它解析导入表。对于每个条目,它解析 DLL 名称和关联的函数名称和/或函数序号。

出于某种原因,IAT (FirstThunk) 甚至在系统加载之前就神奇地填充了地址,而不是函数名称。这是为什么?

它用于绑定导入Iczelion 的教程 6:附录中的导入表的底部有一个对绑定导入的很好的解释

谁能说地址在 DLL 更新时不会改变?还是在 ASLR 上?

他们很可能改变,在这种情况下,Windows加载程序将忽略约束函数的地址,并在运行时用动态解析函数地址在IAT替换那些地址。

为什么首先在 IAT 中有地址?不是应该指向函数名称并在运行时更改吗?

不,导入表包含函数名称;导入地址表包含函数地址。