網路電視大師 2004VER2.0.0.1版演算法分析(簡單)DD本年度最後一篇

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

網路電視大師 2004VER2.0.0.1版演算法分析(簡單)DD本年度最後一篇破文
今天想看中韓對戰,去網上找網路電視軟體,找到這個。主要目的不是分析的軟體註冊演算法,想說我很佩服作者,因為他才用了比以前版本更為簡單的演算法,它把精力放到程式功能的提高上而不是註冊演算法。這種做法只得大家尊敬和支援!

《網路電視大師2004》是在原<<網路電視大師Ver5.0>>的基礎上進一步升級,對軟體的運算規則進行了全面最佳化,大大提高了網路連線的開啟效率!<網路電視大師2004>收集了全國大部分省市電視臺和國外的知名電視臺和電臺.近千個網路連線.該版本新增的功能我就不多介紹了,大家使用後就知道好不好咯! 
宣告:只為技術而破解!
(txm123分析過他的低階版本網址http://tongtian.net/pediybbs/viewtopic.php?t=717)
作者:mejy【BCG】【FCG】
破解工具:OD1.09  ,DEDE ,DELPHI6.0簡體中文版

利用fi249(:)俺的3.1什麼時候不理我了)是delphi編寫的,沒有加殼。用DEDE反之,然後利用其匯出功能,儲存為delphi工程,因為個人認為看delphi更直觀,當然直接在DEDE中看,也是可以的。
找到這兒:
procedure Tregform.okClick(Sender : TObject);
begin
0049FFE0   55                     push    ebp
。。。。。。。。。。。。
使用者名稱 MEJY[BCG][FCG]
試練碼  123456
呵呵 如果時小寫的話註冊碼會出現UNICODE字元。這兒簡化一下
下斷把!現在好多DELPHI比較大的程式如果採用了變數名混亂技術,斷點還是不太好找得。大家看一下《《資料收藏大師》》這個程式,好像斷點不太好找。
0049FFE0   . 55             PUSH EBP
0049FFE1   . 8BEC           MOV EBP,ESP
×××××省略幾行
004A0007   . E8 2443F6FF    CALL main.00404330
004A000C   . 8D55 F8        LEA EDX,DWORD PTR SS:[EBP-8]
004A000F   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004A0012   . 8B80 F0020000  MOV EAX,DWORD PTR DS:[EAX+2F0]
004A0018   . E8 0BE0F9FF    CALL main.0043E028
004A001D   . 837D F8 00     CMP DWORD PTR SS:[EBP-8],0  讀入使用者名稱
004A0021   . 0F84 E7000000  JE main.004A010E
004A0027   . 8D55 F4        LEA EDX,DWORD PTR SS:[EBP-C]
004A002A   . 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
004A002D   . 8B80 F4020000  MOV EAX,DWORD PTR DS:[EAX+2F4]
004A0033   . E8 F0DFF9FF    CALL main.0043E028
004A0038   . 8D55 F0        LEA EDX,DWORD PTR SS:[EBP-10]
004A003B   . 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
004A003E   . E8 C9FEFFFF    CALL main.0049FF0C   
只覺告訴,這是註冊碼演算法的關鍵,跟進
004A0043   . 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]   將輸入的假碼入棧
004A0046   . 8B45 F0    MOV EAX,DWORD PTR SS:[EBP-10] 將使用者名稱的變換結果入棧
004A0049   . E8 8285F6FF    CALL main.004085D0  關鍵比較call跟進
004A004E   . 85C0           TEST EAX,EAX
004A0050     74 2F          JE SHORT main.004A0081  關鍵跳轉
上面的call
0049FF0C  /$ 55             PUSH EBP
0049FF0D  |. 8BEC           MOV EBP,ESP
0049FF0F  |. 83C4 F0        ADD ESP,-10       處理堆疊
0049FF12  |. 53             PUSH EBX
0049FF13  |. 56             PUSH ESI
0049FF14  |. 57             PUSH EDI
0049FF15  |. 33C9           XOR ECX,ECX
0049FF17  |. 894D F0        MOV DWORD PTR SS:[EBP-10],ECX
0049FF1A  |. 894D F4        MOV DWORD PTR SS:[EBP-C],ECX
0049FF1D  |. 8955 F8        MOV DWORD PTR SS:[EBP-8],EDX
0049FF20  |. 8945 FC        MOV DWORD PTR SS:[EBP-4],EAX EAX中儲存的是使用者名稱
0049FF23  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049FF26  |. E8 A548F6FF    CALL main.004047D0 
0049FF2B  |. 33C0           XOR EAX,EAX  
0049FF2D  |. 55             PUSH EBP
0049FF2E  |. 68 CFFF4900    PUSH main.0049FFCF
0049FF33  |. 64:FF30        PUSH DWORD PTR FS:[EAX]
0049FF36  |. 64:8920        MOV DWORD PTR FS:[EAX],ESP
0049FF39  |. 8D45 F4        LEA EAX,DWORD PTR SS:[EBP-C]
0049FF3C  |. E8 EF43F6FF    CALL main.00404330
0049FF41  |. 8B45 FC        MOV EAX,DWORD PTR SS:[EBP-4]
0049FF44  |. E8 9F46F6FF    CALL main.004045E8   該call的作用是求得使用者名稱的長度。
0049FF49  |. 8BF0           MOV ESI,EAX       使用者名稱長度DD》esi
0049FF4B  |. 85F6           TEST ESI,ESI        使用者名稱是否為空
0049FF4D  |. 7E 52          JLE SHORT main.0049FFA1
下面開始根據使用者名稱計算註冊碼
0049FF4F  |. BB 01000000    MOV EBX,1      這是個初始值 i=1  以後每迴圈一次i++;
0049FF54  |> 8D43 1E        /LEA EAX,DWORD PTR DS:[EBX+1E]  j = i+1e
0049FF57  |. 50             |PUSH EAX         EAX= i+1e;
0049FF58  |. 8BC3           |MOV EAX,EBX  將EBX的值入棧 作為下面運算的被除數
0049FF5A  |. 5A             |POP EDX     EDX中可見到是上面EAX中的值
0049FF5B  |. 8BCA     |MOV ECX,EDX     
0049FF5D  |. 99             |CDQ
0049FF5E  |. F7F9           |IDIV ECX  EAX=EAX/ECX=1/1F=0,餘數1放在EDX中
********************************彙編知識**********************************
IDIV    整數除法. ,結果回送: 
          商回送AL,餘數回送AH, (位元組運算); 或  商回送AX,餘數回送DX, (字運算).
