---恢复内容开始---

IAT(Import Address Table:输入函数地址表)

【IAT作用是什么:】

一个API函数,比如MessageBoxA,我们是如何调用它的呢,

在这里我们可以看出是通过一个间接跳转来抵达了MessageBoxA的入口点。

它的入口点在我的电脑上是75F1FDAE,但是在其他版本操作系统或者User32.dll版本不相同的电脑上,入口点就可能会不同。

为了解决以上兼容问题,操作系统就必须提供一些措施来确保该CrackMe可以在其他版本的Windows操作系统,以及DLL版本下也能正常运行。

这时IAT(Import Address Table:输入函数地址表)就应运而生了。

【 IAT是什么:】

这时我们在数据窗口看看调用MessageBoxA时JMP的4031AC有什么

我们看到里面是MessageBoxA的入口点

除了MessageBoxA,我们还可以看到很多类似的间接JMP。

这一片区域包含了该程序调用的所有API函数的入口地址,这块区域我们称之为IAT(导入函数地址表),这里就是解决不同版本操作系统间调用API兼容问题的关键所在,

不同版本操作系统,相同API函数的入口点不相同,这时我们就需要提前把API函数地址填充到IAT中,然后像刚才一样通过间接跳转来调用该API函数即可,

这样就可以确保不同版本系统调用的都是正确的API函数。

那么现在问题来了,【何将API函数入口地址填充到IAT中呢?】

现在我们仍以调用MessageBoxA时间接跳转IAT的4031AC内存单元为例,这里我们选中4031AC中保存的内容,单击鼠标右键选择-View executable file(浏览可执行文件),

就能看到4031AC这个虚拟地址对应于可执行文件中的文件偏移是多少了。

我们看到在可执行文件对应文件偏移处中的内容为60 33 00 00,当程序运行起来的时候,0FAC这个文件偏移对应的虚拟地址处就会被填充为EA 04 D5 77,

也就是说该CrackMe进程空间中的4031AC地址处会被填入正确的API函数地址,然后就可以通过间接跳转来调用MessagBoxA啦。

这里3360加上映像基址即,我们定位到403360处,看看是什么。

哇看到了一个字符串,是我们调用函数API的名字MessagBoxA,也就是说操作系统根据这个字符串,能够定位到相应的API函数名称,然后通过调用GetProcAddress(注)获取对应API函数的地址,

然后将该地址填充到IAT中,覆盖原来的3360。这样就能保证在程序执行前,IAT中被填充了正确的API函数地址。如果我们换一台机器,定位到4031AC处,可能会看到里面存放着不同的地址。

这样就能够调用MessageBoxA了,大家可能会觉得这个过程很复杂,其实填充IAT的过程都是操作系统帮我们完成的,在程序开始执行前,IAT已经被填入了正确的API函数地址。

到现在为止,操作系统是如何填充IAT的了,而要成功执行应该满足:

可执行文件各IAT项所在的文件偏移处必须是一个指针,指向一个字符串(如:MessagBoxA)。

【直接跳转和间接跳转】

 

跳转分为两种,直接跳转和间接跳转

直接跳转

跳转的目的地为后面的内存单元

间接跳转

跳转的真正目的地保存在内存单元中

当程序需要调用某个API函数的时候,都是通过一个间接跳转来调用的

---注释---

FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
 
 
参考书籍:《使用OllyDbg从零开始Cracking》———RicardoNarvaja

---恢复内容结束---

IAT(Import Address Table:输入函数地址表)

【IAT作用是什么:】

一个API函数,比如MessageBoxA,我们是如何调用它的呢,

在这里我们可以看出是通过一个间接跳转来抵达了MessageBoxA的入口点。

它的入口点在我的电脑上是75F1FDAE,但是在其他版本操作系统或者User32.dll版本不相同的电脑上,入口点就可能会不同。

为了解决以上兼容问题,操作系统就必须提供一些措施来确保该CrackMe可以在其他版本的Windows操作系统,以及DLL版本下也能正常运行。

这时IAT(Import Address Table:输入函数地址表)就应运而生了。

