簡單演算法:迷你網路電視演算法分析 (8千字)

看雪資料發表於2015-11-15

【軟體名稱】:迷你網路電視 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

相關文章