0049FF60  |. 8BFA           |MOV EDI,EDX  餘數送到EDI中
0049FF62  |. 8BC3           |MOV EAX,EBX   
0049FF64  |. 33C3           |XOR EAX,EBX
0049FF66  |. 33C3           |XOR EAX,EBX 這兒進行兩個異或運算,他又不是回來了嗎
0049FF68  |. 33F8           |XOR EDI,EAX    清零
0049FF6A  |. 8D43 14        |LEA EAX,DWORD PTR DS:[EBX+14]  j=i+14
0049FF6D  |. 50             |PUSH EAX    入棧
0049FF6E  |. 8BC3           |MOV EAX,EBX   將j作為下一個整除運算的被除數
0049FF70  |. 5A             |POP EDX   
0049FF71  |. 8BCA           |MOV ECX,EDX  ecx=j;
0049FF73  |. 99             |CDQ
0049FF74  |. F7F9           |IDIV ECX
0049FF76  |. 33D3           |XOR EDX,EBX
0049FF78  |. 03FA           |ADD EDI,EDX 將上一個計算的餘數和這一次的餘數相加
0049FF7A  |. 03FB           |ADD EDI,EBX  將兩次餘數相加的結果在與i相加
0049FF7C  |. 83F7 03        |XOR EDI,3     結果與3異或
0049FF7F  |. 47             |INC EDI   將上面的結果加1
0049FF80  |. 8D45 F0        |LEA EAX,DWORD PTR SS:[EBP-10]
0049FF83  |. 8B55 FC        |MOV EDX,DWORD PTR SS:[EBP-4]
0049FF86  |. 0FB6541A FF    |MOVZX EDX,BYTE PTR DS:[EDX+EBX-1] 
取使用者名稱的每位的字元  EDX=M,E,J。。。。。
0049FF8B  |. 03D7           |ADD EDX,EDI  將上面的計算結果和使用者名稱各位上的字元相加
0049FF8D  |. E8 7E45F6FF    |CALL main.00404510
0049FF92  |. 8B55 F0        |MOV EDX,DWORD PTR SS:[EBP-10]
0049FF95  |. 8D45 F4        |LEA EAX,DWORD PTR SS:[EBP-C]
0049FF98  |. E8 5346F6FF    |CALL main.004045F0   轉化成字元
0049FF9D  |. 43             |INC EBX
0049FF9E  |. 4E             |DEC ESI
0049FF9F  |.^75 B3          JNZ SHORT main.0049FF54   如果使用者名稱沒有處理完成則繼續
0049FFA1  |> 8B45 F8        MOV EAX,DWORD PTR SS:[EBP-8]
0049FFA4  |. 8B55 F4        MOV EDX,DWORD PTR SS:[EBP-C]
0049FFA7  |. E8 D843F6FF    CALL main.00404384
0049FFAC  |. 33C0           XOR EAX,EAX
0049FFAE  |. 5A             POP EDX
0049FFAF  |. 59             POP ECX
0049FFB0  |. 59             POP ECX
0049FFB1  |. 64:8910        MOV DWORD PTR FS:[EAX],EDX
0049FFB4  |. 68 D6FF4900    PUSH main.0049FFD6
0049FFB9  |> 8D45 F0        LEA EAX,DWORD PTR SS:[EBP-10]
0049FFBC  |. BA 02000000    MOV EDX,2
0049FFC1  |. E8 8E43F6FF    CALL main.00404354
0049FFC6  |. 8D45 FC        LEA EAX,DWORD PTR SS:[EBP-4]
0049FFC9  |. E8 6243F6FF    CALL main.00404330
0049FFCE  . C3             RETN

