• 标 题: AVI-GIF V1.0.9 汉化版的算法跟踪
  • 作 者:fxyang
  • 时 间:2003/03/06 09:39pm
  • 链 接:http://bbs.pediy.com

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