首页
论坛
课程
招聘
[原创]为什么某些壳脱壳后需要修复IAT?
2012-6-10 20:05 17063

[原创]为什么某些壳脱壳后需要修复IAT?

2012-6-10 20:05
17063
前言:

    也许在脱壳初学者中都会有这样的疑惑“为什么某些壳脱壳后需要修复IAT?”。
在我刚学脱壳的时候也是百思不解,网上搜索个遍也难找到个所以然来。
后面经过对PE加壳机的设计后才明白其原理是这么个所以然。
    首先本人很懒,不喜欢写文字,下午5点多又是学校食堂开饭的时间,
由于今天还没吃饭只吃了两根辣条,肚子饥饿难忍,正准备去学校食堂抢饭,
在关机前打开看雪论坛看了下帖子,于是看到这帖子:
http://bbs.pediy.com/showthread.php?p=1079078
于是就有了不回答这问题不吃饭的决心。。
还好在18:19:31写完,食堂还有些剩饭。。囧
因为很多脱壳初学者可能都会有这样的疑惑,在那帖子的回复很可能就石沉大海了,
所以我决定另开贴将回复内容写到这里,
也许会有更多脱壳初学者看到,对他们学脱壳有点帮助吧。
因为在和饥饿作斗争赶时间写出来的内容,
漏错的地方在所难免,欢迎指正!

正文:

为什么要修复IAT?

首先得说一下程序调用DLL导出函数的原理,
PE调用DLL里的函数,一般是先加载这个DLL模块到它的进程地址空间,
然后在加载后的地址范围内找到每个调用函数的地址,
在程序中你可以使用LoadLibrary()这个系统API去动态去加载某个DLL,
再通过GetProcAddress()系统API来找到DLL导出的某个函数地址,
得到函数地址了你才能使用这个函数。
用户DLL被加载后的基址可发生变化,导入的函数地址不是固定的,你不能使用固定的地址。
系统DLL虽然基址固定,函数地址固定,但是一般不会直接使用函数硬地址,
还是要GetProcAddress()这个API来得到地址,因为XP、win7等每个系统的这些地址
是不一样的,会导致兼容性问题。

关于导入表,
而为了开发更方便和更人性化,编译器提供了这个静态导入函数的功能,
也就是说你在编程的时候不需要LoadLibrary(),不必每次调用一个函数都GetProcAddress(),
你只需要在源代码中写函数名和参数即可,编译器会将你使用的<函数名>和函数所在的<DLL文件名>
两个信息填写到输入表里,当程序启动运行时由操作系统根据这两个信息给程序加载
所需的DLL,并将所需要的函数地址写入IAT。
    IAT是指PE导入地址表,每个IAT就对应了一个DLL文件导入函数的地址表,
你的程序里调用的地址不是直接调用DLL里函数的地址,因为你不知道地址是多少,
而是直接调用了IAT里的地址。程序启动时操作系统加载所需的DLL并填充导入名称表INT对应的
函数地址到地址表IAT对应PIMAGE_THUNK_DATA结构里,然后程序就可以正常调用IAT中这些函数地址了。

壳的工作原理,
某些加壳程序加壳后会修改了原来导入目录表的位置为壳的导入表,
这样默认的导入表指向壳部分的导入表,你就看不到原来的导入表的内容了。
程序启动后,操作系统为壳的导入表加载,
在壳代码运行完成之后,壳代码会跳到原程序的入口点OEP,壳模拟操作系统填充
原来导入表IAT,这样保证代码段能正常调用函数。
一般壳的工作原理也就是这样了,随着现在加壳加密技术的进步,不是所有加壳软件都会这样。

脱壳原理,
首先修改被加壳程序的入口点到程序原来的OEP,
然后修改PE程序导入表目录地址为原来导入表地址,或者新建一个节,
将这个新节作为导入表节,并将原导入表内容写入新节导入表。

