什么是 IAT?以及如何在打包的 exe 中找到 IAT 的结尾?

逆向工程 开箱 我在
2021-07-11 10:11:01

我最近开始在空闲时间学习 RE。我开始看 lena151 免费教程,现在我在看包装器/保护器。

现在我到达了他展示如何手动查找 IAT 结尾的部分,他说“你看,我们可以很容易地找到 IAT 的结尾,它在 493854 上......”

0049380C  D0 E9 5F 73 C0 4A 65 73 70 68 65 73 A0 61 66 73  ׀י_sְJesphes afs
0049381C  50 C4 64 73 D0 66 65 73 40 6B 66 73 00 00 00 00  Pִds׀fes@kfs....
0049382C  C0 41 7E 75 10 0A 7A 75 00 00 00 00 00 F3 64 75  ְA~u.zu.....ףdu
0049383C  00 00 00 00 10 F4 00 77 00 6A 01 77 10 69 01 77  ....פ.w.jwiw
0049384C  00 00 00 00 6E 17 00 10 00 00 00 00 6B 65 72 6E  ....n.....kern
0049385C  65 6C 33 32 2E 64 6C 6C 00 00 00 00 44 65 6C 65  el32.dll....Dele
0049386C  74 65 43 72 69 74 69 63 61 6C 53 65 63 74 69 6F  teCriticalSectio
0049387C  6E 00 00 00 4C 65 61 76 65 43 72 69 74 69 63 61  n...LeaveCritica

现在我不明白他怎么知道 IAT 的尽头是在垃圾场上看的?

另外,我没有完全理解什么是 IAT,任何帮助都会很棒:-)

1个回答

我没有完全理解什么是 IAT,任何帮助都会很棒:-)

IAT 是导入地址表。它是一个指向静态导入的 API 函数地址的指针数组。IAT 条目在运行时填充。

IAT 的格式通常如下,来自特定 DLL 的所有函数组合在一起,用空指针分隔每个 DLL 的函数地址列表:

<pointer to DLL #1's function A>, <pointer to DLL #1's function B>, <pointer to DLL #1's function C>, 0x00000000, <pointer to DLL #2's function D>, <pointer to DLL #2's function E>, ..., 0x00000000

请注意,此格式不是必需的,但它是最常见的格式。

现在我不明白他怎么知道 IAT 的尽头是在垃圾场上看的?

我在下面突出显示了每个 IAT 函数(使用 mspaint),并为每个 DLL 分组使用了不同的颜色。在虚拟地址处,0x0049380C我们看到函数地址0x735FE9D00x73654AC0等。您可以看出它们很可能来自同一个 DLL,因为:

  1. 没有空指针将它们分开,并且
  2. 它们都在相同的地址范围内 ( 0x735F0000- 0x7366FFFF)

我在

处的 DWORD 0x00493850(在 处的空指针之后0x0049384C)是0x1000176E,因此您可以在调试器中查找该地址并查看是否在该地址处加载了 DLL 代码。如果没有,0x0049384C将标志着 IAT 的结束。如果是这样,0x00493854将标记 IAT 的结尾,因为数据0x00493858是 ASCII 字符串的开头,显然不是有效的函数指针。