【文章标题】: 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 ('-')
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!