首页
社区
课程
招聘
[求助]为什么找到OEP后还要重建输入表
2009-11-10 14:54 3217

[求助]为什么找到OEP后还要重建输入表

2009-11-10 14:54
3217
为什么找到OEP后还要重建输入表??找到的OEP不就是程序原入口地址吗,都已经执行到这里了,按道理,此时输入表应该是原程序的,不然的话,加壳的程序怎么能够正常执行.为什么还要重建输入表。到底加壳程序是这样执行的

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
打赏
分享
最新回复 (14)
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
欲霸小子 2009-11-10 15:05
2
0
求高手回答!!!
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
达文西 2009-11-10 15:07
3
0
这个问题太难了
雪    币: 35387
活跃值: (19205)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2009-11-10 16:46
4
0
将这篇看看你就明白了:http://bbs.pediy.com/showthread.php?t=20366

外壳程序是自己模拟系统处理了IAT,脱壳后,你必须还原程序的输入表结构,这样运行时,windows才能正常初始化IAT。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
欲霸小子 2009-11-13 13:57
5
0
既然已经到了程序的原OEP,这时输入表怎么还没重建,如果没重建,那么加壳的程序怎么能正常运行,也就是说,外壳程序怎么样恢复输入表?
希望你能回答,谢谢
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 18 2009-11-13 16:46
6
0
程序加载时系统根据程序的输入表结构初始化iat,脱壳时找到oep处时内存里的是壳模拟系统初始化好了的iat,dump下来后还要用工具将这个iat还原为dump下来的程序的输入表结构。通常用importREC工具。
雪    币: 35387
活跃值: (19205)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2009-11-15 20:01
7
0
到了OEP,IAT表己有了,程序可以运行,你此时Dump,也可能在本机能运行。但换个系统,IAT指定的系统函数就不对了。所以,还是必须重建输入表。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
欲霸小子 2009-11-20 15:33
8
0
那加壳程序执行到原程序的OEP后怎么保证原程序正常运行,也就是说加壳程序执行到原程序的OEP后怎么恢复原程序的输入表
雪    币: 35387
活跃值: (19205)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
kanxue 8 2009-11-20 16:06
9
0
加壳程序自己处理,填充IAT表了,你看一下各类壳的分析文章就明白了。或自己实践跟一下壳。
雪    币: 2015
活跃值: (902)
能力值: ( LV12,RANK:1000 )
在线值:
发帖
回帖
粉丝
天易love 18 2009-11-20 18:35
10
0
坛主都回答你三次了!好学精神可嘉。你实践太少,概念有问题。程序的输入表决定了运行时内存里的IAT,而加壳程序运行到oep时,壳自己把原程序的IAT准备好了,就可以正常运行了。注意系统初始化的是加壳后程序的iat,而原程序的iat是壳生成的。如果要在别的系统如NT等下运行,就要根据内存中原程序的iat反向生成脱壳后程序的输入表,因为输入表它不含导入函数的地址,在别的系统中脱壳后的程序加载后据此反向得到的输入表初始化特定系统下可用的iat,其中的导入函数地址因系统不同有所变化。输入表只是告诉PE加载程序要把哪些程序会用到的函数地址添加到iat中,起到兼容不同系统的效果。而IAT只是针对某个特定操作系统的概念。importREC就是帮你把这个特殊的内存里的iat还原成输入表这个数据结构的工具。相信你能懂我的意思,我也是自学的,从没公开求助谁,求人不如求己。
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
欲霸小子 2009-11-22 12:22
11
0
谢谢啊,求助可以少走弯路
雪    币: 1632
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
达文西 2009-11-22 12:44
12
0
举个例子:
带壳运行时,程序可能调用某个api函数是这样的 call 010xxxxx,而010xxxxxx这个地址在内存是存在的,模拟调用了这个api,所以脱壳前能顺利运行;但010xxxxx这个地址并不属于程序的领空,是壳申请的,所以你在OEP处dump下来时,010xxxxxx这段内存的数据是没有dump下来的,这时候脱壳后的文件call 010xxxxxx想调用这个api函数时这个地址就不存在,也就无法运行了。
雪    币: 190
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yorkjack 2009-11-24 16:44
13
0
路过,来看看
雪    币: 248
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xiebing 2009-11-25 21:13
14
0
路过,看看了
雪    币: 91
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
xygwf 2009-11-26 08:56
15
0
我这个我倒是有疑问了, 之前坛主说了, 是为了兼容性, 也就是说dump之后的程序是可以在本机器运行的.  我所理解的dump的过程, 不就是把正在脱壳运行中的程序的所有的内存段都dump到文件中了吗? 怎么会有找不到的地址呢

谢谢,
游客
登录 | 注册 方可回帖
返回