-
-
[原创]IAT的填充过程与执行流程
-
发表于:
2018-5-13 14:57
16560
-
调试器:OllyDbg
环境:WinXP SP3 虚拟机
什么是IAT呢。同一个函数,在A电脑里的首地址和在B电脑里的首地址是不一定相同的。系统版本不同,补丁版本不同,都会导致同一个函数的地址有所差异。如果找不到正确的系统API地址程序就没法正常调用函数,自然就没法运行。为了提升系统的兼容性,每次执行程序时软件都会重新获取一次
基于当前的系统的API的地址,并把这些地址集中起来管理,组成一个表。我们把这个表叫输入函数地址表,简称输入表。即IAT(import address table)。
有些壳没有彻底破坏掉IAT结构。比如ASpck,我们以一个加Aspack的课件为例,我们首先使用ESP定律来到OEP,此时壳已经将IAT还原完毕了。(关于ESP定律的详细解释可以参考坛主大大的文章https://bbs.pediy.com/thread-20366.htm)
然后,来看一个调用函数的实例。
call <imp.&KERNAL32.GetmoduleHandle>,点击这一行按下回车,来到跳转表
接着按下空格键,看到未经修饰的原始代码为 jmp [403238]
jmp [403238] ,数据窗口跟随403238,看到 [403238] = 752d582e,如下图。所以 jmp[403238] 等价于jmp 752d582e ,而752d582e 是函数GetModuleHandle的首地址,从而达到了调用 GetModuleHandle 函数的目的。当然并不是所有程序都保留有跳转表结构,本例对IAT的保存比较完整和系统,有跳转表。
那么能不能直接写 jmp 752d582e呢?不能,因为这个地址在每台电脑都不一样。必须用[4031ac]间接调用77d507ea。
本节我们初步了解了IAT长什么样,下一节我们接下来我们来了解IAT的原始结构及获取方法
在数据窗口右击-指定-PE头,然后转到400000(基址),查看PE文件,找到import table address=3000.这表示导入表指针偏移是3000,真实地址等于3000加上基址,即403000。
我们先来区分一下导入表(IT)和输入表(IAT)。导入表是IT(import table),输入表是IAT(import address table).IT的描述符结构是每5个Dword为一个单元,这个单元叫IID,如图所示
一个IID有五个字段,每个字段占一个Dword,但前三个字段一般没用,有用的是第四字段和第五字段。第四字段加基址403290,这里存放dll名称。我们定位到403290看一下
如图所示,dll的名称是user32.dll
第五字段里的内容加基址,作为指针指向的内容是这个dll的第一个函数地址。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2019-2-2 10:57
被admin编辑
,原因: 图片本地化