本帖最后由 〇〇木一 于 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了,下面是我写的一个脚本,当然只能用来脱这个程序的壳
[AppleScript] 纯文本查看 复制代码 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 [IatStart],10000000 //判断此时IAT是否加过密
JA continue
CMP [IatStart],00000000
je continue
////////////////////
MOV eip,[IatStart] //eip移至处理后的IAT处
ESTO
MOV [IatStart],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就能脱成功了
以上献给同在慢慢摸索的新手同胞们。
附件:
测试.zip
(562.99 KB, 下载次数: 173)
脚本:
脚本.zip
(722 Bytes, 下载次数: 169)
〇〇木一
2013-07-30
|