在上一篇文章手动打造一个弹窗程序中,我们自己手写了一份导入表,在调用函数的时候,我们CALL的是导入地址表的一个地址,为什么要调用这里,而且在构造导入表的时候,导入名称表(INT)和导入地址表(IAT)里面装的内容是一样的,程序又是怎么去调用的,在这篇文章中就来分析一下。
注:以下操作是在 XP 上实现的,其他版本注意写保护机制
目录
0x00 IAT表的填写
0x01 IAT HOOK的原理
0x02 实现代码
0x00 IAT表的填写
在上一篇文章中,我们构造导入表的时候,将 IAT 表和 INT 表都指向的是函数名称所在的位置,然后在运行的时候,IAT 表中的内容会被替换成对应函数的地址,在调用的时候使用间接 CALL ,来调用其中所储存的地址。
下面先来验证一下,函数调用的地址是 0x4010D8 ,在 OD 中进行查看
可以发现,已经正确的填写了,那么操作系统又是根据什么来填写的
首先操作系统会通过 Name 字段找到当前导入表的名字,然后调用 LoadLibrary 得到句柄,如果没有找到的话会提示找不到 dll 文件,报错情况如下