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

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

2010-2-27 11:06
6086
前面一篇里讲的办法是直接从代码中搜索并恢复,这样会存在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

运行完脚本的效果:



修复以后的效果如图:


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

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

sub encode, vaddr
not encode
rol encode,10

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

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


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

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