【 IAT是什么:】

这时我们在数据窗口看看调用MessageBoxA时JMP的4031AC有什么

我们看到里面是MessageBoxA的入口点

除了MessageBoxA,我们还可以看到很多类似的间接JMP。

这一片区域包含了该程序调用的所有API函数的入口地址,这块区域我们称之为IAT(导入函数地址表),这里就是解决不同版本操作系统间调用API兼容问题的关键所在,

不同版本操作系统,相同API函数的入口点不相同,这时我们就需要提前把API函数地址填充到IAT中,然后像刚才一样通过间接跳转来调用该API函数即可,

这样就可以确保不同版本系统调用的都是正确的API函数。

那么现在问题来了,【何将API函数入口地址填充到IAT中呢?】

现在我们仍以调用MessageBoxA时间接跳转IAT的4031AC内存单元为例,这里我们选中4031AC中保存的内容,单击鼠标右键选择-View executable file(浏览可执行文件),

就能看到4031AC这个虚拟地址对应于可执行文件中的文件偏移是多少了。

我们看到在可执行文件对应文件偏移处中的内容为60 33 00 00,当程序运行起来的时候,0FAC这个文件偏移对应的虚拟地址处就会被填充为EA 04 D5 77,

也就是说该CrackMe进程空间中的4031AC地址处会被填入正确的API函数地址,然后就可以通过间接跳转来调用MessagBoxA啦。

这里3360加上映像基址即,我们定位到403360处,看看是什么。

哇看到了一个字符串,是我们调用函数API的名字MessagBoxA,也就是说操作系统根据这个字符串,能够定位到相应的API函数名称,然后通过调用GetProcAddress(注)获取对应API函数的地址,

然后将该地址填充到IAT中,覆盖原来的3360。这样就能保证在程序执行前,IAT中被填充了正确的API函数地址。如果我们换一台机器,定位到4031AC处,可能会看到里面存放着不同的地址。

这样就能够调用MessageBoxA了,大家可能会觉得这个过程很复杂,其实填充IAT的过程都是操作系统帮我们完成的,在程序开始执行前,IAT已经被填入了正确的API函数地址。

到现在为止,操作系统是如何填充IAT的了,而要成功执行应该满足:

可执行文件各IAT项所在的文件偏移处必须是一个指针,指向一个字符串(如:MessagBoxA)。

【为什么脱壳后要修复IAT呢】

因为壳把IAT破坏了,

壳压根不需要原程序的IAT,因为被加壳程序首先会执行解密例程,读取IAT中所需要的API的名称指针,然后定位到API函数地址,将其填入到IAT中,这个时候,IAT中已经被填充了正确的API函数地址,

对应的API函数名称的字符串已经不需要了,可以清除掉。大部分的壳会将API函数名称对应的字符串以密文的形式保存到某个地址处,让Cracker们不能那么容易找到它们。

【直接跳转和间接跳转】

 

跳转分为两种,直接跳转和间接跳转

直接跳转

跳转的目的地为后面的内存单元

间接跳转

跳转的真正目的地保存在内存单元中

当程序需要调用某个API函数的时候,都是通过一个间接跳转来调用的

---注释---

FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
 
 
参考书籍:《使用OllyDbg从零开始Cracking》———RicardoNarvaja
 
  仅允许非商业转载,转载请注明出处

