首页
社区
课程
招聘
[原创]PE-Armor壳后继报道:从密码表逆向恢复策略!
发表于: 2010-2-27 11:06 7550

[原创]PE-Armor壳后继报道:从密码表逆向恢复策略!

2010-2-27 11:06
7550
前面一篇里讲的办法是直接从代码中搜索并恢复,这样会存在JMP [XXX]的代码硬抽取部分未被恢复,造成记事本的功能部分如打开、保存等直接崩溃……,那么如何才能保证此壳被完整的修复了,昨天我思考了很久,既然从代码搜索不好找,那么可以从壳的密表中采用逆向策略来修复,嘿嘿,正好符合逆向分析的思路:(简单易懂,原作者resty的思路我不是很明白……)

接前面,直接从密码表中取数据,并根据壳的解密算法来进行恢复……。密表中的形式由于是:

VAR地址, 密值 (各占四字节的形式)

对于特殊地址,此壳将VAR的最高位置1,即80XXXXXX的形式, 研究发现这是对应于
JMP [XXX]的特殊形式,而且这样的里面的IAT也被修改了,所以要修复IAT。

这样,能保证只要表中记录的地址,全部都能恢复,下面是自己研究的脚本,测试成功(注意,恢复以后得修复IAT)然后就能成功运行了 下面是脱此壳的完整脚本:

var passtableaddr
var vaddr
var nCount
var encode

msg "请设置忽略除INT3外的所有异常"
setoption
run
msg "请去除整数除零的异常"
setoption
esto
bp 38298c
esto
bc
sto
cmp eip, 4010cc
asm eip, "push esp"
inc eip
asm eip, "mov ebp, esp"
dec eip

mov nCount, 0

mov passtableaddr, 383474  //密码表的开始位置,每台电脑位置可能不一样,请自行修改

lbstart:
cmp passtableaddr, 3838c4  //密码表结束位置-4
jg lbEnd
mov vaddr, [passtableaddr]
and vaddr, 80000000 //判断是jmp还是call
cmp vaddr, 0    //如果是0,就是call
je lbcall
mov vaddr, [passtableaddr]
and vaddr, 00ffffff  //jmp
sub vaddr,6
mov eip, vaddr  //到表中指定的地址处
add vaddr,6
mov encode, [passtableaddr+4], 4
sub encode, vaddr
not encode
rol encode,10
mov [vaddr-6], #FF25#
mov [vaddr-4], encode
jmp lbCount

lbcall:
mov vaddr, [passtableaddr]
mov eip, vaddr-6
mov encode, [passtableaddr+4], 4
sub encode, vaddr
not encode
rol encode,10
mov [vaddr-6], #FF15#
mov [vaddr-4], encode

lbCount:
inc nCount

lbsearch:
add passtableaddr, 8
jmp lbstart

lbEnd:
   mov eip, 4010cc
   dpe "d:\abc.exe", eip
   eval "共替换{nCount}处CALL,文件被dump到d:\abc.exe,请修复IAT后即可运行!"
   msg $RESULT
ret

运行完脚本的效果:



修复以后的效果如图:


[课程]Android-CTF解题方法汇总!

上传的附件:
  • 1.JPG (27.60kb,265次下载)
  • 2.JPG (71.90kb,267次下载)
收藏
免费 7
支持
分享
最新回复 (10)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
LZ很利害
在UpK有无帐号?
2010-2-27 11:26
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
3
利害啥啊,菜鸟一名,没人献丑我献丑罢!
2010-2-27 11:30
0
雪    币: 291
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
果然是好帖~~
2010-2-27 11:48
0
雪    币: 241
活跃值: (21)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
基本应该没问题,我不知道我有没有加入一些无效的东西混在有效数据中间,如果有的话,那可能会改错一些东西。
时间太长了,我对我的东西已经记不清楚了。
2010-2-27 11:54
0
雪    币: 147
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
好难得看到hying前辈
2010-2-27 13:18
0
雪    币: 326
活跃值: (88)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
现在的壳都采用了动态算法,这个也是发展的趋势.

sub encode, vaddr
not encode
rol encode,10

mov passtableaddr, 383474  //密码表的开始位置,每台电脑位置可能不一样,请自行修改

lbstart:
cmp passtableaddr, 3838c4  //密码表结束位置-4


解密算法,密码表地址等等都应该由脚本进行动态的判断,而不应该硬编码.
试想一下,如果每个地址都采用不同的算法,而且每次都动态改变,那么这样的脚本将失去作用.
2010-2-27 14:12
0
雪    币: 1074
活跃值: (160)
能力值: ( LV13,RANK:760 )
在线值:
发帖
回帖
粉丝
8
嗯,话是这样,知道了方法以后,只需稍加修改,即能完成手工劳动的N重功效。或者自己写一个脚本也行,能适应任意机器,只不过麻烦些罢了,因为我才学脚本觉得有点难度。另,中午对RESTY的脚本进行分析,终于明白了作者的思路,原来是走的正向分析的道路,在对 E800000000 机器码进行写入的时候断点!而我是让壳走向OEP之后再进行的反向恢复。

方法往往重于结果,知道结果没意思,知道方法以后,可以举一反三,以一挡十,无招才能胜有招
2010-2-27 16:43
0
雪    币: 134
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
正学习脱壳中,很幸运看到这样的精品文章
2010-2-28 13:20
0
雪    币: 154
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
10
呵呵 强大的分析·
2010-3-1 23:02
0
雪    币: 142
活跃值: (22)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
好像写了好几个,一个个慢慢的看吧
2010-3-2 22:51
0
游客
登录 | 注册 方可回帖
返回
//