天天日记本 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