脱壳过程,
OD跟踪,让壳运行到原程序OEP(不一定非得OEP,程序领空导入表一般都是处于还原状态,
OEP要知道),这时候可以用PE DUMP脱壳插件或者用LordPe等工具脱壳,
程序当前的内存映像被dump出来,里面IAT结构完整很容易被发现。
dump后程序不能正常运行很可能是导入表位置错误(也可能是程序有自校验),
因为dump出来的只是内存中的映像快照,导入表目录还是指向壳的导入表,
这时,需要用导入表修复软件查找dump出的PE文件原导入表首地址,
然后修正导入表目录中导入表的位置,或重建导入表。
Import Fix导入表修复软件会新建一个节来保存原导入表数据,并将导入表目录指向新节导入表位置。
在搜索导入表时可能导入表被破坏,Import Fix会识别出一些无效的IAT项,可以将其剔除掉。

by 小覃 2012,06,10 看雪论坛
http://www.qinrihong.com/
http://www.weibo.com/qinrihong

以上是个人的描述,如有不正确之处欢迎大牛们指正!

[看雪官方]《安卓高级研修班》线下班,网课(12月)班开始同步招生!!

收藏
点赞0
打赏
分享
最新回复 (16)
雪    币: 582
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
小覃 活跃值 2 2012-6-10 20:22
2
0
自己顶。。
雪    币: 2751
活跃值: 活跃值 (62)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yjd 活跃值 2012-6-10 21:38
3
0
通俗易懂,支持。
雪    币: 223
活跃值: 活跃值 (29)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
OVERLAND 活跃值 2012-6-11 15:35
4
0
好文 ,温故而知新
雪    币: 556
活跃值: 活跃值 (44)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
金罡 活跃值 1 2012-6-11 16:35
5
0
LZ还得继续努力!加油!
在PE中IAT是壳的主要加密对象之一,在脱壳之前首先到达OEP了解壳的加密手段。
雪    币: 582
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
小覃 活跃值 2 2012-6-11 18:19
6
0
你是说那些变态壳吧?我帖子内容也已经注明了不是针对所有壳。。
主流还是主要加密代码段的,通常壳还原控制权运行到OEP时导入表处于恢复状态了。

先上课去了,晚上6点40考试。。
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
laohai 活跃值 2012-6-12 08:27
7
0
好文章啊,支持一下。
雪    币: 1891
活跃值: 活跃值 (14)
能力值: ( LV13,RANK:420 )
在线值:
发帖
回帖
粉丝
demoscene 活跃值 7 2012-6-12 09:32
8
1
为什么需要修复IAT和加不加壳关系不大,即使不加壳,从内存里把PE dump出来也要修复IAT
重点在这里
雪    币: 73
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kingcomer 活跃值 2012-6-12 09:40
9
0
xiexie了,谢谢。
雪    币: 401
活跃值: 活跃值 (21)
能力值: ( LV12,RANK:400 )
在线值:
发帖
回帖
粉丝
Speeday 活跃值 8 2012-6-14 10:13
10
0
为什么有些软件dump后,直接修复输入表不行,而需要手动查找输入表的起始地址和大小才能正确修复呢?
雪    币: 1834
活跃值: 活跃值 (15)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 活跃值 2012-6-14 11:21
11
0
并不是什么变态壳才加盟 IAT ,到了 OEP 控制权也不一定就交还给程序,还有古老传说中的 SDK 吧
雪    币: 324
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
MewCatcher 活跃值 2012-6-23 23:55
12
0
比《加解密3》更具体了,++。
雪    币: 156
活跃值: 活跃值 (36)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
Crimilals 活跃值 2017-8-25 20:45
13
0
。。。
雪    币: 845
活跃值: 活跃值 (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wx_clay 活跃值 1 2018-1-9 21:21
14
0
demoscene 为什么需要修复IAT和加不加壳关系不大,即使不加壳,从内存里把PE dump出来也要修复IAT 重点在这里
请问为什么即使不加壳,dump出来也要修复iat呢
雪    币: 10
活跃值: 活跃值 (36)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
KIDofot 活跃值 2018-3-19 12:46
15
0
好文。
雪    币: 1140
活跃值: 活跃值 (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
孙小空-Liu 活跃值 2019-1-22 17:15
16
0
通俗易懂,感谢楼主
雪    币: 215
活跃值: 活跃值 (98)
能力值: ( LV12,RANK:218 )
在线值:
发帖
回帖
粉丝
scpczc 活跃值 1 2019-3-9 15:03
17
0
厉害了,我的哥
最后于 2019-3-9 15:10 被scpczc编辑 ,原因: 没看到是挖坟贴!
游客
登录 | 注册 方可回帖
返回