首页
社区
课程
招聘
[原创]ZProtect脱壳无KEY解码总结
发表于: 2010-5-1 03:59 30690

[原创]ZProtect脱壳无KEY解码总结

2010-5-1 03:59
30690

【文章标题】: ZProtect脱壳无KEY解码总结
【文章作者】: A.D.
【软件名称】: 某ZP加壳的程序
【使用工具】: OllyDBG 1.0原版 + StrongOD + ODbgScript
【操作平台】: WinXP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【首发论坛】: 一蓑烟雨www.unpack.cn 转帖请注明
【文章目的】: ZProtect旧版加壳的程序,如果使用了注册框和试用功能,可以通过y3y3y3大大的LPK.DLL来绕过。但是如果是ZP 1.49或者企业版,又或者没有使用试用功能,程序本身虽然依然可以由LPK.DLL绕过,可绕过后的程序并不能正常运行。这是因为用ZP加壳时,程序的部分代码用密钥进行了加密,在绕过注册框后,必须正确地使这些代码解密,程序才可以正常运行。而本文的目的就是探讨如何在没有注册码的情况下使之正确解码,使程序可以正常运行,进而可以脱壳。
【致谢人员】: hyperchem、ximo、Hmily、ffzy

OD初始断点处=>待输入注册码的注册框=>程序代码整体解码=>特定区域KEY解码=>到达真正OEP
第一次解码=>第二次解码=>第三次解码
var oep        //ESP定律 用到的断点,并不是真正的OEP,只是用以判断已经到真正的OEP了
 
//清空断点
bphwcall
bpmc
 
//获取OEP
FoundOEP:
        mov oep,eip
        cmp [oep],60,1
        je GetOEP
        sti
jmp FoundOEP
        GetOEP:
        sti
        mov oep,esp
 
//绕过注册框
BypassRegist:
        bphws 77D56D7D        //注册对话框断点
        run
        mov eax,232c
        mov eip,77D56D99
        bphwcall
 
//到达真正OEP
GoOEP:
        bphws oep,"r"
        run
        bphwcall
        sti        //这里有多少个sti在于ESP定律断点断下来后F7几次到达真正OEP
        sti
 
//退出函数
Exit:
        ret
0046F610   55               PUSH EBP
0046F611   8BEC             MOV EBP,ESP
0046F613   83C4 F0          ADD ESP,-10
0046F616   B8 B8F34600      MOV EAX,程序.0046F3B8
0046F61B   E8 D068F9FF      CALL 程序.00405EF0  ☆跟进
00405EF0   53               PUSH EBX
00405EF1   8BD8             MOV EBX,EAX
00405EF3   33C0             XOR EAX,EAX
00405EF5   A3 A4004700      MOV DWORD PTR DS:[4700A4],EAX
00405EFA   6A 00            PUSH 0
00405EFC   E8 2BFFFFFF      CALL 程序.00405E2C  ☆跟进
00405E2C  -FF25 F8314700    JMP DWORD PTR DS:[4731F8]                //这里的4731F8应该就是IAT表当中的一项了
00405E32   8BC0             MOV EAX,EAX
00405E34  -E9 8B470A00      JMP 程序.004AA5C4
00405E39   90               NOP
00405E3A   8BC0             MOV EAX,EAX
00405E3C  -E9 FF430A00      JMP 程序.004AA240
00405E41   90               NOP
00472FF0  00000000
00472FF4  00000000
00472FF8  00000000
00472FFC  00000000
00473000  640D72D8
00473004  2852F1E9
00473008  685733E4
0047300C  343B2735
...
004731D8  685733E4
004731DC  00D000EE
004731E0  6447DD5C
004731E4  00D000FC
004731E8  685733E4
004731EC  3476B475
004731F0  00D0010A
004731F4  2818542D
004731F8  00A73E10
在脚本模板中相应位置添加如下代码,使得在绕过注册框后,停在解码IAT表的时候。
//根据找到的IAT表首地址+1F,反找解码XOR数值位置
FoundXor:
        bphws 47301F,"w"
        run
        jmp Exit
