首页
社区
课程
招聘
[原创]纯手工完美恢复IAT
发表于: 2018-12-1 21:19 11132

[原创]纯手工完美恢复IAT

2018-12-1 21:19
11132

上面结构中的的FirstThunk指向下一个结构

程序脱壳后都需要修复IAT,否则程序运行会出错,以前都是用工具来修复,工具一般都是新加一个节,然后将导入函数放在新的节里面(这个函数会比实际程序多一些,但不影响程序的运行,但个别定位出问题的多余函数会影响到程序运行),再修复跟函数相关的重定位项,其实有另一种方式可以完美修复IAT,今天就给大家交流一下,希望多多指正。

首先用ASPack给程序加一个壳,然后进行脱壳,脱壳过程很简单,这里就不详细叙述了。
运行到OEP用OllyDump导出当前进程。

注意:把重建输入表前面的对勾去掉,因为我们要手工恢复,所以就不需要这个选项了。

用工具查看输入表信息:
------------------------------------DataDirectory
No.  VirtualAddress  Size
0	00000000	00000000	EXPORT
1	00067FAC	00000240	IMPORT
2	00061000	00005400	RESOURCE
3	00000000	00000000	EXCEPTION
4	00000000	00000000	SECURITY
5	00067F54	00000008	BASERELOC
6	00000000	00000000	DEBUG
7	00000000	00000000	ARCHITECTURE
8	00000000	00000000	GLOBALPTR
9	00067F3C	00000018	TLS
10	00000000	00000000	LOAD_CONFIG
11	00000000	00000000	BOUND_IMPORT
12	00000000	00000000	IAT
13	00000000	00000000	DELAY_IMPORT
14	00000000	00000000	COM_DESCRIPTOR
15	00000000	00100000	...

------------------------------------DataDirectory
No.  VirtualAddress  Size
0	00000000	00000000	EXPORT
1	00067FAC	00000240	IMPORT
2	00061000	00005400	RESOURCE
3	00000000	00000000	EXCEPTION
4	00000000	00000000	SECURITY
5	00067F54	00000008	BASERELOC
6	00000000	00000000	DEBUG
7	00000000	00000000	ARCHITECTURE
8	00000000	00000000	GLOBALPTR
9	00067F3C	00000018	TLS
10	00000000	00000000	LOAD_CONFIG
11	00000000	00000000	BOUND_IMPORT
12	00000000	00000000	IAT
13	00000000	00000000	DELAY_IMPORT
14	00000000	00000000	COM_DESCRIPTOR
15	00000000	00100000	...

------------------------------------DataDirectory
No.  VirtualAddress  Size
0	00000000	00000000	EXPORT
1	00067FAC	00000240	IMPORT
2	00061000	00005400	RESOURCE
3	00000000	00000000	EXCEPTION
4	00000000	00000000	SECURITY
5	00067F54	00000008	BASERELOC
6	00000000	00000000	DEBUG
7	00000000	00000000	ARCHITECTURE
8	00000000	00000000	GLOBALPTR
9	00067F3C	00000018	TLS
10	00000000	00000000	LOAD_CONFIG
11	00000000	00000000	BOUND_IMPORT
12	00000000	00000000	IAT
13	00000000	00000000	DELAY_IMPORT
14	00000000	00000000	COM_DESCRIPTOR
15	00000000	00100000	...

输入表的地址是:67FAC,查看一下这个地址的数据。可以看出下面的数据是壳的导入表,并不是程序自身的。

下面我们查找程序自己的导入表,很简单,搜索Kernel32.dll这个字符串,会找到几个,搜索字符串后面是乱码的跳过,最后我们定位的信息如下:
这是程序自己的导入表,但有些数据被覆盖了,所以程序运行会出错

从这个地址向前查找会找到完整导入表信息,这里的界限很明显,非全零的那一行就是导入信息的开始,地址是:56000,但数据已经乱了,我们需要的就是重建这部分结构

如何重建,这里我们要先介绍一下导入表的结构:

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-12-1 21:26 被lrtlrt编辑 ,原因:
上传的附件:
收藏
免费 6
支持
分享
最新回复 (9)
雪    币: 8911
活跃值: (5136)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jgs
2
学习了,谢谢楼主,收藏
2018-12-2 10:03
1
雪    币: 26245
活跃值: (63302)
能力值: (RANK:135 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2018-12-2 13:37
0
雪    币: 2166
活跃值: (3226)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
4
不错,自己写的代码,能更好的理解IAT结构,期待你再接再厉
2018-12-3 17:15
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
工具一般都是新加一个节?可以不增加节的
最后于 2018-12-4 08:22 被tDasm编辑 ,原因:
2018-12-4 08:20
0
雪    币: 272
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
lz问下:
1、A地址中的数据是结构中的ForwarderChain ?
2、B地址中的数据是结构中的name ?

感觉这样不太对一样
2018-12-4 09:32
0
雪    币: 1393
活跃值: (570)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
o冰柠檬o lz问下: 1、A地址中的数据是结构中的ForwarderChain ? 2、B地址中的数据是结构中的name ? 感觉这样不太对一样
@o冰柠檬o :
1、A地址中的数据是指向name,指向dll文件名
2、B地址是结构中的FirstThunk,它指向的地址存放了函数名的地址信息,B指向C,C指向函数名
最后于 2018-12-4 11:52 被lrtlrt编辑 ,原因:
2018-12-4 11:49
0
雪    币: 1393
活跃值: (570)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
tDasm 工具一般都是新加一个节?可以不增加节的
是的,有的工具可以不增加节,可能LoadPE可以实现,不过我没有测试,我用的是ollydbg中的ollyDump,它有一个选项是不增加节的,不过没有成功,还有一个是增加节的,成功了但有一个小错误,有一个函数不能定位,简单调整一下运行是没有问题的。
2018-12-4 12:03
0
雪    币: 14855
活跃值: (6083)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
lrtlrt 是的,有的工具可以不增加节,可能LoadPE可以实现,不过我没有测试,我用的是ollydbg中的ollyDump,它有一个选项是不增加节的,不过没有成功,还有一个是增加节的,成功了但有一个小错误,有一 ...
ImportREC这个工具比较专业,不增加节没任何问题的。不过对部分不十分了解IAT结构的来说,增加节是最简单省事。如果不增加节就必须在某节内找到足够大小的空间,否则会出错。
最后于 2018-12-4 15:17 被tDasm编辑 ,原因:
2018-12-4 15:17
0
雪    币: 272
活跃值: (209)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
lrtlrt o冰柠檬o lz问下: 1、A地址中的数据是结构中的ForwarderChain ? 2、B地址中的数据是结构中的name ? 感觉这样不太对一样 ...
懂了,懂了,查了下资料,原来那个union只会占用4个字节的内存,多谢了
2018-12-5 10:48
0
游客
登录 | 注册 方可回帖
返回
//