• 标 题:天天日记本 V2.0 Final
  • 作 者:fxyang
  • 时 间:2003/05/08 03:39pm 
  • 链 接:http://bbs.pediy.com

天天日记本 V2.0 Final

软件大小:  708 KB
软件语言:  简体中文
软件类别:  国产软件 / 免费版 / 信息管理
应用平台:  Win9x/NT/2000/XP
界面预览:  
加入时间:  2003-03-07 16:39:24
下载地址:  http://www.softreg.com.cn/download.asp?
           id=/2FE1540D-76C2-4405-B606-DFBAAAA7C837/

联 系 人:  tianyu717@163.net  
开 发 商:  http://tianyu717.yeah.net/

软件介绍:
   日记软件,具有强大的文字处理等多种功能,可以非常方便的整理每天的日记,
极大地节约了你的时间。让美好的东西在它繁华绝世的时候永留心头,历旧常新。
★具有最为详尽的文字处理功能;★优美的界面设置;★内置多用户功能,可以多
人使用;★直接、简洁的管理窗口;★独有"导入导出"功能;★支持Windows95/98
/NT/2000/ME/XP;★运行非常稳定,占用资源少,不需要任何外加的OCX或DLL。

【作者声明】:本人只是对Crack感兴趣,没有其它目的。
【破解工具】:Ollydbg1.09 中文版  pe-scan3.31


—————————————————————————————
【过    程】:
  用pe-scan检查分析程序是 aspack2.12 加的壳用pe-scan顺利的脱壳,然后用
Ollydbg 加载后填用户名:fxyang 登陆口令:不告诉你^_^.登陆后打开注册窗口
填注册码:147258369-789456123-123456789 ,下中断、确定,来到这里:

----------------------------------------------------------
|
004F5B00  PUSH    3E8                          
004F5B05  CALL    0040EB40                      
004F5B0A  LEA     EAX, [LOCAL.1]
004F5B0D  PUSH    EAX
004F5B0E  LEA     EDX, [LOCAL.6]
004F5B11  MOV     EAX, DWORD PTR DS:[EBX+308]
004F5B17  CALL    00476C60              <--取第一个注册框试验码                      
004F5B1C  MOV     EDX, [LOCAL.6]                

;  EDX<--00EF3EC0,(ASCII "147258369")--第一个注册框试验码

004F5B1F  LEA     ECX, [LOCAL.5]
004F5B22  MOV     EAX, EBX
004F5B24  CALL    004F6254              <--计算的地方
===>F7
---计算的地方---
|

