AVI-GIF V1.0.9 漢化版的演算法跟蹤

看雪資料發表於2003-03-06

AVI-GIF V1.0.9 漢化版的演算法跟蹤

軟體大小:  619 KB
軟體語言:  簡體中文
軟體類別:  漢化補丁 / 共享版 / 影像轉換
應用平臺:  Win9x/NT/2000/XP
下載頁面:   http://www.skycn.com/soft/7228.html
軟體介紹:
   AVI-GIF 是一套影像轉換器,它可以將 AVI轉換成GIF.GIF轉換成AVI影像格式,您的AVI影片若有好看的片段,但苦無轉檔案程式轉換成GIF的話,AVI-GIF是一個不錯的選擇。


【作者宣告】:本人是個初學者,只是感興趣,沒有其它目的。失誤之處敬請諸位大俠賜教!
【破解工具】:0llydbg_cn v1.09  TRW2000 V1.22
【過    程】:

 這個軟體的演算法比較簡單,但是斷點不好下,試了幾個常用的API都沒有中斷.只好用TRW2000跟到這裡,然後再用0llydbg繼續跟蹤.
 填好:使用者名稱 fxyang   ;  試驗碼  7894561230123456

跟蹤過程如下:


004ACDEB  MOV     EAX, DWORD PTR SS:[EBP-1C] ;  EAX <== SS:[12FC70]=DF0AD8,(ASCII "fxyang")
004ACDEE  LEA     EDX, DWORD PTR SS:[EBP-8]
004ACDF1  CALL    AVIGIF0.0040894C           ;  處理使用者名稱
004ACDF6  LEA     EDX, DWORD PTR SS:[EBP-20]
004ACDF9  MOV     EAX, DWORD PTR SS:[EBP-4]
004ACDFC  MOV     EAX, DWORD PTR DS:[EAX+390>
;  EAX <==DS:[DE2EEC]=00DF0000,(ASCII "tIH")
004ACE02  CALL    AVIGIF0.004382F4
004ACE07  MOV     EAX, DWORD PTR SS:[EBP-20] ;  EAX <== SS:[12FC6C]=00E053B4,("7894561230123456")
004ACE0A  LEA     EDX, DWORD PTR SS:[EBP-C]
004ACE0D  CALL    AVIGIF0.0040894C  ;  處理試驗碼的,因為沒有看到別的限制,不進了
004ACE12  CMP     DWORD PTR SS:[EBP-8], 0    ;  SS:[12FC84]=00DFBFC0,(ASCII"fxyang")
004ACE16  JE      AVIGIF0.004ACFC8
004ACE1C  LEA     EAX, DWORD PTR SS:[EBP-24]
004ACE1F  PUSH    EAX
004ACE20  MOV     ECX, DWORD PTR SS:[EBP-8]  ;  ECX<==SS:[12FC84]=00DFBFC0,(ASCII"fxyang")
004ACE23  MOV     EDX, 21C6918E              ;  EDX =21C6918E (賦值)
004ACE28  MOV     EAX, DWORD PTR SS:[EBP-4]
004ACE2B  CALL    AVIGIF0.004ACC08           ;  <==計算註冊碼的CALL***
004ACE30  MOV     EDX, DWORD PTR SS:[EBP-24]      
;  EDX <== SS:[EBP-24]=00E053F4,(ASCII "1074552978-1272341746-1843791096")得到的真註冊碼
004ACE33  MOV     EAX, DWORD PTR SS:[EBP-C]      
;  EAX <==SS:[12FC80]=00E053D4,(ASCII "7894561230123456")輸入的試驗碼
004ACE36  CALL    AVIGIF0.004048F0                ;  註冊碼的比較CALL
004ACE3B  JNZ     AVIGIF0.004ACF93                ;  關鍵跳轉,爆破點
004ACE41  LEA     EDX, DWORD PTR SS:[EBP-2C]
004ACE44  XOR     EAX, EAX


======================================

CALL    AVIGIF0.004ACC08           ;  <==計算註冊碼的CALL***

--------------------------------------

004ACC08  PUSH    EBP
004ACC09  MOV     EBP, ESP
004ACC0B  PUSH    0
004ACC0D  PUSH    0
004ACC0F  PUSH    0
004ACC11  PUSH    0
004ACC13  PUSH    0
004ACC15  PUSH    EBX                        ;  計算部分開始
004ACC16  PUSH    ESI
004ACC17  PUSH    EDI
004ACC18  MOV     [LOCAL.2], ECX     ;  SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC1B  MOV     [LOCAL.1], EDX     ;  SS:[12FC40]<==EDX =21C6918E (賦值)
004ACC1E  MOV     EAX, [LOCAL.2]  ;  EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC21  CALL    AVIGIF0.00404994
004ACC26  XOR     EAX, EAX
004ACC28  PUSH    EBP
004ACC29  PUSH    AVIGIF0.004ACD9A
004ACC2E  PUSH    DWORD PTR FS:[EAX]
004ACC31  MOV     DWORD PTR FS:[EAX], ESP
004ACC34  LEA     EAX, [LOCAL.3]
004ACC37  CALL    AVIGIF0.004044F4
004ACC3C  XOR     ESI, ESI
004ACC3E  CMP     [LOCAL.1], 0
004ACC42  JE      AVIGIF0.004ACD74
004ACC48  CMP     [LOCAL.2], 0
004ACC4C  JE      AVIGIF0.004ACD74
004ACC52  MOV     EAX, [LOCAL.2] ;  EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC55  CALL    AVIGIF0.004047AC
004ACC5A  MOV     EBX, EAX                   ;  EBX=6
004ACC5C  TEST    EBX, EBX
004ACC5E  JLE     SHORT AVIGIF0.004ACC86
004ACC60  MOV     EDI, 1                     ;  EDI=1 (賦值) 第一次計算
004ACC65 /MOV     EAX, [LOCAL.2] ;  EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC68 |CALL    AVIGIF0.004047AC          ;  取長度的CALL
004ACC6D |IMUL    [LOCAL.1]    ;  EAX=EAX*SS:[12FC40]=6*21C6918E=CAA76954
004ACC70 |ADD     ESI, EAX                  ;  ESI=ESI+EAX=0+CAA76954
004ACC72 |MOV     EAX, [LOCAL.2] ;  EAX<==SS:[12FC3C]=00DFBFC0,(ASCII"fxyang")
004ACC75 |MOVZX   EAX, BYTE PTR DS:[EAX+EDI>;  EAX<==DS:[DFBFC0]=66 ('f')
004ACC7A |IMUL    EAX, EAX, 2CE             ;  EAX=EAX*2CE=66*2CE=11E14
004ACC80 |ADD     ESI, EAX                  ;  ESI=ESI+EAX=CAA76954+11E14=CAA88768
004ACC82 |INC     EDI
004ACC83 |DEC     EBX                       ;  計算的次數
004ACC84 \JNZ     SHORT AVIGIF0.004ACC65    
;  //這段計算是把使用者名稱各位的hex值*2CE+使用者名稱長度平方*21C6918E,得到的值==>ESI
004ACC86  MOV     EAX, ESI                   ;  EAX<==ESI=BFF39F6E (上面的值)
004ACC88  CDQ
004ACC89  XOR     EAX, EDX                  
;  EAX=EAX XOR EDX=BFF39F6E XOR FFFFFFFF=400C6091
004ACC8B  SUB     EAX, EDX                  
;  EAX=EAX SUB EDX=400C6091-FFFFFFFF=400C6091+1=400C6092
004ACC8D  LEA     EDX, [LOCAL.3]
004ACC90  CALL    AVIGIF0.00408A00          
;  <==使用者名稱經過第一次計算後的值 MOD A 直到商=0 餘數往前排就得到一組新的值
004ACC95  LEA     EAX, [LOCAL.3]
004ACC98  PUSH    EAX
004ACC99  MOV     EAX, [LOCAL.3]  ;  EAX <==SS:[12FC38]=00DFE338,(ASCII "1074552978")
004ACC9C  CALL    AVIGIF0.004047AC
004ACCA1  MOV     EDX, EAX                   ;  EDX=A (1074552978)
004ACCA3  SUB     EDX, 0A
004ACCA6  MOV     ECX, 0A
004ACCAB  MOV     EAX, [LOCAL.3] ;  EAX <==SS:[12FC38]=00DFE338,(ASCII "1074552978")
004ACCAE  CALL    AVIGIF0.00404A04
004ACCB3  MOV     EAX, [LOCAL.2]  ;  EAX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCB6  CALL    AVIGIF0.004047AC           ;  取使用者名稱長度的CALL
004ACCBB  MOV     EBX, EAX
004ACCBD  TEST    EBX, EBX
004ACCBF  JLE     SHORT AVIGIF0.004ACCE8
004ACCC1  MOV     EDI, 1                     ;  第二次計算
004ACCC6  /MOV     EAX, [LOCAL.2]  ;  EAX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCC9  |CALL    AVIGIF0.004047AC          ;  取使用者名稱長度的CALL
004ACCCE  |MOV     EDX, [LOCAL.2]  ;  EDX<== SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACCD1  |MOVZX   EDX, BYTE PTR DS:[EDX+EDI>;  用EDI做指標來取使用者名稱的各位
004ACCD6  |IMUL    EDX, [LOCAL.1]  ;  EDX=EDX*SS:[12FC40]=66*21C6918E=751DFE94
004ACCDA  |IMUL    EDX, EDX, 7BC             ;  EDX=EDX*7BC=751DFE94*7BC=D3FD00B0
004ACCE0  |ADD     ESI, EDX    ;  ESI=ESI+EDX=BFF39F6E+D3FD00B0=93F0A01E
004ACCE2  |SUB     ESI, EAX                  ;  ESI=ESI-EAX=93F0A01E-6=93F0A018
004ACCE4  |INC     EDI                       ;  EDI++
004ACCE5  |DEC     EBX                       ;  EBX--
004ACCE6  \JNZ     SHORT AVIGIF0.004ACCC6    
;  //使用者名稱經過第一次計算後的值+使用者名稱各位hex值*21C6918E*7BC-使用者名稱長度的平方==>ESI
004ACCE8  PUSH    [LOCAL.3]                  ;  SS:[12FC38]=00DEE29O,(ASCII "1074552978")
004ACCEB  PUSH    AVIGIF0.004ACDB4
004ACCF0  MOV     EAX, ESI                   ;  EAX<==ESI=4BD664F2
004ACCF2  CDQ
004ACCF3  XOR     EAX, EDX
004ACCF5  SUB     EAX, EDX
004ACCF7  LEA     EDX, [LOCAL.4]
004ACCFA  CALL    AVIGIF0.00408A00          
;  再一次進行<==使用者名稱經過第2次計算後的值 MOD A 直到商=0 餘數往前排就得到一組新的值
004ACCFF  PUSH    [LOCAL.4]                  ;  SS:[12FC34]=00DFA848,(ASCII "1272341746")
004ACD02  LEA     EAX, [LOCAL.3]
004ACD05  MOV     EDX, 3
004ACD0A  CALL    AVIGIF0.0040486C     ;  這個call把上面二次的註冊碼用"-"連線起來
004ACD0F  MOV     EAX, [LOCAL.2] ;  EAX <==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD12  CALL    AVIGIF0.004047AC           ;  取使用者名稱長度的CALL
004ACD17  MOV     EBX, EAX                   ;  EAX=6
004ACD19  TEST    EBX, EBX
004ACD1B  JLE     SHORT AVIGIF0.004ACD4A
004ACD1D  MOV     EDI, 1                     ;  第三次計算
004ACD22  /MOV     EAX, [LOCAL.2]  ;  EAX <==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD25  |CALL    AVIGIF0.004047AC          ;  取使用者名稱長度的CALL
004ACD2A  |MOV     EDX, [LOCAL.2]  ;  EDX <==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD2D  |MOVZX   EDX, BYTE PTR DS:[EDX+EDI>;  用EDI做指標來取使用者名稱的各位
004ACD32  |IMUL    EDX                       ;  EAX=EAX*EDX=6*66=264
004ACD34  |IMUL    EAX, EAX, 4C6             ;  EAX=EAX*4C6=264*4C6=B6958
004ACD3A  |ADD     ESI, EAX        ;  ESI=ESI+EAX=4BD6642F(上次計算的值)+B6958
004ACD3C  |MOV     EAX, [LOCAL.2]            
;  EAX <==SS:[12FC3C]=00DFBFC0,(ASCII "fxyang")
004ACD3F  |CALL    AVIGIF0.004047AC          ;  取使用者名稱長度的CALL
004ACD44  |ADD     ESI, EAX                  ;  ESI=ESI+EAX=4BE1CE4A+6=4BE1CE50
004ACD46  |INC     EDI                       ;  EDI++
004ACD47  |DEC     EBX                       ;  EBX--
004ACD48  \JNZ     SHORT AVIGIF0.004ACD22    
;  //使用者名稱經過第2次計算後的值+使用者名稱各位hex值*使用者名稱的長度*4C6+使用者名稱長度的平方+21C6918E==>ESI
004ACD4A  ADD     ESI, [LOCAL.1]             ;  ESI=ESI+SS:[12FC40]=4C1F736A+21C6918E=6DE604F8
004ACD4D  PUSH    [LOCAL.3]                  
;  SS:[12FC38]=00DFA0CO,(ASCII "1074552978-1272341746")
004ACD50  PUSH    AVIGIF0.004ACDB4
004ACD55  MOV     EAX, ESI                   ;  EAX <==ESI=6DE604F8
004ACD57  CDQ
004ACD58  XOR     EAX, EDX
004ACD5A  SUB     EAX, EDX
004ACD5C  LEA     EDX, [LOCAL.5]
004ACD5F  CALL    AVIGIF0.00408A00          
;  再一次進行<==使用者名稱經過第3次計算後的值 MOD A 直到商=0 餘數往前排就得到一組新的值,
004ACD64  PUSH    [LOCAL.5]                  ;  SS:[12FC30]=00DFFFF0,(ASCII "1843791096")
004ACD67  LEA     EAX, [LOCAL.3]
004ACD6A  MOV     EDX, 3
004ACD6F  CALL    AVIGIF0.0040486C           ;  這個CALL 把得到的值用"-"連線起來
004ACD74  MOV     EAX, [ARG.1]               ;  //到此註冊碼的計算和連線已完成
004ACD77  MOV     EDX, [LOCAL.3]            
;  EDX=SS:[12FC38]=00EC53F4,(ASCII "1074552978-1272341746-1843791096")
004ACD7A  CALL    AVIGIF0.00404548
004ACD7F  XOR     EAX, EAX
004ACD81  POP     EDX
004ACD82  POP     ECX
004ACD83  POP     ECX
004ACD84  MOV     DWORD PTR FS:[EAX], EDX
004ACD87  PUSH    AVIGIF0.004ACDA1
004ACD8C  LEA     EAX, [LOCAL.5]
004ACD8F  MOV     EDX, 4
004ACD94  CALL    AVIGIF0.00404518
004ACD99  RETN
====================================================
CALL    AVIGIF0.00408A00
|
|
來到這裡:  註冊碼中間的處理過程

004094B2  MOV     ECX, 0A                    
;  ECX<==0A (賦值); Case 55 ('U') of switch 00409486
004094B7  LEA     ESI, DWORD PTR SS:[EBP-61]
;  註冊碼經過第一次計算後在計算並變換
004094BA  /XOR     EDX, EDX
004094BC  |DIV     ECX                       ;  EAX =EAX/ECX=400C6092/A   ==>EAX=667A341 EDX=8
004094BE  |ADD     DL, 30                    
;  DL=DL+30 ,<==就是把DL的值變成hex值得到一個數字
004094C1  |CMP     DL, 3A                    ;  比較值的範圍30-39
004094C4  |JB      SHORT AVIGIF0.004094C9
004094C6  |ADD     DL, 7
004094C9  |DEC     ESI
004094CA  |MOV     BYTE PTR DS:[ESI], DL    
;  得到的數字放到DS:[ESI]=DS:[12EB7A]處並往前排
004094CC  |OR      EAX, EAX                  ;  /DS:[ESI] (ASCII "1074552978")
004094CE  \JNZ     SHORT AVIGIF0.004094BA  
;  //使用者名稱經過第一次計算後的值 MOD A 直到商=0 餘數往前排就得到一組新的值
004094D0  LEA     ECX, DWORD PTR SS:[EBP-61]
004094D3  SUB     ECX, ESI                  
;  ESI=0012EB71,(ASCII "1074552978") ||(ASCII "1272341746")||(ASCII "1843791096"
004094D5  MOV     EDX, [LOCAL.9]             ;  EDX<==FFFFFFFFF
004094D8  CMP     EDX, 10
004094DB  JBE     SHORT AVIGIF0.004094DE
004094DD  RETN

*******************************************************************
註冊演算法的總結:由於試驗碼的檢查中沒有關於長度和形式的檢查,所以試驗碼隨便.
     
  註冊碼是由三段數字組成設為:  M-N-L
 
    1.M (第一組)的計算方法:
       1).把使用者名稱各位的hex值*2CE+使用者名稱長度平方*21C6918E 設為 B0   (長度取八位)
       2).把B0 XOR FFFFFFFF 然後+1  設為 C0
       3).C0 MOD A(常數) 直到商=0 餘數往前排就得到一組新的值=M
       
    2.N (第二組)的計算方法:
       1).第一次值C0+使用者名稱各位hex值*21C6918E*7BC-使用者名稱長度的平方 設為 B1  (長度取八位)
       2).B1 MOD A(常數) 直到商=0 餘數往前排就得到一組新的值=N

    3.L (第三組)的計算方法:
       1).第2次值B1+使用者名稱各位hex值*使用者名稱的長度*4C6+使用者名稱長度的平方+21C6918E 設為 B2 (長度取八位)
       2).B2 MOD A(常數) 直到商=0 餘數往前排就得到一組新的值=L


    如:
     使用者名稱  fxyang
     註冊碼  1074552978-1272341746-1843791096

                                                                fxyang
       
                                                                2003.3.5

相關文章