软件名称:WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB
下载地点:http://cycycycy.yeah.net (已经汉化,附注册码)
发 信 人: 井风
时 间: 2000-11-21
破解工具:Trw20001.22
难 度:易
前 言:
应几位网友的请求,本人特写下这篇文章。其目的不是单单为破解此软件,意义在于抛砖
引玉,让初学者理解破解的基本思路。本文具有一定的普遍性,过程讲解尽可能详细,即使是
未接触过破解的人也能按步聚找出注册码,掌握一套普遍适用的方法。本文欢迎转载,但务必
请保留原文完整性。
本人再次呼吁!每个能人志士积极行动起来,拿出自已的经验和技术,积极参与交流活动,
为提高我国计算机技术水平贡献一份力量。鸣谢!广大为网友提供技术和经验的高手、为大家
建设网站提供交流点的站长们。
详细过程:
一、 运行TRW2000程序
二、 运行Winzip8.0
三、 粗跟踪
1 点HELP-->about winzip...-->register...
2 输入 Namme:cccc Reg Key: 88888888 (8个8)
3 Ctrl+N 呼出TRW,下断点:BPX HMEMCPY 按F5 返回
4 点OK,被拦截,
5 bd * , 作废所有断点
6 pmodule,直接到达Winzip领空,下代码:
0137:00407F6D CALL `USER32!GetDlgItemTextA`
0137:00407F73 PUSH EDI <--来到此行,是WINZIP的代码,细跟踪可以直接中断到这行[A]
0137:00407F74 CALL 0043F89A
0137:00407F79 PUSH EDI
0137:00407F7A CALL 0043F8C3
0137:00407F7F POP ECX
0137:00407F80 MOV ESI,0048CDA4
0137:00407F85 POP ECX
0137:00407F86 PUSH BYTE +0B
7 按F12,在1次后出现非法注册码错误对话框,点OK退出
8 分析: 按1次后即出现非法注册码错误框,说明验证注册码就在这段代码中(F12 运行到遇到 RET,
RETF,IRET指令时停下来)。接下来应找出具体哪个CALL产生错误框,并记录下大致跳转的过程。
以便可找出在哪个跳转位置可以跳过产生错误框的的CALL。进一步找出验证注册码、计算注册码
的位置。
四、 细跟踪
1 同前,输入注册码,呼出TRW,设断点:BPX 004077F73 <--是上面[A]行
2 点OK,被拦截,代码如下面[步聚7后面]
3 bc * ,清除所有断点
4 现在要找出产生误注册码框的的哪个CALL:按F10,即单步跟踪。一直按F10,一直按,注意记下的次数,
直到出现错误框,假设使用次数为X次。
5 从步聚1开始重来,做到步聚4时按F10(X-1)次,即找出了产生错误的CALL,
是下面代码后部的0137:00408018 CALL 00430025,就是这条指令产生错误框。
6 着重分析如何跳过0137:00408018 CALL 00430025这条产生错误框指令。读者可从下面代码由后面向前
读,弄懂本人的分析过程。另也可以首先在离0137:00408018 CALL 00430025这条产生错误框指令不远
代码处开始,记录一份程序执行到0137:00408018 CALL 的跳转过程,这样便于直接找出那个重要的跳转
点,即如本程序中的00407FBC JZ 00408005。
7 现在已基本找出验证注册码的地方了0137:00407FB5 CALL 004079D5 这个CALL中验证注册码,所以要深
入跟踪进这个CALL。(深入跟踪步聚在代码后面)
0137:00407F6D CALL `USER32!GetDlgItemTextA`
0137:00407F73 PUSH EDI <--中断于此行,从这行起开始细跟踪,即按F10键。
0137:00407F74 CALL 0043F89A
0137:00407F79 PUSH EDI
0137:00407F7A CALL 0043F8C3
0137:00407F7F POP ECX
0137:00407F80 MOV ESI,0048CDA4
0137:00407F85 POP ECX
0137:00407F86 PUSH BYTE +0B
0137:00407F88 PUSH ESI
.
.
.
0137:00407F96 CALL 0043F89A
0137:00407F9B PUSH ESI
0137:00407F9C CALL 0043F8C3
0137:00407FA1 CMP BYTE [0048CD78],00
0137:00407FA8 POP ECX
0137:00407FA9 POP ECX
0137:00407FAA JZ 00408005
0137:00407FAC CMP BYTE [0048CDA4],00
0137:00407FB3 JZ 00408005
0137:00407FB5 CALL 004079D5 <--就是这个CALL中验证注册码,所以深入跟踪进入这个CALL
0137:00407FBA TEST EAX,EAX <--就是这个测试(TEST),至关重要,EAX的值由上面的CALL决定,
哪就是说上面这个CALL验证注册码,并相应置EAX的值,决定是
否跳转。应深入到这个CALL中,找出验证的地方。
0137:00407FBC JZ 00408005 <--这里如跳转则到00408005 CALL,接下去执行00408018 CALL,出错
0137:00407FBE PUSH EDI
0137:00407FBF MOV EDI,0047FFA4
0137:00407FC4 PUSH DWORD 0047DB24
0137:00407FC9 PUSH EDI
0137:00407FCA CALL 0043B5DA
0137:00407FCF PUSH ESI
0137:00407FD0 PUSH DWORD 0047E66C
0137:00407FD5 PUSH EDI
0137:00407FD6 CALL 0043B5DA
0137:00407FDB PUSH DWORD 0047FFC4
0137:00407FE0 PUSH BYTE +00
0137:00407FE2 PUSH BYTE +00
0137:00407FE4 PUSH DWORD 0047DB30
0137:00407FE9 CALL 0043B5C1
0137:00407FEE MOV EAX,[00487AF4]
0137:00407FF3 ADD ESP,BYTE +28
0137:00407FF6 TEST EAX,EAX
0137:00407FF8 JZ 00408001
0137:00407FFA PUSH EAX
0137:00407FFB CALL `GDI32!DeleteObject`
0137:00408001 PUSH BYTE +01
0137:00408003 JMP SHORT 00408035
0137:00408005 CALL 004082A6 <--上面00407FBC行跳到此行,如执行到此行,则会执行00408018 CALL
0137:0040800A PUSH DWORD 028E 说明上一跳转已判别出输入的是错误注册码。继续向分分析
0137:0040800F CALL 0043F5ED
0137:00408014 PUSH EAX
0137:00408015 PUSH EBX
0137:00408016 PUSH BYTE +3D
0137:00408018 CALL 00430025 <--执行此行CALL则出现错误框,须找出如何才能跳过此行
0137:0040801D ADD ESP,BYTE +10
0137:00408020 INC DWORD [00487AF8]
四、 深入跟踪
1 重复细跟踪步聚中的1-3步;
2 按F10,小心不要走过头呵,一直执行00407FB5 CALL 004079D5 这行;
3 按F8,追入此CALL,来到下面代码(代码在步聚4后面);
4 按F10,边按边分析,值得怀凝地方可查看各寄存器的内容(用D EAX 、EDI等命令)你会找到下面的
代码,本程序就在这里计算和验证注册码。按F10键53次到达0137:00407A97 PUSH EAX(见代码),这
里就是…………。
0137:00407905 POP ESI <-- 追入上叙CALL后,来到此行
0137:00407906 POP EBP
0137:00407907 RET 04
0137:0040790A PUSH ESI
0137:0040790B MOV ESI,ECX
.
.
.
0137:00407A5E PUSH EAX
0137:00407A5F CALL 00467C10
0137:00407A64 PUSH DWORD C8
0137:00407A69 LEA EAX,[EBP+FFFFFDF8]
0137:00407A6F PUSH BYTE +00
0137:00407A71 PUSH EAX
0137:00407A72 CALL 00467C10
0137:00407A77 ADD ESP,BYTE +18
0137:00407A7A TEST ESI,ESI
0137:00407A7C JZ 00407A91
0137:00407A7E CALL 004082A6
0137:00407A83 AND DWORD [00489FDC],BYTE +00
0137:00407A8A XOR EAX,EAX
0137:00407A8C JMP 00407B42
0137:00407A91 LEA EAX,[EBP+FFFFFEC0]
0137:00407A97 PUSH EAX <--按F10键53次到这行
0137:00407A98 PUSH EDI <--执行此行后,下令D EDI,显示‘cccc’,即输入的注册名
0137:00407A99 CALL 00407B47 <--呼叫计算注册码子程序(新版本)
0137:00407A9E MOV ESI,0048CDA4 <--传送输入的注册码,执行此行后下令D ESI,显示‘8个8’
0137:00407AA3 LEA EAX,[EBP+FFFFFEC0]
0137:00407AA9 PUSH ESI <--将输入的假码‘8个8’压入堆栈,下令D ESI,显示‘8个8’
0137:00407AAA PUSH EAX <--计算出的注册码压入堆栈,下令D EAX 显示正确注册码:
02EC0252
0137:00407AAB CALL 004692D0 <--呼叫验证注册码子程序,看看输入的是否为新版本注册码。
0137:00407AB0 ADD ESP,BYTE +10
0137:00407AB3 NEG EAX
0137:00407AB5 SBB EAX,EAX
0137:00407AB7 INC EAX
0137:00407AB8 MOV [00489FDC],EAX
0137:00407ABD JNZ 00407B27 <--如输入的注册码正确,这里跳转,可返回呼叫程序,
可跳过00408018 CALL ,完成程序注册。
0137:00407ABF LEA EAX,[EBP+FFFFFEC0]
0137:00407AC5 PUSH EAX
0137:00407AC6 PUSH EDI <--执行此行后,下令D EDI,显示‘cccc’,即输入的注册名
0137:00407AC7 CALL 00407BE4 <--呼叫计算注册码子程序(老版本)
0137:00407ACC LEA EAX,[EBP+FFFFFEC0]
0137:00407AD2 PUSH ESI <--将输入的假码‘8个8’压入堆栈,下令D ESI,显示‘8个8’
0137:00407AD3 PUSH EAX <--计算出的注册码压入堆栈,下令D EAX 显示正确注册码:
07480594
0137:00407AD4 CALL 004692D0 <--呼叫验证注册码子程序,看看输入的是否为新版本注册码。
0137:00407AD9 ADD ESP,BYTE +10
0137:00407ADC NEG EAX
0137:00407ADE SBB EAX,EAX
0137:00407AE0 INC EAX
0137:00407AE1 MOV [00489FDC],EAX
0137:00407AE6 JNZ 00407B27
0137:00407AE8 LEA EAX,[EBP+FFFFFEC4]
0137:00407AEE PUSH BYTE +04
0137:00407AF0 PUSH EAX
0137:00407AF1 PUSH ESI
0137:00407AF2 CALL 004696C0
0137:00407AF7 ADD ESP,BYTE +0C
0137:00407AFA TEST EAX,EAX
0137:00407AFC JNZ 00407B20 (JUMP)
0137:00407AFE LEA EAX,[EBP+FFFFFEC0]
0137:00407B04 PUSH BYTE +04
0137:00407B06 PUSH EAX
0137:00407B07 PUSH DWORD 0048CDA8
0137:00407B0C CALL 004696C0
0137:00407B11 ADD ESP,BYTE +0C
0137:00407B14 TEST EAX,EAX
0137:00407B16 JNZ 00407B20
0137:00407B18 MOV [00489FDC],EBX
0137:00407B1E JMP SHORT 00407B27
0137:00407B20 AND DWORD [00489FDC],BYTE +00
0137:00407B27 PUSH DWORD 012C
0137:00407B2C LEA EAX,[EBP+FFFFFEC0]
0137:00407B32 PUSH BYTE +00
0137:00407B34 PUSH EAX
0137:00407B35 CALL 00467C10
0137:00407B3A MOV EAX,[00489FDC]
0137:00407B3F ADD ESP,BYTE +0C
0137:00407B42 POP EDI
0137:00407B43 POP ESI
0137:00407B44 POP EBX
0137:00407B45 LEAVE
0137:00407B46 RET <--执行此行返回呼叫程序
至此,找出注册码!
小 结:
此程序有两处计算和验证注册码的子程序。它可用新版本的注册码注册,亦可用前一版本的
注册码完成注册。
User Name: cccc
Reg Key: 02EC0252 或07480594 (新旧版本注册码皆可用)
后 记:
有疑问请与我联系:hz.cy@163.net
- 标 题:WINZIP8.0(FileVersion:13.0 32bit) Winzip32.EXE 1,393KB
- 作 者:井风
- 时 间:2000-11-21
- 链 接:http://bbs.pediy.com