菜鳥破解錄之 GIF Construction Set Pro及演算法分析 (8千字)

看雪資料發表於2000-09-01

菜鳥破解錄之 GIF Construction Set Pro及演算法分析


軟體名稱:  GIF Construction Set Pro
軟體版本:  2.0a(Ptach 20) 
軟體大小:  4132KB 
軟體授權:  共享軟體 
使用平臺:  Win95/98/NT 
釋出公司:  http://www.mindworkshop.com/alchemy/gifcon.html
軟體簡介: 
          快速、專業地建立為你的網頁建立透明、交錯和活動的GIF檔案。動畫嚮導可另你在幾分鐘之內建立極具魅力的Web圖形。



作    者:xiA Qin
解密日前:2000年8月30日
解密工具:Trw2000 1.22

說    明:這是我寫的第一篇演算法分析的破文,難免有錯誤存在,望各位大俠指點。


這個程式需要在安裝時,就需要輸入註冊碼和註冊名。


輸入註冊資訊:
註冊 碼:11111-22-33333-44

注:為了方便說明,分為4段。
    第1段為:11111
    第2段為:22
    第3段為:33333
    第4段為:44

註冊名:Chinese        #字元數必須大於5位數。

..............................
015F:00403163  PUSH    EAX
015F:00403164  LEA      EDX,[EBP+FFFFFBF4]
015F:0040316A  PUSH    EDX
015F:0040316B  CALL    00424508
015F:00403170  ADD      ESP,BYTE +08
015F:00403173  LEA      ECX,[EBP+FFFFFBF4]
015F:00403179  PUSH    ECX
015F:0040317A  PUSH    DWORD 0042FCB6
015F:0040317F  CALL    00424598
015F:00403184  ADD      ESP,BYTE +08
015F:00403187  MOV      DWORD [EBP-04],01
015F:0040318E  PUSH    DWORD 0042FCB6
015F:00403193  CALL    004245C8
015F:00403198  POP      ECX
015F:00403199  CMP      EAX,BYTE +11        //又要檢查註冊碼位數,17位。
015F:0040319C  JZ      004031A3            //不相等,就跳。
015F:0040319E  XOR      EAX,EAX
015F:004031A0  MOV      [EBP-04],EAX
015F:004031A3  CMP      DWORD [EBP-04],BYTE +00
015F:004031A7  JZ      00403203
015F:004031A9  XOR      EDX,EDX
015F:004031AB  MOV      [EBP-08],EDX
015F:004031AE  MOV      ESI,EDX
015F:004031B0  JMP      SHORT 004031D4
015F:004031B2  XOR      EAX,EAX                  //將eax清零。
015F:004031B4  MOV      AL,[ESI+0042F8B4]        //依次載入姓名字元。
015F:004031BA  PUSH    EAX                     
015F:004031BB  CALL    00429FCC                  //將大寫A~Z轉換為小寫a~z。
015F:004031C0  POP      ECX                     
015F:004031C1  MOV      EDX,ESI               
015F:004031C3  AND      EDX,BYTE +07             
015F:004031C6  XOR      ECX,ECX                 
015F:004031C8  MOV      CL,[EDX+0042E088]       
015F:004031CE  XOR      EAX,ECX                  // 把EAX和ECX做異或操作,
015F:004031D0  ADD      [EBP-08],EAX              //累加異或操作 [EBP-08]=[EBP-08]+EAX
015F:004031D3  INC      ESI                     
015F:004031D4  CMP      BYTE [ESI+0042F8B4],00    //取下個字元,等於00,就結束計算。
015F:004031DB  JNZ      004031B2                  //比較姓名字元是否計算結束
015F:004031DD  MOV      EAX,[EBP-08]              //將[EBP-08]的值移入暫存器eax中
015F:004031E0  MOV      ECX,64                    //將16進位制的64移入暫存器ECX
015F:004031E5  CDQ                                //判斷eax中的值是否大於80000000,
015F:004031E6  IDIV    ECX                      //用EAX與ECX求餘.
015F:004031E8  MOV      ESI,EDX                  //餘數從EDX移入ESI。

一、演算法總結:
1、這部分就是把你輸入的註冊名的每個字元都轉成相應的Ascii碼!

2、然後,與相對應80 40 20 10 08 04 02 01進行異或計算。再將計算後的值累加。
然後註冊名大於8位,就迴圈使用80 40 20 10 08 04 02 01。

3、直到註冊名計算完畢的值A與64求餘。得到B.這就是我們需要的是第2段註冊碼
4、將B轉換成十進位制數就是註冊碼,這就是我們需要的是第2段註冊碼

計算公式:
注:註冊名的第一位用a1來代替,第二位用a2來代替,第三位用a3來代替......,以次類推。

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)+(a6 xor 04)+(a7 xor 02)
+(a8 xor 80)+(a9 xor 80)+(a10 xor 40)+(a10 xor 20)+(a11 xor 10)+(a12 xor 08).......=A

A IDIV 64=B

將B轉換成十進位制數就是註冊碼. 是第2段註冊碼。

二、舉例說明:

我輸入的註冊名是chinese,它對應的Ascii如下。

字    符:  c  h  i  n  e s  e
  Ascii: 63 68 69 6e 65 73 65  與80 40 20 10 08 04 02 進行異或計算

(63 xor 80)+(68 xor 40)+(69 xor 20)+(6e xor 10)+(65 xor 08)+(73 xor 04)+(65xor 02)=
e3+28+49+7e+6d+77+67=31D

31D IDIV 64 =61

61轉換成十進位制為97。  <<--第2段註冊碼