初探IAT的更多相关文章

  1. 初探领域驱动设计(2)Repository在DDD中的应用

    概述 上一篇我们算是粗略的介绍了一下DDD,我们提到了实体.值类型和领域服务,也稍微讲到了DDD中的分层结构.但这只能算是一个很简单的介绍,并且我们在上篇的末尾还留下了一些问题,其中大家讨论比较多的, ...

  2. CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探

    CSharpGL(8)使用3D纹理渲染体数据 (Volume Rendering) 初探 2016-08-13 由于CSharpGL一直在更新,现在这个教程已经不适用最新的代码了.CSharpGL源码 ...

  3. 从273二手车的M站点初探js模块化编程

    前言 这几天在看273M站点时被他们的页面交互方式所吸引,他们的首页是采用三次加载+分页的方式.也就说分为大分页和小分页两种交互.大分页就是通过分页按钮来操作,小分页是通过下拉(向下滑动)时异步加载数 ...

  4. JavaScript学习(一) —— 环境搭建与JavaScript初探

    1.开发环境搭建 本系列教程的开发工具,我们采用HBuilder. 可以去网上下载最新的版本,然后解压一下就能直接用了.学习JavaScript,环境搭建是非常简单的,或者说,只要你有一个浏览器,一个 ...

  5. .NET文件并发与RabbitMQ(初探RabbitMQ)

    本文版权归博客园和作者吴双本人共同所有.欢迎转载,转载和爬虫请注明原文地址:http://www.cnblogs.com/tdws/p/5860668.html 想必MQ这两个字母对于各位前辈们和老司 ...

  6. React Native初探

    前言 很久之前就想研究React Native了,但是一直没有落地的机会,我一直认为一个技术要有落地的场景才有研究的意义,刚好最近迎来了新的APP,在可控的范围内,我们可以在上面做任何想做的事情. P ...

  7. 【手把手教你全文检索】Apache Lucene初探

    PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...

  8. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  9. NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例

    一.消息队列场景简介 “消息”是在两台计算机间传送的数据单位.消息可以非常简单,例如只包含文本字符串:也可以更复杂,可能包含嵌入对象.消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器 ...

随机推荐

  1. 【LeetCode】98. Validate Binary Search Tree

    题目: Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is define ...

  2. Java多线程(二) —— 线程安全、线程同步、线程间通信(含面试题集)

    一.线程安全 多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不存在执行结果的二义性,就可以称作是线程安全的. 讲到线程安全问题,其实是指多线程环境下对共享资源的访问可能会 ...

  3. 自定义MapReduce中数据类型

    数据类型(都实现了Writable接口) BooleanWritable 布尔类型 ByteWritable 单字节数值 DoubleWritable 双字节数值 FloatWritable 浮点数 ...

  4. HTML5+CSS3静态页面项目-BusinessTheme的总结

    因为期末考试.调整心态等等的种种原因,距离上一次的项目练习已经过了很久了,今天终于有时间继续练习HTML5+CSS3的页面架构和设计稿还原.设计图很长,整个页面分为了好几个区域,所以就不放完整的设计图 ...

  5. windows平台python 2.7环境编译安装zbar

    最近一个项目需要识别二维码,找来找去找到了zbar和zxing,中间越过无数坑,总算基本上弄明白,分享出来给大家. 一.zbar官方介绍 ZBar 是款桌面电脑用条形码/二维码扫描工具,支持摄像头及图 ...

  6. 通过ALM OTA API获取test case的信息,并上传测试结果到test set中

    ALM提供了OTA接口,可以用来获取和上传测试数据到ALM.比如获取Test case的step信息.上传测试结果到test instance. 在ALM的Help中可以下载相关文档,这里以ALM11 ...

  7. 如何删除 SQL Server 表中的重复行

    第一种:有主键的重复行,就是说主键不重复,但是记录的内容重复比如人员表tab ,主键列id,身份证编号idcard当身份证重复的时候,保留最小id值的记录,其他删除delete a from tab ...

  8. [Hadoop源码系列] FairScheduler分配申请和分配container的过程

    1.如何申请资源 1.1 如何启动AM并申请资源 1.1.1 如何启动AM val yarnClient = YarnClient.createYarnClient setupCredentials( ...

  9. Android Studio 自动生成 Java Doc

    Android Studio 生成 Java Doc 出现"编码GBK的不可映射字符"问题 错误的解决方案,复制粘贴一万遍也是错误的,下面是查找出来的,没有用的解决方案(还有几个, ...

  10. tomcat支持php

    最近做项目遇到了问题,服务器是用的tomcat,而有用到php,就想在tomcat下面可以运行php,步骤如下: 1.下载php压缩包解压或者用wamp/xampp 我下载的是wamp,用的里面的ph ...