00A745C3   8BD0             MOV EDX,EAX
00A745C5   83E2 0F          AND EDX,0F
00A745C8   8A0C14           MOV CL,BYTE PTR SS:[ESP+EDX]                //XOR对象的位置
00A745CB   300C38           XOR BYTE PTR DS:[EAX+EDI],CL
00A745CE   83C0 01          ADD EAX,1
00A745D1   3BC3             CMP EAX,EBX
00A745D3  ^7C EE            JL SHORT 00A745C3
FoundDecodeSection:
        bphws 12FEEF,"w"                //填写密钥终止位置
        bphws oep,"r"
FoundDecodeSection2:
        run
        cmp eip,oep
        je FoundDecodeSection3
        find 12FEE0,#F1D3FF8443297732862DF21DC4E57262#        //填写密钥起始位置和错误密钥数值
        cmp $RESULT,0
        je FoundDecodeSection2
        msg "请对内存中的程序代码段按F2断点,F9一次后找到的操作的地址即为解码段起始处,再回到脚本按空格继续"
        pause
        jmp FoundDecodeSection2
FoundDecodeSection3:
        jmp GoOEP
00A745CB   300C38           XOR BYTE PTR DS:[EAX+EDI],CL
00A745CE   83C0 01          ADD EAX,1
00A745D1   3BC3             CMP EAX,EBX
00A745D3  ^7C EE            JL SHORT 00A745C3
00A745D5   83C4 14          ADD ESP,14
CL=F1
DS:[00401000]=2D ('-')

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 209
活跃值: (26)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
留一楼进行总结。。
原来因为复制内存时里面的乱码导致部分文章发不出来,现在已经改好了。。
==========================================
本文起源于。。下面的三个论坛悬赏帖:
ZProtect 1.4.9脱壳练习遇到的疑问
主要疑问的是IAT修复后,脱壳,文件无法运行。
ZProtect 1.4.9脱壳练习遇到的疑问二
主要讨论的是无KEY解码和反ANTI-HOOK。
ZProtect 1.4.9脱壳练习遇到的疑问三
厄……这个没什么好说的,是我太菜了,连很多脱壳基本技巧都不懂所以问的。
==========================================
2010-04-29 20:16
重新检查了一遍,把部分错字及可能产生误解的句子,进行了修订。
最后补充一下,我是在各位朋友的帮助下,有所学习与长进的。我并不强,觉得不错可以说声“谢谢”,如此足矣。
厄,这个帖子采用的试验程序,是由Storm1980提供的,虽然不是1.4.9的版本,但也要猜XOR数值解码,据说是什么企业版~~我只能猜解码,不能脱壳,因为无法修复IAT,很有意思的一种情况。
而XIMO大大的脚本,我是在吾爱论坛找到的,而上文中,XIMO大大的帖子,是昨天chyx告诉我的,原来我也不知道。当时,对XIMO大大的脚本的某些地方,还是很不解的。
这里也要谢谢storm1980和chyx~~
==========================================
2010-05-01 03:31
忘记说明了。。最开始的脚本模板,大体上是仿Ximo大大的脚步写的,譬如获取OEP~~
也是第一次学写OD脚本~感觉上还是蛮容易的。
除了repl命令不支持变量这点外。。已经在OD脚本插件的官方论坛留下意见了,希望可以更新。
==========================================

不过怎么还是觉得有些东西忘了写。。。等我想起来再回来补上。
2010-5-1 04:01
0
雪    币: 2513
活跃值: (570)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
很详细
很好很强大……
2010-5-1 14:25
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
的确很详细 thanks

share
2010-5-9 00:59
0
雪    币: 202
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好文章,对我这样的新手来,实在是太详细了,谢谢楼主
2010-5-9 15:58
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
mark..
2010-5-9 16:00
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
强悍啊!!支持
2010-5-16 01:34
0
雪    币: 1731
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
膜拜下!!高手!!
2010-9-1 17:33
0
雪    币: 166
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
很不错的文章,收藏起来慢慢味吧、
2010-9-8 11:59
0
游客
登录 | 注册 方可回帖
返回
//