PE - IAT 解析机制

逆向工程 聚乙烯 我在
2021-06-28 22:53:20

我试图了解 Windows 如何使用 IAT 解析函数。

我注意到当调用 Win API 函数时,该调用的结构并不总是相同的(它在二进制文件中仍然是一致的,但在两个不同的二进制文件之间则不同)。

有时,如果我遵循该调用的目标地址,我会发现跳转到已解析的 Win API 函数。有时,它直接调用已解析的函数。

例如:

  • 二进制 A 正在使用如下调用: call ds:GetSystemDirectoryW

  • 二进制 B 是这样调用的: call GetSystemDirectoryW -> jmp ds:__imp_GetSystemDirectoryW

有人可以向我解释调用过程中的这种差异吗?

1个回答

当编译器在编译时知道该函数来自 DLL 或使用整个程序优化时,可以由编译器生成直接调用。如果目标函数没有被标记为 dllimport,编译器会生成一个对外部符号的简单调用,并且在链接时这个外部符号被解析为一个实际跳转到 DLL 导入的存根。欲了解更多信息:

使用 __declspec(dllimport) 导入函数调用

什么是 DLL 导入绑定?