wuhanqi 发表于 2010-3-2 06:19

[转]也谈PE-Armor0.49记事本的脱壳经历

本帖最后由 wuhanqi 于 2010-3-2 18:00 编辑

标 题: 【原创】也谈PE-Armor0.49记事本的脱壳经历
作 者: 不问年少
时 间: 2010-02-26,16:28:25
链 接: http://bbs.pediy.com/showthread.php?t=107842

这两天研究这个壳,让我对壳的认识有了进一步的加深,特将脱壳的过程附上,与大家共勉,在此先得感谢每位指点我的人,学到新知识的确是让人开心的一件事!

这个壳本身到OEP不难,主要是壳的修复比较麻烦,因为这个壳抽掉了OEP,并且对CALL 的一些地方进行了硬编码,变成了CALL XXX,这样脱壳以后CALL的地址就不正确了!

加载以后,运行的话会发现产生了N多的异常,这里借用resty的方法,并加上自己的心得,给出一个简单的到OEP的方法:

1、除INT3断点外,忽略所有异常。SHIFT+F9,运行:



2、不忽略整数除0异常,SHIFT+F9运行:



3、CTRL+F查找跳到OEP的命令 JMP EAX, 在其上F2下断点,SHIFT+F9运行:



这里就是跳向光明之巅!取消断点后,F8到OEP处。
然后就是体力劳动了,呵呵,正好这两天初学OllyScript,也就想用脚本来恢复CALL XXX!

我们首先要知道的是CALL XXX处 (原来是CALL )是如何还原:
F4到任意一个CALL XXX,然后在代码段下内存访问断点,这样就能跟踪到壳的处理函数处:



这在里,我们就知道了,原来壳是用一张表来处理CALL XXX的形式的。记下ESI的表头位址,不同的机器这个地址不一样,这张表以0000结束!在我这里这个地址就是

0x3A3474 这个表的大小是0X458,算一下壳一共处理了多少个函数?
0x458/4/2 =0x8B=139个!晕啊,想把人累死啊!!!!



没办法,只好学学OllyScript了,用脚本来恢复CALL,下面是自己写的恢复脚本,
呵呵,大侠们别笑,有好多命令不会用…… 采用原壳的解密算法,直接读取密表进行解码后恢复,下面是脚本的原型,虽然很丑,不过确实起到了减轻劳力的作用,哈哈

var passtableaddr
var vaddr
var nCount
var caddr
var encode

mov nCount, 0

lbFind:

find eip, #90E8#
cmp $RESULT, 0
je lbEnd

inc nCount
mov eip, $RESULT
add eip, 6
mov caddr, eip
mov passtableaddr, 3a3474

lbstart:
cmp passtableaddr, 3a38c4
jg lbFind
mov vaddr,
cmp vaddr, caddr
jne lbsearch
mov encode, , 4
sub encode, vaddr
not encode
rol encode,10
mov , #FF15#
mov , encode

lbsearch:
add passtableaddr, 8
jmp lbstart


jmp lbFind

lbEnd:
   mov eip, 4010cc
   eval "共替换{nCount}处CALL"
   msg $RESULT
ret



然后恢复下OEP为如图的情况,直接DUMP即可,无需修复IAT,即可运行,PEID查看已经成功脱壳:



总结:以前以为到了OEP之后修复IAT成功了壳基本就脱完了,遇到这个壳让我觉得自己太浅薄了!

Hmily 发表于 2010-3-2 10:06

图片盗链了,最好本地存储下.

harryluya159 发表于 2010-3-2 11:19

不错!!!!!!!:)eee

harryluya159 发表于 2010-3-2 11:20

不错!!!!!!!:)eee

wuhanqi 发表于 2010-3-2 18:00

回复 2# Hmily


    图片已编辑

czjh2008 发表于 2010-3-2 18:14

不错,正在学习……

蓝雪儿 发表于 2010-3-2 18:55

学习脚本
页: [1]
查看完整版本: [转]也谈PE-Armor0.49记事本的脱壳经历