015F:004031EA  TEST    ESI,ESI
015F:004031EC  JNZ      004031EF
015F:004031EE  INC      ESI
015F:004031EF  PUSH    DWORD 0042FCBC
015F:004031F4  CALL    0042A088
015F:004031F9  POP      ECX
015F:004031FA  CMP      ESI,EAX        //比較註冊碼。
015F:004031FC  JZ      00403203        //不相等,就跳。                 
015F:004031FE  XOR      EAX,EAX
015F:00403200  MOV      [EBP-04],EAX
015F:00403203  CMP      DWORD [EBP-04],BYTE +00
015F:00403207  JZ      NEAR 0040328E
015F:0040320D  XOR      EDX,EDX
015F:0040320F  MOV      [EBP-08],EDX
015F:00403212  XOR      ESI,ESI
015F:00403214  JMP      SHORT 0040322F
015F:00403216  MOV      AL,[ESI+0042FCB6]    <<--|  11111
015F:0040321C  MOV      EDX,ESI                  |
015F:0040321E  AND      EDX,BYTE +07            |
015F:00403221  XOR      AL,[EDX+0042E088]        |
015F:00403227  XOR      ECX,ECX                  |
015F:00403229  MOV      CL,AL                    |
015F:0040322B  ADD      [EBP-08],ECX            |
015F:0040322E  INC      ESI                      |
015F:0040322F  CMP      BYTE [ESI+0042FCB6],00  |
015F:00403236  JZ      0040323D                |
015F:00403238  CMP      ESI,BYTE +05            |
015F:0040323B  JL      00403216            <<--|
015F:0040323D  XOR      ESI,ESI
015F:0040323F  JMP      SHORT 0040325A
015F:00403241  MOV      AL,[ESI+0042FCBF]    <<--|
015F:00403247  MOV      EDX,ESI                  | 33333
015F:00403249  AND      EDX,BYTE +07            |
015F:0040324C  XOR      AL,[EDX+0042E088]        |
015F:00403252  XOR      ECX,ECX                  |
015F:00403254  MOV      CL,AL                    |
015F:00403256  ADD      [EBP-08],ECX            |
015F:00403259  INC      ESI                      |
015F:0040325A  CMP      BYTE [ESI+0042FCBF],00  |
015F:00403261  JZ      00403268                |
015F:00403263  CMP      ESI,BYTE +05            |
015F:00403266  JL      00403241            <<--|
015F:00403268  MOV      EAX,[EBP-08]
015F:0040326B  MOV      ECX,64         
015F:00403270  CDQ   
015F:00403271  IDIV    ECX
015F:00403273  MOV      ESI,EDX

此處的計算方法基本相同,不同的地方是它是用註冊碼的第1段(11111)和第3段(33333)來計算。
                                                   
一、演算法總結:
1、把你輸入的註冊碼第1段(11111)的每個字元都轉成相應的Ascii碼!
2、然後,與相對應80 40 20 10 08 進行異或計算。再將計算後的值A累加。
3、把你輸入的註冊碼第3段(33333)的每個字元都轉成相應的Ascii碼!
4、然後,與相對應80 40 20 10 08 進行異或計算。再將計算後的值B累加。
5、直到註冊碼計算完畢的值B與64求餘。得到C.這就是我們需要的註冊碼C。
6、將C轉換成十進位制數就是註冊碼,這就是我們需要的第4段註冊碼。

計算公式:
注:註冊碼第1段(11111)的第一位用a1來代替,第二位用a2來代替,第三位用a3來代替......,以次類推
  註冊碼第3段(33333)的第一位用b1來代替,第二位用b2來代替,第三位用b3來代替......,以次類推

(a1 xor 80)+(a2 xor 40)+(a3 xor 20)+(a4 xor 10)+(a5 xor 08)=A

A+(b1 xor 80)+(b2 xor 40)+(b3 xor 20)+(b4 xor 10)+(b5 xor 08)=B

B IDIV 64=C

將C轉換成十進位制數就是註冊碼.

二、舉例說明:
我輸入的註冊碼第1段是11111、第2段33333。

(31 xor 80)+(31 xor 40)+(31 xor 20)+(31 xor 10)+(31 xor 08)=B1+71+11+21+39=18D

18D+(33 xor 80)+(33 xor 40)+(33 xor 20)+(33 xor 10)+(33 xor 08)=18D+B3+73+13+23+3B=324

324 IDIV 64=04


04轉換成十進位制為04。<<--第4段註冊碼。


015F:00403275  TEST    ESI,ESI
015F:00403277  JNZ      0040327A
015F:00403279  INC      ESI
015F:0040327A  PUSH    DWORD 0042FCC5
015F:0040327F  CALL    0042A088
015F:00403284  POP      ECX
015F:00403285  CMP      ESI,EAX              // ? eax 44  是輸入的註冊碼.
015F:00403287  JZ      0040328E                ? esi 04    正確的註冊碼.
015F:00403289  XOR      EAX,EAX
015F:0040328B  MOV      [EBP-04],EAX
015F:0040328E  CMP      DWORD [EBP-04],BYTE +00
015F:00403292  JNZ      004032A6
015F:00403294  PUSH    DWORD 00430FCC
015F:00403299  PUSH    EBX
015F:0040329A  CALL    004038FD              //密碼失敗對話方塊
015F:0040329F  ADD      ESP,BYTE +08
015F:004032A2  XOR      EAX,EAX
015F:004032A4  JMP      SHORT 00403310
.........................


透過以上分析可以知道,這個程式是用註冊冊名計算第2段註冊嗎。用第1段和第3段來計算第4段註冊碼。

也就是說,註冊碼第2段,同註冊名有關。
          註冊碼第4段,同註冊碼第1段和第3段有關。

整理一下:

註冊碼:11111-97-33333-04
註冊名:Chinese

羅羅嗦嗦講了一大堆,希望大家能夠明白我的意思!

相關文章