首页
社区
课程
招聘
[原创]为什么某些壳脱壳后需要修复IAT?
发表于: 2012-6-10 20:05 21313

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

2012-6-10 20:05
21313

前言:

    也许在脱壳初学者中都会有这样的疑惑“为什么某些壳脱壳后需要修复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

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


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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

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