004085D0  /$ 56             PUSH ESI
004085D1  |. 57             PUSH EDI
004085D2  |. 53             PUSH EBX
004085D3  |. 89C6           MOV ESI,EAX   變換後得使用者名稱
004085D5  |. 89D7           MOV EDI,EDX     輸入的註冊碼
004085D7  |. 09C0           OR EAX,EAX
004085D9  |. 74 03          JE SHORT main.004085DE
004085DB  |. 8B40 FC        MOV EAX,DWORD PTR DS:[EAX-4] 使用者名稱長度
004085DE  |> 09D2           OR EDX,EDX
004085E0  |. 74 03          JE SHORT main.004085E5
004085E2  |. 8B52 FC        MOV EDX,DWORD PTR DS:[EDX-4]  加碼的長度
004085E5  |> 89C1           MOV ECX,EAX
004085E7  |. 39D1           CMP ECX,EDX  比較輸入的註冊碼和使用者名稱變換後的長度
004085E9  |. 76 02          JBE SHORT main.004085ED
004085EB  |. 89D1           MOV ECX,EDX
004085ED  |> 39C9           CMP ECX,ECX
以下比較的關鍵:
004085EF  |> F3:A6          /REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS>
迴圈比較直到遇到一個不想等的字元,如果你輸入的註冊碼和根據使用者名稱計算後的串相同,則直接跳到0040861D處
****************彙編知識**************************8
REPE/REPZ      當ZF=1或比較結果相等,且CX/ECX<>0時重複.
004085F1  |. 74 2A          |JE SHORT main.0040861D 
004085F3  |. 8A5E FF        |MOV BL,BYTE PTR DS:[ESI-1] 
這裡處理的是變化後得使用者名稱
004085F6  |. 80FB 61        |CMP BL,61   和字元a比較
004085F9  |. 72 08          |JB SHORT main.00408603    JB 比較無符號數 當小於時跳
004085FB  |. 80FB 7A        |CMP BL,7A           和字元z比較
004085FE  |. 77 03          |JA SHORT main.00408603  JA比較無符號數 當大於時跳
00408600  |. 80EB 20        |SUB BL,20    如果是小寫字母,將他轉化為大寫字母
00408603  |> 8A7F FF        |MOV BH,BYTE PTR DS:[EDI-1]  處理你輸入的字元如果是小寫的同樣將他轉化為大寫。
00408606  |. 80FF 61        |CMP BH,61
00408609  |. 72 08          |JB SHORT main.00408613
0040860B  |. 80FF 7A        |CMP BH,7A
0040860E  |. 77 03          |JA SHORT main.00408613
00408610  |. 80EF 20        |SUB BH,20
00408613  |> 38FB           |CMP BL,BH 
比較輸入的註冊碼和根據使用者名稱比較的註冊碼相等繼續下次迴圈,不等的話註冊失敗。
00408615  |.^74 D8          JE SHORT main.004085EF
00408617  |. 0FB6C3         MOVZX EAX,BL
0040861A  |. 0FB6D7         MOVZX EDX,BH 
0040861D  |> 29D0           SUB EAX,EDX  如果這兒eax=edx 則可註冊成功
0040861F  |. 5B             POP EBX
00408620  |. 5F             POP EDI
00408621  |. 5E             POP ESI
00408622  . C3             RETN
這個註冊演算法很直觀和以前版本的區別在於以前版本生成一個序列號,根據序列號計算,這個版本沒用序列號,直接用了使用者名稱。
總結一下:
本演算法主要要到的彙編知識:
DIV    無符號除法. 
IDIV    整數除法. 
          以上兩條,結果回送: 
              商回送AL,餘數回送AH, (位元組運算); 
          或  商回送AX,餘數回送DX, (字運算).
CDQ    雙字擴充套件.    (把EAX中的字的符號擴充套件到EDX中去)
XOR    異或運算.
REPE/REPZ      當ZF=1或比較結果相等,且CX/ECX<>0時重複. 
        REPNE/REPNZ    當ZF=0或比較結果不相等,且CX/ECX<>0時重複.
JAE/JNB(比較無符號數)  73  C=0  >=  高於或等於/不低於
JB/JNAE(比較無符號數)  72  C=1  <  低於/不高於或等於
JBE/JNA(比較無符號數)  76  C或Z=1  <=  低於或等於/不高於

至此,本文寫作告一段落。一組可用MEJY[BCG][FCG]   PGKabHHSheOSVk
這也許是本年度的最後一篇破文,再次向所有關心我們菜鳥成長的牛人 例如FLY 、LORDER、YESKY1、看雪等致以誠摯的感謝!來年再見!


相關文章