• 标 题:简单算法:迷你网络电视算法分析 (8千字)
  • 作 者:仙剑太郎
  • 时 间:2003-08-03 17:57:47
  • 链 接:http://bbs.pediy.com

【软件名称】:迷你网络电视 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 edxdword ptr [eax]
:0040224F 8B86F4020000            mov eaxdword ptr [esi+000002F4]
:00402255 E89AC20B00              call 004BE4F4
:0040225A FF4B1C                  dec [ebx+1C]
:0040225D 8D856CFFFFFF            lea eaxdword ptr [ebp+FFFFFF6C]
:00402263 BA02000000              mov edx, 00000002
:00402268 E8F7A70F00              call 004FCA64
:0040226D E886340000              call 004056F8              关键CALL,跟入
:00402272 84C0                    test alal                测试标志位
:00402274 7448                    je 004022BE                跳就完了
:00402276 33D2                    xor edxedx
:00402278 8B8618030000            mov eaxdword 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 eaxdword ptr [ebp+FFFFFF68]
:00402294 E8FBA60F00              call 004FC994
:00402299 FF431C                  inc [ebx+1C]
:0040229C 8B10                    mov edxdword ptr [eax]
:0040229E 8B86F0020000            mov eaxdword ptr [esi+000002F0]
:004022A4 E827C00300              call 0043E2D0
:004022A9 FF4B1C                  dec [ebx+1C]
:004022AC 8D8568FFFFFF            lea eaxdword 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 eaxdword ptr [ebp+FFFFFF64]
:004022CF E8C0A60F00              call 004FC994
:004022D4 FF431C                  inc [ebx+1C]
:004022D7 8B10                    mov edxdword ptr [eax]
:004022D9 8B86F0020000            mov eaxdword ptr [esi+000002F0]
:004022DF E8ECBF0300              call 0043E2D0
:004022E4 FF4B1C                  dec [ebx+1C]
:004022E7 8D8564FFFFFF            lea eaxdword 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