004F625D  MOV     [LOCAL.2], ECX
004F6260  MOV     [LOCAL.1], EDX
004F6263  MOV     EAX, [LOCAL.1]       ;  EAX<--00EF3EC0,(ASCII "147258369")
004F6266  CALL    00404900                      
004F626B  XOR     EAX, EAX
004F626D  PUSH    EBP
004F626E  PUSH    4F630B
004F6273  PUSH    DWORD PTR FS:[EAX]
004F6276  MOV     DWORD PTR FS:[EAX], ESP
004F6279  MOV     EAX, [LOCAL.1]          ;  EAX<--00EF3EC0,(ASCII "147258369")
004F627C  CALL    00404710                ;  计算长度        
004F6281  MOV     [LOCAL.3], EAX          ;  EAX=9
004F6284  MOV     EAX, DWORD PTR DS:[54DDEC] ;  EAX<--004F5A80  ~`!1QqAaZz@2WwSsX……(表)
004F6289  CALL    00404710                        
004F628E  MOV     EDI, EAX                ;  EAX=5D
004F6290  MOV     ESI, 1
004F6295  CMP     ESI, [LOCAL.3]
004F6298  JG      SHORT 004F62EA                
004F629A  /MOV     EBX, 1
004F629F  |JMP     SHORT 004F62A2              
004F62A1  |/INC     EBX
004F62A2  | MOV     EAX, DWORD PTR DS:[54DDEC]  ;  EAX<--004F5A80  ~`!1QqAaZz@2WwS……(表)
004F62A7  ||MOV     AL, BYTE PTR DS:[EAX+EBX-1] ;  AL=DS:[EAX+EBX-1]=7E
004F62AB  ||MOV     EDX, [LOCAL.1]
004F62AE  ||CMP     AL, BYTE PTR DS:[EDX+ESI-1]
004F62B2  ||JE      SHORT 004F62B8            
004F62B4  ||CMP     EDI, EBX
004F62B6  |\JGE     SHORT 004F62A1        
004F62B8  |CMP     EDI, EBX                   ;  EBX=4
004F62BA  |JGE     SHORT 004F62CB          
004F62BC  |LEA     EAX, [LOCAL.1]
004F62BF  |CALL    00404968                    
004F62C4  |MOV     BYTE PTR DS:[EAX+ESI-1], 2A
004F62C9  |JMP     SHORT 004F62E4                
004F62CB  |LEA     EAX, [LOCAL.1]
004F62CE  |CALL    00404968                  
004F62D3  |MOV     EDX, EDI                    ;  EDX=EDI=5D
004F62D5  |SUB     EDX, EBX                    ;  EDX=5D-4=
004F62D7  |MOV     ECX, DWORD PTR DS:[54DDEC]  ;  ECX<--“ ~`!1QqAaZz@2WwSsX……”(表)
004F62DD  |MOV     DL, BYTE PTR DS:[ECX+EDX]   ;  DL=DS:[ECX+EDX]=7D
004F62E0  |MOV     BYTE PTR DS:[EAX+ESI-1], DL
004F62E4  |INC     ESI
004F62E5  |CMP     ESI, [LOCAL.3]
004F62E8  \JLE     SHORT 004F629A                  


;  <--把试验码的各位在表中检查位置,然后倒取值替换原来的值

-----------
|
内存中的表:

004F5A80  7E 60 21 31 51 71 41 61  ~`!1QqAa
004F5A88  5A 7A 40 32 57 77 53 73  Zz@2WwSs
004F5A90  58 78 23 33 45 65 44 64  Xx#3EeDd
004F5A98  43 63 24 34 52 72 46 66  Cc$4RrFf
004F5AA0  56 76 25 35 54 74 47 67  Vv%5TtGg
004F5AA8  42 62 5E 36 59 79 48 68  Bb^6YyHh
004F5AB0  4E 6E 26 37 55 75 4A 6A  Nn&7UuJj
004F5AB8  4D 6D 2A 38 49 69 4B 6B  Mm*8IiKk
004F5AC0  3C 2C 28 39 4F 6F 4C 6C  <,(9OoLl
004F5AC8  3E 2E 29 30 50 70 3A 3B  >.)0Pp:;
004F5AD0  3F 2F 5F 2D 7B 5B 22 2B  ?/_-{["+
004F5AD8  3D 7D 5D 7C 5C 00 00 00  =}]|\...


------------
|
004F62EA  MOV     EAX, [LOCAL.2]
004F62ED  MOV     EDX, [LOCAL.1]
004F62F0  CALL    004044A4                      
004F62F5  XOR     EAX, EAX
004F62F7  POP     EDX
004F62F8  POP     ECX
004F62F9  POP     ECX
004F62FA  MOV     DWORD PTR FS:[EAX], EDX
004F62FD  PUSH    4F6312
004F6302  LEA     EAX, [LOCAL.1]
004F6305  CALL    00404450                        
004F630A  RETN


