〇〇木一 发表于 2013-7-30 18:12

EncryptPE 脱壳手记

本帖最后由 〇〇木一 于 2013-7-30 19:15 编辑

经过一段时间的学习,总算对脱壳的知识有了一点了解
今天遇到了一壳EncryptPE,不怎么常见,也没有遇到过,就尝试着脱脱看


查壳显示为v2.2008.6.18版本,用od载入F9运行,

提示未注册,不知道注册码,点击确定后程序就退出了。很显然这样是无法脱壳的,要先过了注册。
下面是H大写的一片文章,就是关于EncryptPE 的壳pass key的。
http://hi.baidu.com/52hmily/item/6f502f49b969c5e31281da74
按照H大的思路,重新载入,F9运行后暂停,在堆栈中向下拉,找到

跟随到反汇编窗口,向上找到头部

下好硬件执行断点,重新载入程序,F9运行后,断下来,F8单步向下走,

当走到这里后出现窗体,点确定,再向下走

call1为验证call,call2为退出,这里使跳转1、跳转2都跳转,程序就通过注册了。
接下来是找OEP
一般壳的运行规则是不变的
1.先在代码断写入代码
2.写入处理过的IAT和处理过的IAT call
3.跳转到oep
所以一般找oep最重要的就是先找一个点,就是刚好处理完IAT之后的点,然后再在代码段下内存访问断点,运行之后就能断在oep了。
这里我一番好找,终于发现了较快的一种方法
当运行到上图跳转2时让它可以跳,但是先不要运行,

先在EPE1区段下好内存写入断点,两次F9后就是处理完IAT之后的点了,然后在EPE0段,也就是oep所在的区段下内存访问断点,两次F9后就到达OEP了

可以看出这是vc写的一个程序
接下来就是最重要的一步-----修复IAT了
先找到IAT表的位置

从这里右键数据窗口跟随很快就能找到iat表的位置了

可以看出这些有些IAT已经被加密了,要做的就是修复这部份IAT
个人认为一般修复IAT有两种方法,
第一种就是在其加密之前找到判断某IAT是否加密的跳转,上图就可以看出没些IAT加密,某些没有加密,说明肯定有一个比较IAT是否加密的地方,只要修改那个跳转就能修复IAT了,这也就是所谓的magic jmp。
第二种就是事后修补,像上图那样某些IAT已经加过密了,要找到他真实所指向的API,再重新赋值。因为加过密之后,在程序运行时肯定要进行还原,在这过程中就可以获取真实所指向的API了。
寻找magic jmp太难了,本菜鸟努力很久也找不到。所以只能尝试第二种方法了。
先找一个加过密的IAT,就上图中0041F158的那个吧。
0041F158处的值为01380528,反汇编窗口转到01380528

右键---在此新建eip,会提示,按确定,F7跟进此call。
可以看到指令很花,F8向下走,此时就要注意各个窗口了,它会在某步还原出真实的API
一路走,一路观察,终于。。。嘿嘿



当运行到711A9388时,经过一个call后eax指向了还原后的API地址,只要把此时的eax写入IAT地址0041F158,一个IAT就修复好了
————————————————————————————————
有了这个发现就可以用脚本修复所有的IAT了,下面是我写的一个脚本,当然只能用来脱这个程序的壳
VAR IatStart                  //记录IAT起始
VAR IatEnd                  //记录IAT末
VAR OEP                     //记录OEP
VAR OepEsp                  //记录OEP时的栈顶
BC
BPHWCALL
BPHWS 712062A5,"x"            //在验证注册时下段
ESTO
BPHWC 712062A5
STO
MOV !ZF,0                     //pass key jmp
STO
STO
STO
STO
MOV !ZF,1                     //pass key jmp
BPWM 42F000,90000             //EPE1段下内存写入断点
ESTO
ESTO
BPMC
BPRM 401000,2E000             //EPE0段下内存访问断点
ESTO
ESTO
BPMC
CMT eip, "<--OEP"             //到达OEP
MOV OEP,eip                   //获取OEP地址
MOV OepEsp,esp                //获取OEP时的栈顶
MOV IatStart,0041F000         //获取IAT起始地址
MOV IatEnd,0041F434         //获取IAT结束地址
////////////////////
BPHWS 711A938B,"x"            //断在此处eax为真实API地址

fixIAT:
CMP IatStart,IatEnd
JA exit
CMP ,10000000       //判断此时IAT是否加过密
JA continue
CMP ,00000000
je continue
////////////////////
MOV eip,            //eip移至处理后的IAT处
ESTO
MOV ,eax            //写入IAT真实API地址
////////////////////
continue:
MOV esp,OepEsp                //还原栈
ADD IatStart,4                //逐个取IAT
jmp fixIAT
////////////////////
exit:
MOV eip,OEP                   //eip移至OEP
MOV esp,OepEsp                //还原栈
BPHWCALL
RET

运行脚本,出现注册框点确定即可,运行完成后,IAT已经修复

上LordPE,importREC就能脱成功了
以上献给同在慢慢摸索的新手同胞们。


附件:
脚本:
                                                                                                                                                         〇〇木一
                                                                                                                                                       2013-07-30

小雨细无声 发表于 2013-7-31 09:51

膜拜大牛,很详细。

瓜子吧3 发表于 2013-7-30 18:14

路过,看看

吾爱扣扣 发表于 2013-7-30 18:19

本帖最后由 吾爱扣扣 于 2013-7-30 18:21 编辑

不错的手记!收藏!

1354669803 发表于 2013-7-30 18:25

IAT加密 头疼啊

txke 发表于 2013-7-30 18:32

膜拜会写脚本的大大,IAT真是让人蛋疼啊,脚本下载来研究研究

宜搜百度 发表于 2013-7-30 18:45

前来学习,膜拜大神。。。。

kevinjian 发表于 2013-7-30 19:16

不明觉历,感觉好复杂

天山雪鹰 发表于 2013-7-30 20:55

好难的样子,新手膜拜

wanwanle 发表于 2013-8-1 11:18

嗯的确写的不错支持下啰
页: [1] 2 3
查看完整版本: EncryptPE 脱壳手记