【软件名称】:迷你网络电视 v5.3
【下载地址】:http://www.web-checker.com/gb/tvsetup.exe
【软件大小】:1.04MB
【软件简介】:迷你网络电视内含155个视频频道和140个广播频道.包括许多精彩的国外影视频道和新闻频道,能让您的电脑成为具备电视机和收音机的所有功能. 未注册用户可以收看35个电视频道和40个电台广播。
【软件限制】:使用限制
【破解作者】:仙剑太郎
【作者声明】:破解只为学习和兴趣,无其它目的。第一次写算法的文章哦,失误之处还请诸位大侠赐教!
【破解工具】:FileInfo 3.01,W32dasm 9.0,OllyDbg 1.09C 汉化版
======================================================
【分析过程】:
简单算法:迷你网络电视算法分析
运行迷你网络电视,点击注册,显示我的机器码是38068421,HEX即为244E0C5,随便输入注册码,这里输入123456789,HEX为75BCD15作为假注册码.
用w32dasm的串式字符参考,找到"迷你网络电视-注册版",然后向上看,00402274是关键跳转(若在这里暴破,运行时显示是注册版,但电视台的菜单依然不可用,所以另想办法),用OllyDbg在0040226D关键CALL处下断点,F7跟入
;======================================================
:0040224A FF431C inc [ebx+1C]
:0040224D 8B10 mov edx, dword ptr [eax]
:0040224F 8B86F4020000 mov eax, dword ptr [esi+000002F4]
:00402255 E89AC20B00 call 004BE4F4
:0040225A FF4B1C dec [ebx+1C]
:0040225D 8D856CFFFFFF lea eax, dword ptr [ebp+FFFFFF6C]
:00402263 BA02000000 mov edx, 00000002
:00402268 E8F7A70F00 call 004FCA64
:0040226D E886340000 call 004056F8 关键CALL,跟入
:00402272 84C0 test al, al 测试标志位
:00402274 7448 je 004022BE 跳就完了
:00402276 33D2 xor edx, edx
:00402278 8B8618030000 mov eax, dword ptr [esi+00000318]
:0040227E E8C5770800 call 00489A48
:00402283 66C74310C800 mov [ebx+10], 00C8
* Possible StringData Ref from Data Obj ->"迷你网络电视-注册版"
|
:00402289 BA52035300 mov edx, 00530352
:0040228E 8D8568FFFFFF lea eax, dword ptr [ebp+FFFFFF68]
:00402294 E8FBA60F00 call 004FC994
:00402299 FF431C inc [ebx+1C]
:0040229C 8B10 mov edx, dword ptr [eax]
:0040229E 8B86F0020000 mov eax, dword ptr [esi+000002F0]
:004022A4 E827C00300 call 0043E2D0
:004022A9 FF4B1C dec [ebx+1C]
:004022AC 8D8568FFFFFF lea eax, dword ptr [ebp+FFFFFF68]
:004022B2 BA02000000 mov edx, 00000002
:004022B7 E8A8A70F00 call 004FCA64
:004022BC EB56 jmp 00402314
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00402274(C)
|
:004022BE 66C74310D400 mov [ebx+10], 00D4
* Possible StringData Ref from Data Obj ->"迷你网络电视-未注册版"
|
:004022C4 BA66035300 mov edx, 00530366
:004022C9 8D8564FFFFFF lea eax, dword ptr [ebp+FFFFFF64]
:004022CF E8C0A60F00 call 004FC994
:004022D4 FF431C inc [ebx+1C]
:004022D7 8B10 mov edx, dword ptr [eax]
:004022D9 8B86F0020000 mov eax, dword ptr [esi+000002F0]
:004022DF E8ECBF0300 call 0043E2D0
:004022E4 FF4B1C dec [ebx+1C]
:004022E7 8D8564FFFFFF lea eax, dword ptr [ebp+FFFFFF64]
:004022ED BA02000000 mov edx, 00000002
:004022F2 E86DA70F00 call 004FCA64
:004022F7 6A01 push 00000001
;===============================================================
;从0040226D跟入后来到这里
004056F8 /$ BA 78785400 MOV EDX,nettvprj.00547878
004056FD |. FF02 INC DWORD PTR DS:[EDX]
004056FF |. 8302 09 ADD DWORD PTR DS:[EDX],9
00405702 |. 33C0 XOR EAX,EAX
00405704 |> FF02 /INC DWORD PTR DS:[EDX] 这里循环次数为25=37次
00405706 |. 2902 |SUB DWORD PTR DS:[EDX],EAX
00405708 |. 40 |INC EAX
00405709 |. 83F8 25 |CMP EAX,25 这个循环有什么用??不知道~
0040570C |.^7C F6 \JL SHORT nettvprj.00405704 按F8三十七次,注意别按过头了
0040570E |. E8 EDFEFFFF CALL nettvprj.00405600 来到这个CALL,跟入
00405713 \. C3 RETN
;===============================================================
;从0040570E跟入后来到这里,这才是算法的关键:
00405600 /$ 53 PUSH EBX
00405601 |. 56 PUSH ESI
00405602 |. 57 PUSH EDI
00405603 |. 55 PUSH EBP
00405604 |. 803D A8025300 >CMP BYTE PTR DS:[5302A8],0 机器码标志是否为0?
0040560B |. 75 32 JNZ SHORT nettvprj.0040563F 不为0,跳到0040563F;为0,重新计算机器码
0040560D |. 68 39300000 PUSH 3039 机器码计算过程
00405612 |. E8 519D1200 CALL
00405617 |. 59 POP ECX
00405618 |. 8BD0 MOV EDX,EAX
0040561A |. C1E0 03 SHL EAX,3
0040561D |. 2BC2 SUB EAX,EDX
0040561F |. 8D0482 LEA EAX,DWORD PTR DS:[EDX+EAX*4]
00405622 |. 05 0FCD7F00 ADD EAX,7FCD0F
00405627 |. B9 1F000000 MOV ECX,1F
0040562C |. 99 CDQ
0040562D |. F7F9 IDIV ECX
0040562F |. 05 0FCD7F00 ADD EAX,7FCD0F
00405634 |. A3 A4025300 MOV DWORD PTR DS:[5302A4],EAX
00405639 |. FE05 A8025300 INC BYTE PTR DS:[5302A8]
0040563F |> 8B1D A4025300 MOV EBX,DWORD PTR DS:[5302A4] 取机器码入EBX
00405645 |. A1 A0025300 MOV EAX,DWORD PTR DS:[5302A0] 这里EBX为机器码HEX值
0040564A |. A3 74785400 MOV DWORD PTR DS:[547874],EAX
0040564F |. 8BC3 MOV EAX,EBX
00405651 |. 99 CDQ
00405652 |. B9 1F000000 MOV ECX,1F 1F=31入ECX
00405657 |. F7F9 IDIV ECX 机器码244E0C5除以1F=12BCED入EAX
00405659 |. 8BE8 MOV EBP,EAX EBP=EAX=12BCED
0040565B |. 8BC3 MOV EAX,EBX
0040565D |. 99 CDQ
0040565E |. B9 07000000 MOV ECX,7 ECX=7
00405663 |. F7F9 IDIV ECX 机器码244E0C5除以7=52FB89作为原始注册码入EAX
00405665 |. FF05 A0025300 INC DWORD PTR DS:[5302A0]
0040566B |. FF05 A0025300 INC DWORD PTR DS:[5302A0]
00405671 |. C605 8C025300 >MOV BYTE PTR DS:[53028C],0
00405678 |. 8BF0 MOV ESI,EAX EAX=ESI=52FB89
0040567A |. A1 A0025300 MOV EAX,DWORD PTR DS:[5302A0]
0040567F |. 0105 74785400 ADD DWORD PTR DS:[547874],EAX
00405685 |. FF05 A0025300 INC DWORD PTR DS:[5302A0]
0040568B |. 8B3D 90025300 MOV EDI,DWORD PTR DS:[530290] 地址530290为假注册码
00405691 |. B9 01000000 MOV ECX,1 初始化记数器
00405696 |. EB 0B JMP SHORT nettvprj.004056A3
00405698 |> 03F1 /ADD ESI,ECX 循环开始,ECX=1,原始注册码累加
0040569A |. FF05 74785400 |INC DWORD PTR DS:[547874]
004056A0 |. 2BF9 |SUB EDI,ECX EDI为假注册码,递减
004056A2 |. 41 |INC ECX 记数器加1
004056A3 |> 8BC3 MOV EAX,EBX 上面00405696直接跳转到这里,所以循环次数为1F-1=1E即30次
004056A5 |. 99 |CDQ
004056A6 |. F7FD |IDIV EBP 机器码244E0C5除以12BCED=1F作为循环次数
004056A8 |. 3BC8 |CMP ECX,EAX 记数器是否等于循环次数?
004056AA |.^7C EC \JL SHORT nettvprj.00405698 循环
004056AC |. 3BF7 CMP ESI,EDI 这里就是比较,内存注册机在这里做,得到的数要加上465
004056AE |. 75 1D JNZ SHORT nettvprj.004056CD
【分析总结】:
注册码保存在Windows目录下的mntv.ini文件中。
内存注册机:
中断地址:40226D
次数:1
指令:E8
长度:5
中断地址:40570E
次数:1
指令:E8
长度:5
中断地址:4056AC
次数:1
指令:3B
长度:2
寄存器方式->ESI->十进制
得到的数值再加上465即为注册码
【算法分析】:
机器码244E0C5/1F=12BCED作为被除数
然后再用机器码244E0C5/12BCED=1F作为循环次数
机器码244E0C5/7=52FB89作为注册码原始数值
通过1F-1=1E两次的累加,即1+2+3+4....+1D+1E=1D1,则原始注册码+1D1*2(即十进制465)为正确注册码.
用VB写个注册机,Text1为机器码,Text2为注册码
------------------------
Dim ESI As Long
ESI = Int(Val(Text1.Text) / 7)
For i = 1 To Int(Val(Text1.Text) / 1228013) - 1
ESI = ESI + i * 2
Next i
Text2.Text = ESI
------------------------
仙剑太郎 http://cnokweb.yeah.net
中国X黑客小组 www.CnXHacker.com