12558网页游戏私服论坛

 找回密码
 立即注册
游戏开服表 申请开服
游戏名称 游戏描述 开服状态 游戏福利 运营商 游戏链接
攻城掠地-仿官 全新玩法,觉醒武将,觉醒技能 每周新区 经典复古版本,长久稳定 进入游戏
巅峰新版攻 攻城掠地公益服 攻城掠地SF 新兵种、新武将(兵种) 进入游戏
攻城掠地公 散人玩家的天堂 新开 进入游戏
改版攻城掠 上线即可国战PK 稳定新区 全新改版,功能强大 进入游戏
少年江山 高福利高爆率 刚开一秒 江湖水落潜蛟龙 进入游戏
太古封魔录 开服送10亿钻石 福利多多 不用充钱也可升级 进入游戏
神魔之道 签到送元宝 稳定开新区 送豪华签到奖励 进入游戏
神奇三国 统帅三军,招揽名将 免费玩新区 激情国战,征战四方 进入游戏
龙符 三日豪礼领到爽 天天开新区 助你征战无双 进入游戏
王者之师 免费领豪华奖励 免费玩新区 6元送6888元宝 进入游戏
查看: 290|回复: 0

PE文件格式详细解析(二)--IAT

[复制链接]

345

主题

345

帖子

700

积分

实习版主

Rank: 7Rank: 7Rank: 7

积分
700
发表于 2020-8-11 06:10:52 | 显示全部楼层 |阅读模式
PE文件格式具体剖析(二)--IAT

IAT,导入地址表(Import Address Table),保存了与windows操作系统焦点进程、内存、DLL结构等相关的信息。只要了理解了IAT,就掌握了Windows操作系统的根基。IAT是一种表格,用来记录程序正在使用哪些库中的哪些函数。
一、DLL

DLL,动态链接库(Dynamic Linked Library)
1. 来源

在16位的DOS情况中,不存在DLL的概念,例如在C中使用printf函数时,编译器会先从C库中读取相应函数的二进制代码,然后插入到应用程序中。但是Windows支持多任务,采用这种包含库的方式会没有服从,由于假如每个程序在运行时都将Windows库中的函数加载进来,将造成严重的内存浪费,因此引入了DLL的概念。
2. 设计理念


  • 不把函数库包含进应用程序中,单独构成DLL文件,在需要使用时再进行调用。
  • 使用内存映射技能将加载后的DLL代码、资源在多个进程中实现共享。
  • 在对函数库进行更新时,只更新DLL文件即可。
3. 加载方式

DLL加载方式有两种:显式链接(Explicit Linking)隐式链接(Implicit Linking)

  • 表现链接:程序在使用DLL时进行加载,使用完毕后释放内存
  • 隐式链接:程序在开始时即一同加载DLL,程序终止时再释放占用的内存
    IAT提供的机制与DLL的隐式链接有关。
二、DLL调用的简单理解

在OD中查看程序的反汇编代码如下所示:

在调用ThunRTMain()函数时,并非是直接调用函数,而是通过获取0x00405164地址处的值-0x7400A1B0,该值是加载到待分析应用程序进程内存中的ThunRTMain()函数的地址。  
需要注意的是,此处之所以编译器不直接进行jmp 7400A1B0主要是由于以下两点:

  • DLL版本不同,由于操作系统的版本存在差异,DLL文件版本也会存在差异
  • DLL重定位,DLL文件的ImageBase一般为0x10000000,假如应用程序同时有两个DLL文件需要加载--a.dll和b.dll,在运行时a.dll首先加载进内存,占到了0x10000000,此时b.dll假如再加载到0x10000000,就会发生辩论,所以需要加载到其他的空白内存空间处。
三、IMAGE_IMPORT_DESCRIPTOR结构体

1. 结构介绍

该结构体中记录着PE文件要导入哪些库文件,由于在实行一个程序时需要导入多个库,所以导入了多少库,就会存在多少IMAGE_IMPORT_DESCRIPTOR结构体,这些结构体构成数组,数组末了以NULL结构体竣事。部分重要成员如下所示:
成员含义OriginalThunkINT的地址(RVA),4字节长整型数组,NULL竣事Name库名称字符串的地址(RVA)FirstThunkIAT的地址(RVA),4字节长整型数组,NULL竣事下图描述了notepad.exe之kernel32.dll的IMAGE_IMPORT_DESCRIPTOR结构:

2. PE装载器把导入函数输入至IAT的顺序


  • 读取IID的Name成员,获取库名称字符串(eg:kernel32.dll)
  • 装载相应库:
    LoadLibrary("kernel32.dll")
  • 读取IID的OriginalFirstThunk成员,获取INT地址
  • 逐一读取INT中数组的值,获取相应IMAGE_IMPORT_BY_NAME地址(RVA)
  • 使用IMAGE_IMPORT_BY_NAME的Hint(ordinal)或Name项,获取相应函数的起始地址:
    GetProcAddress("GetCurrentThreadld")
  • 读取IID的FirstThunk(IAT)成员,获得IAT地址
  • 将上面获得的函数地址输入相应IAT数组值
  • 重复以上步骤4~7,知道INT竣事(遇到NULL)
四、总结

IAT是在学习PE文件格式中重要的一部分,也是比力难的一部分,需要仔细学习,肯定要纯熟掌握。建议根据现实的PE文件结合前面的分析步骤,亲身动手多加分析,不绝熟悉分析流程。

来源:http://www.12558.net
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
楼主热帖
回复

使用道具 举报

*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|12558网页游戏私服论坛 |网站地图

GMT+8, 2024-3-29 08:09 , Processed in 0.093750 second(s), 31 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表