------------------------------------
|
004F5B29  MOV     EDX, [LOCAL.5]
004F5B2C  LEA     ECX, [LOCAL.4]
004F5B2F  MOV     EAX, EBX
004F5B31  CALL    004F631C <---用上面得到的字符串重新计算
====>F7
----用上面得到的字符串重新计算----
|
004F631C  PUSH    EBP
004F631D  MOV     EBP, ESP
004F631F  ADD     ESP, -0C
004F6322  PUSH    EBX
004F6323  PUSH    ESI
004F6324  PUSH    EDI
004F6325  MOV     [LOCAL.2], ECX
004F6328  MOV     [LOCAL.1], EDX
004F632B  MOV     EAX, [LOCAL.1]          ;  EAX<--00EF0390  ASCII "}/.,mnbvc"
004F632E  CALL    00404900              
004F6333  XOR     EAX, EAX
004F6335  PUSH    EBP
004F6336  PUSH    4F63C8
004F633B  PUSH    DWORD PTR FS:[EAX]
004F633E  MOV     DWORD PTR FS:[EAX], ESP
004F6341  MOV     ESI, 1
004F6346  MOV     EAX, [LOCAL.1]
004F6349  CALL    00404710              
004F634E  MOV     EDI, EAX
004F6350  TEST    EDI, EDI
004F6352  JLE     SHORT 004F63A7          
004F6354  MOV     EBX, 1
004F6359  /MOV     EAX, [LOCAL.1]                ;  EAX<--00EF0390  ASCII "}/.,mnbvc"
004F635C  |MOV     AL, BYTE PTR DS:[EAX+EBX-1]   ;  取出第一位
004F6360  |AND     AL, 0F                        ;  
004F6362  |MOV     EDX, DWORD PTR DS:[54DDEC]    ;  004F5A80  ~`!1QqAaZz@2WwSsXx#3E……(表)
004F6368  |MOV     DL, BYTE PTR DS:[EDX+ESI-1]   ;  取出表的第一位
004F636C  |AND     DL, 0F
004F636F  |XOR     AL, DL                        ;  字符串的第一位与表的第一位 XOR
004F6371  |MOV     BYTE PTR SS:[EBP-9], AL
004F6374  |LEA     EAX, [LOCAL.1]
004F6377  |CALL    00404968                  
004F637C  |MOV     EDX, [LOCAL.1]                ;  EDX<--00EF0390  ASCII "}/.,mnbvc"
004F637F  |MOV     DL, BYTE PTR DS:[EDX+EBX-1]   ;  再次取出字符串的第一位
004F6383  |AND     DL, 0F0
004F6386  |MOV     CL, BYTE PTR SS:[EBP-9]       ;  上面做 XOR 后的值
004F6389  |ADD     DL, CL                        ;  第一位的值+上面做 XOR 后的值
004F638B  |MOV     BYTE PTR DS:[EAX+EBX-1], DL   ;  得到的新值存储起来
004F638F  |INC     ESI
004F6390  |MOV     EAX, DWORD PTR DS:[54DDEC]
004F6395  |CALL    00404710                    
004F639A  |CMP     ESI, EAX
004F639C  |JLE     SHORT 004F63A3            
004F639E  |MOV     ESI, 1
004F63A3  |INC     EBX
004F63A4  |DEC     EDI
004F63A5  \JNZ     SHORT 004F6359                

;  <--第二次计算时用上次的字符串重新计算

----内存中表是一样的-----

----------------------
|
004F63A7  MOV     EAX, [LOCAL.2]
004F63AA  MOV     EDX, [LOCAL.1]       ;  ASCII "s,c.lw/oi"(第二次的值)
004F63AD  CALL    004044A4                      
004F63B2  XOR     EAX, EAX
004F63B4  POP     EDX
004F63B5  POP     ECX
004F63B6  POP     ECX
004F63B7  MOV     DWORD PTR FS:[EAX], EDX
004F63BA  PUSH    4F63CF
004F63BF  LEA     EAX, [LOCAL.1]
004F63C2  CALL    00404450                  
004F63C7  RETN

-----------------------------------------
|
004F5B36  MOV     EAX, [LOCAL.4]       ;  EAX<--00EF1C5C  ASCII "s,c.lw/oi"
004F5B39  MOV     ECX, 3
004F5B3E  MOV     EDX, 4
004F5B43  CALL    00404970             ;  取上面的字符串第三位开始的三个字符
004F5B48  LEA     EAX, [LOCAL.2]
004F5B4B  PUSH    EAX
004F5B4C  LEA     EDX, [LOCAL.9]
004F5B4F  MOV     EAX, DWORD PTR DS:[EBX+314]
004F5B55  CALL    00476C60               <--取第二个注册框试验码
004F5B5A  MOV     EDX, [LOCAL.9]         ;  EDX<--00EEA390,(ASCII "789456123")
004F5B5D  LEA     ECX, [LOCAL.8]
004F5B60  MOV     EAX, EBX
004F5B62  CALL    004F6254               ; 同上面一样的计算                
004F5B67  MOV     EDX, [LOCAL.8]
004F5B6A  LEA     ECX, [LOCAL.7]
004F5B6D  MOV     EAX, EBX
004F5B6F  CALL    004F631C               ;  同上面一样的计算                    
004F5B74  MOV     EAX, [LOCAL.7]
004F5B77  MOV     ECX, 3
004F5B7C  MOV     EDX, 4
004F5B81  CALL    00404970                            
004F5B86  LEA     EAX, [LOCAL.3]
004F5B89  PUSH    EAX
004F5B8A  LEA     EDX, [LOCAL.12]
004F5B8D  MOV     EAX, DWORD PTR DS:[EBX+318]
004F5B93  CALL    00476C60               <--取第三个注册框试验码      
004F5B98  MOV     EDX, [LOCAL.12]        ;  EDX<--00EF8C8C,(ASCII "123456789")
004F5B9B  LEA     ECX, [LOCAL.11]
004F5B9E  MOV     EAX, EBX
004F5BA0  CALL    004F6254               ;  同上面一样的计算
004F5BA5  MOV     EDX, [LOCAL.11]        ;  EDX<--00EF0390  ASCII "}/.,mnbvc"
004F5BA8  LEA     ECX, [LOCAL.10]
004F5BAB  MOV     EAX, EBX
004F5BAD  CALL    004F631C               ;   同上面一样的计算              
004F5BB2  MOV     EAX, [LOCAL.10]
004F5BB5  MOV     ECX, 9
004F5BBA  MOV     EDX, 3
004F5BBF  CALL    00404970               ;  取三位以后的值
004F5BC4  PUSH    [LOCAL.1]                      

;  SS:[0012F704]=00EF10B4,(ASCII ".lw")<--第一组的中间三位

004F5BC7  PUSH    [LOCAL.2]                      

;  SS:[0012F700]=00EF20E0,(ASCII "-lo")<--第2组的中间三位

004F5BCA  PUSH    [LOCAL.3]                      

;  SS:[0012F6FC]=00EF22F8,(ASCII "/-locwi")<--第三组的三位以后值

004F5BCD  LEA     EAX, [LOCAL.13]
004F5BD0  MOV     EDX, 3
004F5BD5  CALL    004047D0                      

;  <--把上面的三个参数连接00EFB008  ASCII ".lw-lo/-locwi"

004F5BDA  MOV     EDX, [LOCAL.13]                

;  EDX<--00EFBOO8,(ASCII ".lw-lo/-locwi")

004F5BDD  MOV     EAX, DWORD PTR DS:[EBX+320]    

;  EAX<--00EF1EBC,(ASCII "619450196")

004F5BE3  CALL    0040485C         ;  <--这里进行比较
====>F7
--这里进行比较---
|
0040485C  PUSH    EBX
0040485D  PUSH    ESI
0040485E  PUSH    EDI
0040485F  MOV     ESI, EAX            ;  EAX<--00EF1EBC,(ASCII "619450196")
00404861  MOV     EDI, EDX            ;  EDX<--00EFB008  ASCII ".lw-lo/-locwi"
00404863  CMP     EAX, EDX
00404865  JE      004048FA        
0040486B  TEST    ESI, ESI
0040486D  JE      SHORT 004048D7    
0040486F  TEST    EDI, EDI
00404871  JE      SHORT 004048DE            
00404873  MOV     EAX, DWORD PTR DS:[ESI-4]
00404876  MOV     EDX, DWORD PTR DS:[EDI-4]
00404879  SUB     EAX, EDX
0040487B  JA      SHORT 0040487F          
0040487D  ADD     EDX, EAX
0040487F  PUSH    EDX
00404880  SHR     EDX, 2
00404883  JE      SHORT 004048AB          
00404885  /MOV     ECX, DWORD PTR DS:[ESI]
00404887  |MOV     EBX, DWORD PTR DS:[EDI]
00404889  |CMP     ECX, EBX
0040488B  |JNZ     SHORT 004048E5          
0040488D  |DEC     EDX
0040488E  |JE      SHORT 004048A5            
00404890  |MOV     ECX, DWORD PTR DS:[ESI+4]
00404893  |MOV     EBX, DWORD PTR DS:[EDI+4]
00404896  |CMP     ECX, EBX
00404898  |JNZ     SHORT 004048E5          
0040489A  |ADD     ESI, 8
0040489D  |ADD     EDI, 8
004048A0  |DEC     EDX
004048A1  \JNZ     SHORT 00404885          
004048A3  JMP     SHORT 004048AB        
004048A5  ADD     ESI, 4
004048A8  ADD     EDI, 4
004048AB  POP     EDX
004048AC  AND     EDX, 3
004048AF  JE      SHORT 004048D3          
004048B1  MOV     ECX, DWORD PTR DS:[ESI]
004048B3  MOV     EBX, DWORD PTR DS:[EDI]
004048B5  CMP     CL, BL
004048B7  JNZ     SHORT 004048FA    
004048B9  DEC     EDX
004048BA  JE      SHORT 004048D3    
004048BC  CMP     CH, BH
004048BE  JNZ     SHORT 004048FA        
004048C0  DEC     EDX
004048C1  JE      SHORT 004048D3          
004048C3  AND     EBX, 0FF0000
004048C9  AND     ECX, 0FF0000
004048CF  CMP     ECX, EBX
004048D1  JNZ     SHORT 004048FA    
004048D3  ADD     EAX, EAX
004048D5  JMP     SHORT 004048FA      
004048D7  MOV     EDX, DWORD PTR DS:[EDI-4]
004048DA  SUB     EAX, EDX
004048DC  JMP     SHORT 004048FA            
004048DE  MOV     EAX, DWORD PTR DS:[ESI-4]
004048E1  SUB     EAX, EDX
004048E3  JMP     SHORT 004048FA    
004048E5  POP     EDX
004048E6  CMP     CL, BL
004048E8  JNZ     SHORT 004048FA          
004048EA  CMP     CH, BH
004048EC  JNZ     SHORT 004048FA        
004048EE  SHR     ECX, 10
004048F1  SHR     EBX, 10
004048F4  CMP     CL, BL
004048F6  JNZ     SHORT 004048FA      
004048F8  CMP     CH, BH
004048FA  POP     EDI
004048FB  POP     ESI
004048FC  POP     EBX
004048FD  RETN
------------------------------------
|
004F5BE8  JNZ     004F5CA1         ;  <--关键跳
004F5BEE  MOV     EAX, DWORD PTR DS:[EBX+31C]


到这里好像注册码的算法跟踪出来了,但问题也出来了。大家看这里:

004F5BDD  MOV     EAX, DWORD PTR DS:[EBX+320]    

;  EAX<--00EF1EBC,(ASCII "619450196")

上面这个EAX的用于比较的值没有分析是怎么算出来的,是不是固定的呢
可以做个试验,改变一下日记的用户名,这个值就不同了,这说明这个值
与日记的用户名相关。好,知道了这些就要继续追。

分析一下:在填注册信息按注册键后就用调试器跟踪了这个过程,所以这
个值的计算一定在填注册信息前完成的。那么什么时候我们填了用户名呢
就在日记登陆时要求我们填用户名,这样分析后让我们跟踪填用户名后的
过程可能就知道这个值的由来了。

基于以上分析,重新运行程序。在日记登陆时填好用户名和登陆密码后下
中断,果然被中断在这里:
--------------------------------
|
004F5D1C  PUSH    EBP
004F5D1D  MOV     EBP, ESP
004F5D1F  MOV     ECX, 5
004F5D24  /PUSH    0
004F5D26  |PUSH    0
004F5D28  |DEC     ECX
004F5D29  \JNZ     SHORT 004F5D24          
004F5D2B  PUSH    ECX
004F5D2C  PUSH    EBX
004F5D2D  PUSH    ESI
004F5D2E  MOV     EBX, EAX
004F5D30  XOR     EAX, EAX
004F5D32  PUSH    EBP
004F5D33  PUSH    4F60A1
004F5D38  PUSH    DWORD PTR FS:[EAX]
004F5D3B  MOV     DWORD PTR FS:[EAX], ESP
004F5D3E  XOR     EAX, EAX
004F5D40  MOV     [LOCAL.2], EAX
004F5D43  MOV     EAX, DWORD PTR DS:[55AA10]
004F5D48  MOV     EAX, DWORD PTR DS:[EAX]    ;  EAX<--00EF6CC4,(ASCII "fxyang.mdb")
004F5D4A  CALL    00404710                
004F5D4F  TEST    EAX, EAX                   ;  EAX=A
004F5D51  JLE     SHORT 004F5D7A        
004F5D53  MOV     EDX, 1
004F5D58  /MOV     ESI, DWORD PTR DS:[55AA10]
004F5D5E  |MOV     ESI, DWORD PTR DS:[ESI]
004F5D60  |MOVZX   ESI, BYTE PTR DS:[ESI+EDX-1];  ESI=DS:[ESI+EDX-1]=66 ('f')
004F5D65  |MOV     ECX, DWORD PTR DS:[EBX+30C]
004F5D6B  |MOV     ECX, DWORD PTR DS:[ECX+C]   ;  ECX=DS:[00EF9150]=01E6EB04
004F5D6E  |ADD     ESI, ECX                    ;  ECX=DS:[00EF9150]=01E6EB04+66=01E6EB6A
004F5D70  |IMUL    ESI, ECX                    ;  ESI=01E6EB6A*01E6B04=ECF1FBA8
004F5D73  |ADD     [LOCAL.2], ESI              <--[0012FC7C]=26D2FA58(上面相加的值)
004F5D76  |INC     EDX
004F5D77  |DEC     EAX
004F5D78  \JNZ     SHORT 004F5D58                  

;  <--把字符串“fxyang.mdb”的各位加1E6B04后再×1E6B04,然后把各个值相加

004F5D7A  MOV     EAX, DWORD PTR DS:[EBX+30C]
004F5D80  PUSH    DWORD PTR DS:[EAX+C]        ;  DS:[00EF9150]=01E6EB04
004F5D83  MOV     EAX, [LOCAL.2]              ;  EAX<--[0012FC7C]=26D2FA58(上面相加的值)
004F5D86  POP     EDX                         ;  EDX<--DS:[00EF9150]=01E6EB04
004F5D87  SUB     EAX, EDX                    ;  EAX=26D2FA58(上面相加的值)-1E6EB04=24EC0F54
004F5D89  LEA     EDX, [LOCAL.3]
004F5D8C  CALL    00409330                    <--这里把上面的16进制值变换成10进制值
004F5D91  MOV     EDX, [LOCAL.3]              ;  EDX<--00EFA7BC  ASCII "619450196"
004F5D94  LEA     EAX, DWORD PTR DS:[EBX+320] ;  中间值计算完成
004F5D9A  CALL    004044A4                    
004F5D9F  PUSH    4F60B8                    
004F5DA4  MOV     EAX, DWORD PTR DS:[55AB68]  ;  EAX=0055BEE8
004F5DA9  PUSH    DWORD PTR DS:[EAX]
004F5DAB  MOV     EAX, DWORD PTR DS:[55AA10]  ;  EAX=0055BEEC
004F5DB0  PUSH    DWORD PTR DS:[EAX]          ;  DS:[0055BEEC]=00EF6CC4,(ASCII "fxyang.mdb")
004F5DB2  PUSH    4F60F0                      ;  ASCII ";Jet OLEDB:Database Password="
004F5DB7  PUSH    4F6118                      ;  ASCII "muae0115"
004F5DBC  PUSH    4F612C                      ;  ASCII ";Persist Security Info=False"
004F5DC1  LEA     EAX, [LOCAL.5]
004F5DC4  MOV     EDX, 6
004F5DC9  CALL    004047D0                    ;  <--把上面的各个字符串连接
004F5DCE  MOV     EDX, [LOCAL.5]                  

;  ASCII "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\tian0336\fxyang.mdb;
Jet OLEDB:Database Password=muae0115;Persist Security Info=False"

004F5DD1  LEA     EAX, [LOCAL.4]
004F5DD4  CALL    00404CD8                      
004F5DD9  MOV     EDX, [LOCAL.4]                  

;  ASCII "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\temp\tian0336\fxyang.mdb;Jet
OLEDB:Database Password=muae0115;Persist Security Info=False"

004F5DDC  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5DE2  CALL    004C9140                  
004F5DE7  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5DED  CALL    004CB27C                
004F5DF2  MOV     EDX, 4F6154                 ;  ASCII "SELECT * FROM pass"
004F5DF7  MOV     ECX, DWORD PTR DS:[EAX]
004F5DF9  CALL    DWORD PTR DS:[ECX+2C]
004F5DFC  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5E02  CALL    004B2C2C                
004F5E07  MOV     EDX, 4F6170                 ;  ASCII "REG"
004F5E0C  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5E12  CALL    004B3DBC                    
004F5E17  TEST    EAX, EAX
004F5E19  JNZ     SHORT 004F5E58          
004F5E1B  MOV     ESI, DWORD PTR DS:[EBX+31C]
004F5E21  MOV     EAX, ESI
004F5E23  CALL    004B2C38                
004F5E28  MOV     EAX, ESI
004F5E2A  CALL    004CB27C                    
004F5E2F  MOV     EDX, 4F617C                    

;  ASCII "alter table pass add column REG Text(50)"

004F5E34  MOV     ECX, DWORD PTR DS:[EAX]
004F5E36  CALL    DWORD PTR DS:[ECX+2C]
004F5E39  MOV     EAX, ESI
004F5E3B  CALL    004CB1A4              
004F5E40  MOV     EAX, ESI
004F5E42  CALL    004CB27C                    
004F5E47  MOV     EDX, 4F6154                ;  ASCII "SELECT * FROM pass"
004F5E4C  MOV     ECX, DWORD PTR DS:[EAX]
004F5E4E  CALL    DWORD PTR DS:[ECX+2C]
004F5E51  MOV     EAX, ESI
004F5E53  CALL    004B2C2C                
004F5E58  MOV     EDX, 4F61B0                ;  ASCII "Reg"
004F5E5D  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5E63  CALL    004B3D34                      
004F5E68  LEA     EDX, [LOCAL.6]
004F5E6B  MOV     ECX, DWORD PTR DS:[EAX]
004F5E6D  CALL    DWORD PTR DS:[ECX+60]
004F5E70  CMP     [LOCAL.6], 0
004F5E74  JNZ     SHORT 004F5EBB          
004F5E76  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5E7C  CALL    004B54F4            
004F5E81  LEA     ECX, [LOCAL.7]
004F5E84  MOV     EDX, 4F61BC                 ;  ASCII "60"
004F5E89  MOV     EAX, EBX
004F5E8B  CALL    004F631C                  
004F5E90  MOV     EAX, [LOCAL.7]
004F5E93  PUSH    EAX
004F5E94  MOV     EDX, 4F61B0                 ;  ASCII "Reg"
004F5E99  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5E9F  CALL    004B3D34                    
004F5EA4  POP     EDX
004F5EA5  MOV     ECX, DWORD PTR DS:[EAX]
004F5EA7  CALL    DWORD PTR DS:[ECX+B0]
004F5EAD  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5EB3  MOV     EDX, DWORD PTR DS:[EAX]
004F5EB5  CALL    DWORD PTR DS:[EDX+24C]
004F5EBB  MOV     EDX, 4F61B0                  ;  ASCII "Reg"
004F5EC0  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5EC6  CALL    004B3D34                      
004F5ECB  LEA     EDX, [LOCAL.8]
004F5ECE  MOV     ECX, DWORD PTR DS:[EAX]
004F5ED0  CALL    DWORD PTR DS:[ECX+60]
004F5ED3  MOV     EDX, [LOCAL.8]
004F5ED6  LEA     ECX, [LOCAL.1]
004F5ED9  MOV     EAX, EBX
004F5EDB  CALL    004F631C                    ;  以上是取数据库中的注册标志位信息
004F5EE0  MOV     EAX, DWORD PTR DS:[55A5FC]
004F5EE5  CMP     BYTE PTR DS:[EAX], 0        ;  比较标志位值
004F5EE8  JNZ     004F6046                    ;  <--关键跳,跳
004F5EEE  MOV     EAX, DWORD PTR DS:[EBX+320] ;  EAX<-- 00EFA4F4  ASCII "619450196"
004F5EF4  MOV     EDX, [LOCAL.1]
004F5EF7  CALL    0040485C                
004F5EFC  JE      004F5FED              
004F5F02  MOV     EAX, [LOCAL.1]
004F5F05  CALL    0040946C                  
004F5F0A  DEC     EAX
004F5F0B  JL      SHORT 004F5F1A          
004F5F0D  MOV     EAX, [LOCAL.1]
004F5F10  CALL    0040946C              
004F5F15  CMP     EAX, 3C
004F5F18  JLE     SHORT 004F5F7C            
004F5F1A  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F1F  MOV     EAX, DWORD PTR DS:[EAX]
004F5F21  MOV     EAX, DWORD PTR DS:[EAX+65C]
004F5F27  MOV     DWORD PTR DS:[EAX+C], 209
004F5F2E  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F33  MOV     EAX, DWORD PTR DS:[EAX]
004F5F35  MOV     EAX, DWORD PTR DS:[EAX+4A0]
004F5F3B  XOR     EDX, EDX
004F5F3D  MOV     DWORD PTR DS:[EAX+C], EDX
004F5F40  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F45  MOV     EAX, DWORD PTR DS:[EAX]
004F5F47  MOV     EAX, DWORD PTR DS:[EAX+4C4]
004F5F4D  XOR     EDX, EDX
004F5F4F  MOV     ECX, DWORD PTR DS:[EAX]
004F5F51  CALL    DWORD PTR DS:[ECX+64]
004F5F54  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F59  MOV     EAX, DWORD PTR DS:[EAX]
004F5F5B  MOV     EAX, DWORD PTR DS:[EAX+578]
004F5F61  XOR     EDX, EDX
004F5F63  CALL    00489580                      
004F5F68  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F6D  MOV     EAX, DWORD PTR DS:[EAX]
004F5F6F  MOV     EAX, DWORD PTR DS:[EAX+654]
004F5F75  MOV     DL, 1
004F5F77  CALL    0046AC60                      
004F5F7C  MOV     EAX, [LOCAL.1]           ;  EAX<--00EFAB44,(ASCII "53")
004F5F7F  CALL    0040946C                      
004F5F84  DEC     EAX
004F5F85  LEA     EDX, [LOCAL.9]
004F5F88  CALL    00409330                
004F5F8D  MOV     EDX, [LOCAL.9]
004F5F90  LEA     EAX, [LOCAL.1]
004F5F93  CALL    004044E8                    
004F5F98  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5F9D  MOV     EAX, DWORD PTR DS:[EAX]
004F5F9F  MOV     EAX, DWORD PTR DS:[EAX+4F4]
004F5FA5  XOR     EDX, EDX
004F5FA7  MOV     DWORD PTR DS:[EAX+C], EDX
004F5FAA  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5FB0  CALL    004B54F4                    
004F5FB5  LEA     ECX, [LOCAL.10]
004F5FB8  MOV     EDX, [LOCAL.1]
004F5FBB  MOV     EAX, EBX
004F5FBD  CALL    004F631C                        
004F5FC2  MOV     EAX, [LOCAL.10]
004F5FC5  PUSH    EAX
004F5FC6  MOV     EDX, 4F61B0                   ;  ASCII "Reg"
004F5FCB  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5FD1  CALL    004B3D34                    
004F5FD6  POP     EDX
004F5FD7  MOV     ECX, DWORD PTR DS:[EAX]
004F5FD9  CALL    DWORD PTR DS:[ECX+B0]
004F5FDF  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F5FE5  MOV     EDX, DWORD PTR DS:[EAX]
004F5FE7  CALL    DWORD PTR DS:[EDX+24C]
004F5FED  MOV     EAX, DWORD PTR DS:[55A5CC]
004F5FF2  MOV     EAX, DWORD PTR DS:[EAX]
004F5FF4  MOV     EAX, DWORD PTR DS:[EAX+62C]
004F5FFA >MOV     DWORD PTR DS:[EAX+C], 2E5
004F6001  MOV     EAX, [LOCAL.1]
004F6004  CALL    0040946C                      
004F6009  MOV     EDX, DWORD PTR DS:[55A5CC]    
004F600F  MOV     EDX, DWORD PTR DS:[EDX]
004F6011  MOV     EDX, DWORD PTR DS:[EDX+390]
004F6017  MOV     DWORD PTR DS:[EDX+C], EAX
004F601A  MOV     EAX, [LOCAL.1]
004F601D  CALL    0040946C                    
004F6022  INC     EAX
004F6023  MOV     EDX, DWORD PTR DS:[55A5CC]    
004F6029  MOV     EDX, DWORD PTR DS:[EDX]
004F602B  MOV     EDX, DWORD PTR DS:[EDX+668]
004F6031  MOV     DWORD PTR DS:[EDX+C], EAX
004F6034  MOV     EAX, DWORD PTR DS:[EBX+31C]
004F603A  CALL    004B2C38                    
004F603F  MOV     EAX, EBX
004F6041  CALL    00494778                    ;  这段是读数据库中运行的次数  
004F6046  PUSH    4F61C8                      ;  ASCII "剩余"
004F604B  PUSH    [LOCAL.1]                        
004F604E  PUSH    4F61D8
004F6053  LEA     EAX, [LOCAL.11]
004F6056  MOV     EDX, 3
004F605B  CALL    004047D0                    
004F6060  MOV     EDX, [LOCAL.11]
004F6063  MOV     EAX, DWORD PTR DS:[EBX+308]
004F6069  CALL    00476C90                  
004F606E  XOR     EAX, EAX
004F6070  POP     EDX
004F6071  POP     ECX
004F6072  POP     ECX
004F6073  MOV     DWORD PTR FS:[EAX], EDX
004F6076  PUSH    4F60A8
004F607B  LEA     EAX, [LOCAL.11]
004F607E  MOV     EDX, 7
004F6083  CALL    00404474                      
004F6088  LEA     EAX, [LOCAL.4]
004F608B  CALL    00404B5C                      
004F6090  LEA     EAX, [LOCAL.3]
004F6093  CALL    00404450                  
004F6098  LEA     EAX, [LOCAL.1]
004F609B  CALL    00404450                      
004F60A0  RETN

====================================================
到这里整个的算法跟踪才算完成,总结一下。

注册码的计算分二个部分进行,第一次用用户名的数据库名计算出来一个中间值
第二次把输入的试验码做变换和计算,然后取出一部分值和第一次计算的中间值
比较,相同就注册成功。

                                           by  fxyang[OCN][BCG]

                                                 2003.5.8