• 标 题:书香门第 V1.23 Build 1638
  • 作 者:fxyang
  • 时 间:2003/03/15 09:49am 
  • 链 接:http://bbs.pediy.com

书香门第 V1.23 Build 1638

软件大小:  665 KB
软件语言:  简体中文
软件类别:  国产软件 / 共享版 / 电子阅读
应用平台:  Win9x/NT/2000/XP
界面预览:  
加入时间:  2003-03-13 08:28:43
下载次数:  7419
推荐等级:  

联 系 人:  gentlebreeze@vip.163.com  
开 发 商:  http://www.gentle-breeze.com

软件介绍:
   《书香门第》是一款适合于真正读书迷的电子小说、文本阅读软件,它外表并不花哨,但对于长时间、大量阅读的读书迷,
却最舒适、体贴、细致,因为它具有十二个鲜明特点:1. 多达27种各种质感的窗口背景、页面背景可供选择,总共超过700种
背景组合,为读书迷提供最高舒适度和最大程度的视力保护。2. 强大、智能化的自动排版功能,并可以随意设定字体大小、颜
色、行距、标题行。3. 极其高速的排版速度:目前主流机器上排版速度超过一万页/秒,所以通常你根本无法感觉到排版过程。
4. 高速的DirectDraw图形引擎,翻页寻迹流畅自如。5.附带的html转换、合成工具能够迅速依次将一批html文件转换且合并
为一个大的文本文件,方便阅读。6.宽广的平台适用性:从486/win95到最新P4/XP都能从容应对。7.体贴的左手键操作,使你
从此摆脱长期右手操作鼠标、键盘带来的疲劳。8.与页面字数成正比的自动翻页间隔,自然优于呆板的固定翻页间隔。9.可以
选择使用窗口模式(寻迹方便)或全屏幕模式(阅读效果更好)。10.全书遍历/测试功能,保护你的计算机,节约能源。
11.搜索功能方便读者在书中查找。12. 具有强于word和IE的汉字乱码纠错功能。

【作者声明】:本人是个初学者,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
            本人感谢软件作者,请见谅了.
【破解工具】:0llydbg v1.09cn  W32Dasm8.93黄金版

—————————————————————————————————
【过    程】:


W32Dasm8.93黄金版反汇编,查找关键提示。

0040373C E81A6C0100              call 0041A35B
:00403741 83F818                  cmp eax, 00000018
                                 ====>注册码是否24位

:00403744 0F85C0000000            jne 0040380A
                               
:0040374A A1280E4500              mov eax, dword ptr [00450E28]
:0040374F 83F804                  cmp eax, 00000004
                                ====>E-mail不能少于4位

:00403752 0F8CB2000000            jl 0040380A
                               

:00403758 8364241000              and dword ptr [esp+10], 00000000
:0040375D EB05                    jmp 00403764

* Reference To: USER32.SendMessageA, Ord:0214h
                                 |
:004037B0 FF15F4444200            Call dword ptr [004244F4]
:004037B6 80BEC000000000          cmp byte ptr [esi+000000C0], 00
:004037BD 742F                    je 004037EE
                               


* Possible StringData Ref from Data Obj ->"  祝贺你       <=== 关键词,在上面中断
                                       ->" 你已经成为了《书香门第》注册用户!"
                                 
:004037BF 6898C64200              push 0042C698


以下是用0llydbg v1.09cn跟踪的:
填e_mail : fxyang@163.com
 试验码 : 789456123012345678901234

00403712  PUSH    EDI
00403713  MOV     EDI, zbook.00452268          ;  ASCII "fxyang@163.com"
00403718  LEA     EBP, DWORD PTR DS:[ESI+13C]
0040371E  PUSH    20
00403720  PUSH    EDI                          ;  EDI=00452268 ,ASCII "fxyang@163.com"
00403721  MOV     ECX, EBP
00403723  CALL    zbook.0041A35B
00403728  LEA     EBX, DWORD PTR DS:[ESI+100]
0040372E  PUSH    20
00403730  PUSH    zbook.00451A48               ;  ASCII "789456123012345678901234"
00403735  MOV     ECX, EBX
00403737  MOV     DWORD PTR DS:[450E28], EAX
0040373C  CALL    zbook.0041A35B
00403741  CMP     EAX, 18
00403744  JNZ     zbook.0040380A
0040374A  MOV     EAX, DWORD PTR DS:[450E28]
0040374F  CMP     EAX, 4
00403752  JL      zbook.0040380A
00403758  AND     DWORD PTR SS:[ESP+10], 0
0040375D  JMP     SHORT zbook.00403764
0040375F  MOV     EAX, DWORD PTR DS:[450E28]
00403764  PUSH    EAX                          ;  EAX=E
00403765  IMUL    EAX, DWORD PTR SS:[ESP+14]   ;  EAX=EAX*SS:[12F454]=E*0=0||EAX*SS:[12F454]=E*01=E
0040376A  ADD     EAX, zbook.00451A68          ;  ASCII "fxyang@163.comfxyang@163.com.......
0040376F  PUSH    EDI                          ;  EDI=00452268 ,ASCII "fxyang@163.com"
00403770  PUSH    EAX                          ;  EAX=00451A76
00403771  CALL    zbook.004083E0               ;  把e_mail传送到451A68开始的地址中一共40h组
00403776  ESP, 0C
00403779  INC     DWORD PTR SS:[ESP+10]        ;  SS:[12F454]=0 ++
0040377D  CMP     DWORD PTR SS:[ESP+10], 40    ;  SS:[12F454]=1 ++
00403782  JL      SHORT zbook.0040375F         ;  把e_mail传送到451A68开始的地址中一共40h组连接起来
00403784  MOV     EDI, zbook.00451248          ;  ASCII "789456123012345678901234"
00403789  PUSH    20
0040378B  PUSH    zbook.00451A48               ;  ASCII "789456123012345678901234"
00403790  PUSH    EDI
00403791  CALL    zbook.004083E0
00403796  ADD     EDI, 20
00403799  ADD     ESP, 0C
0040379C  CMP     EDI, zbook.00451A48          ;  ASCII "789456123012345678901234"
004037A2  JL      SHORT zbook.00403789         ;  把试验码传送到451248-451A48开始的内存中
004037A4  XOR     EDI, EDI
004037A6  PUSH    EDI                                   ; /lParam => 0
004037A7  PUSH    EDI                                   ; |wParam => 0
004037A8  PUSH    1501                                  ; |Message = MSG(1501)
004037AD  PUSH    DWORD PTR DS:[ESI+1C]                 ; ||hWnd = B025C  
004037B0  CALL    DWORD PTR DS:[<&USER32.SendMessageA>] ; \这个api是转移到计算注册码地址的call
004037B6  CMP     BYTE PTR DS:[ESI+C0], 0               ;  DS:[ESI+C0]=DS:[12FAF4]注册标记
004037BD  JE      SHORT zbook.004037EE                  ;  这里跳到错误的提示框
004037BF  PUSH    zbook.0042C698                        ;  到这里就成功
004037C4  MOV     DWORD PTR DS:[452A68], EDI
004037CA  CALL    zbook.00405666  

//因为上面的跳转是通过API的方式,所以太难找到核心

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

CALL    DWORD PTR DS:[<&USER32.SendMessageA>] ; \这个api是转移到计算注册码地址的call
|
|
77DF1D07  CALL DWORD PTR SS:[EBP+8]
|
CALL DWORD PTR SS:[EBP+8]
|

00403860  MOV     EBP, ESP
00403862  SUB     ESP, 100
00403868  PUSH    ESI
00403869  PUSH    20
0040386B  CALL    zbook.004088FB
00403870  PUSH    40
00403872  MOV     ESI, zbook.00451148
00403877  CDQ
00403878  POP     ECX                  ;  ECX=40
00403879  IDIV    ECX                  ;  EAX=13CA  IDIV ECX=40  ==>EAX=4F   EDX=A
0040387B  SHL     EDX, 5               ;  EDX=A SHL 5=140
0040387E  ADD     EDX, zbook.00451248  ;  EDX=EDX+451248( ASCII "789456123012345678901234")=
00403884  PUSH    EDX                  ;  EDX=zbook.00451388,ASCII "789456123012345678901234")
00403885  PUSH    ESI                  ;  //经过上面的漫长的转折终于来到试验码的地址
00403886  CALL    zbook.004083E0       ;  00451148 <==ASCII "789456123012345678901234")
0040388B  PUSH    0FF
00403890  LEA     EAX, [LOCAL.64]
00403896  PUSH    0
00403898  PUSH    EAX
00403899  CALL    zbook.004087A0
0040389E  ADD     ESP, 18
004038A1  PUSH    DWORD PTR DS:[450E28] ;  DS:[450E28]=0E (e_mail的长度)
004038A7  CALL    zbook.004088FB        ;  这个CALL是取EAX=69F9 (常数)
004038AC  PUSH    40
004038AE  CDQ
004038AF  POP     ECX
004038B0  IDIV    ECX                   ;  EAX=69F9  IDIV ECX=40  ==>EAX=1A7   EDX=39
004038B2  LEA     EAX, [LOCAL.64]
004038B8  IMUL    EDX, DWORD PTR DS:[450E28] ;  EDX=EDX*DS:[450E28]=39*0E=31E
004038BF  ADD     EDX, zbook.00451A68       ;  ASCII "fxyang@163.comfxyang@163.com
004038C5  PUSH    EDX                       ;  zbook.00451D86
004038C6  PUSH    EAX                       ;  //用上面的方法取计算的参数从451D86处做基数
004038C7  CALL    zbook.004083E0
004038CC  PUSH    0C
004038CE  PUSH    ESI                       ;  ESI=00451148 ,ASCII "789456123012345678901234")
004038CF  PUSH    zbook.004510C8            ;  ASCII "骧溻滗怃纩祧"
004038D4  CALL    zbook.004083E0            ;  取试验码的前12位==>004510C8
004038D9  PUSH    0C
004038DB  PUSH    zbook.00451154
004038E0  PUSH    zbook.00451048
004038E5  CALL    zbook.004083E0            ;  取试验码的后12位==>00451048
004038EA  MOV     EAX, DWORD PTR DS:[450E28];  EAX=E
004038EF  AND     BYTE PTR DS:[451054], 0
004038F6  AND     BYTE PTR DS:[4510D4], 0
004038FD  ADD     ESP, 24
00403900  XOR     EDX, EDX
00403902  TEST    EAX, EAX
00403904  JLE     SHORT zbook.00403934
00403906  PUSH    EBX
00403907  PUSH    EDI
00403908  LEA     EBX, DWORD PTR DS:[EAX-1]       ;  EBX=E-1=D
0040390B /LEA     EDI, DWORD PTR SS:[EBP+EDX-100] ;  EDI<==0012F21C,(ASCII "fxyang@163.com")
00403912 |MOV     CL, BYTE PTR DS:[EDI]           ;  CL=DS:[12F21C]=66 ('f')
00403914 |CMP     CL, 40
00403917 |JE      SHORT zbook.0040391E
00403919 |CMP     CL, 2E
0040391C |JNZ     SHORT zbook.0040392D
0040391E |CMP     EDX, EBX
00403920 |JGE     SHORT zbook.0040392B
00403922 |MOV     ECX, EBX
00403924 |LEA     ESI, DWORD PTR DS:[EDI+1]
00403927 |SUB     ECX, EDX
00403929 |REP     MOVS BYTE PTR ES:[EDI], BYTE PTR DS:[ESI]
0040392B |DEC     EAX
0040392C |DEC     EBX
0040392D |INC     EDX
0040392E |CMP     EDX, EAX
00403930 \JL      SHORT zbook.0040390B          ;  这一段循环把e_mail中的@和.取出
00403932  POP     EDI                            //只取e_mail的前12位
00403933  POP     EBX
00403934  CMP     EAX, 0C
00403937  POP     ESI
00403938  JGE     SHORT zbook.00403952
0040393A  PUSH    0C
0040393C  POP     ECX
0040393D  SUB     ECX, EAX
0040393F  LEA     EAX, DWORD PTR SS:[EBP+EAX-100]
00403946  PUSH    ECX
00403947  PUSH    30
00403949  PUSH    EAX
0040394A  CALL    zbook.004087A0
0040394F  ADD     ESP, 0C
00403952  AND     BYTE PTR SS:[EBP-F4], 0
00403959  CALL    zbook.004039A5             ;  关键的计算部分
0040395E  PUSH    0C
00403960  LEA     EAX, [LOCAL.64]            ;  EAX<==0012F21C,(ASCII "fxyang163com")
00403966  PUSH    zbook.004511C8             ;  004511C8<== E6 E4 E4 E2 E6 EC F7 F5 F1 FD F5 FF
0040396B  PUSH    EAX                        ;  EAX<==0012F21C,(ASCII "fxyang163com")
0040396C  CALL    zbook.00408E10             ;  应该是比较部分
00403971  ADD     ESP, 0C
00403974  TEST    EAX, EAX                   ;  关键的比较
00403976  JNZ     SHORT zbook.00403993       ;  关键的跳转
00403978  AND     BYTE PTR DS:[450C23], AL                  
0040397E  AND     BYTE PTR DS:[450C22], AL
00403984  AND     BYTE PTR DS:[450C21], AL
0040398A  AND     BYTE PTR DS:[450C20], AL
00403990  INC     EAX
00403991  LEAVE
00403992  RETN
00403993  MOV     BYTE PTR DS:[450C22], 78                   ;  标记
0040399A >MOV     BYTE PTR DS:[450C23], 79
004039A1  XOR     EAX, EAX
004039A3  LEAVE

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

CALL    zbook.004039A5     ;  关键的计算部分
|
004039A5   PUSH    0C
004039A7   CALL    zbook.004039AE
004039AC   POP     ECX
004039AD   RETN

---------------------------------------------------------------
CALL    zbook.004039AE   终于来到计算的地方,头发炸了
|
|

004039AE  PUSH    ESI
004039AF  MOV     ESI, DWORD PTR SS:[ESP+8]    ;  ESI=0C (e_mail去掉@和.后的长度)
004039B3  XOR     ECX, ECX
004039B5  PUSH    EDI
004039B6  TEST    ESI, ESI
004039B8  JLE     SHORT zbook.004039DA         //第一次的关键计算
004039BA  /LEA     EAX, DWORD PTR DS:[ECX+ESI] ;  EAX=ECX+ESI=0 ++ C=C++
004039BD  |PUSH    9
004039BF  |CDQ
004039C0  |POP     EDI                          ;  EDI=9
004039C1  |IDIV    EDI                          ;  EAX=C IDIV EDI=9 ==>EAX=1  EDX=3
004039C3  |MOV     AL, 8
004039C5  |SUB     AL, DL                       ;  AL=8-3=5
004039C7  |MOV     BYTE PTR DS:[ECX*2+451148], DL  ;  00451148=03
004039CE  |MOV     BYTE PTR DS:[ECX*2+451149], AL  ;  AL=05
004039D5  |INC     ECX                                      
004039D6  |CMP     ECX, ESI                       ; 计算的次数=12
004039D8  \JL      SHORT zbook.004039BA
004039DA  AND     BYTE PTR DS:[ESI*2+451148], 0
004039E2  PUSH    EBX
004039E3  PUSH    EBP
004039E4  LEA     EDI, DWORD PTR DS:[ESI+451148]
004039EA  PUSH    ESI                                        ;  ESI=0C
004039EB  MOV     EBP, zbook.00450F48
004039F0  PUSH    EDI                                        ;   zbook.00451154
004039F1  PUSH    EBP
004039F2  CALL    zbook.004083E0                            

;  把后12位==>00450F48 (00 08 01 07 02 06 03 05 04 04 05 03)

004039F7  MOV     EBX, zbook.00451148
004039FC  PUSH    ESI
004039FD  PUSH    EBX
004039FE  PUSH    EDI
004039FF  CALL    zbook.004083E0                            

;  把前12位==>00451145 (03 05 04 04 05 03 06 02 07 01 08 00)

00403A04  PUSH    ESI
00403A05  PUSH    EBP
00403A06  PUSH    EBX
00403A07  CALL    zbook.004083E0                            

;  把前12位倒置后==>00451148 (00 08 01 07 02 06 03 05 04 04 05 03)

00403A0C  ADD     ESP, 24
00403A0F  XOR     EBX, EBX
00403A11  TEST    ESI, ESI

****************************************************************
第一次计算的总结:                      
1.计算的参数是一个固定值C
2.这段计算是C MOD 9 的值设M 然后用8-M得到值设N,再把C++继续
3.取得到的数组的后12位与前12位值倒置后的数组连接成24位的数组
4.得到一组值==>00451148,
 N=00 08 01 07 02 06 03 05 04 04 05 03 03 05 04 04 05 03 06 02 07 01 08 00
5.就是说上面的数组是固定的.

004039DA  AND     BYTE PTR DS:[ESI*2+451148], 0
004039E2  PUSH    EBX
004039E3  PUSH    EBP
004039E4  LEA     EDI, DWORD PTR DS:[ESI+451148]
004039EA  PUSH    ESI                            ;  ESI=0C
004039EB  MOV     EBP, zbook.00450F48
004039F0  PUSH    EDI                            ;   zbook.00451154
004039F1  PUSH    EBP
004039F2  CALL    zbook.004083E0               ;  把后12位==>00450F48 (00 08 01 07 02 06 03 05 04 04 05 03)
004039F7  MOV     EBX, zbook.00451148
004039FC  PUSH    ESI
004039FD  PUSH    EBX
004039FE  PUSH    EDI
004039FF  CALL    zbook.004083E0               ;  把前12位==>00451145 (03 05 04 04 05 03 06 02 07 01 08 00)
00403A04  PUSH    ESI
00403A05  PUSH    EBP
00403A06  PUSH    EBX
00403A07  CALL    zbook.004083E0               ;  把前12位倒置后==>00451148 (00 08 01 07 02 06 03 05 04 04 05 03)
00403A0C  ADD     ESP, 24
00403A0F  XOR     EBX, EBX
00403A11  TEST    ESI, ESI
00403A13  JLE     SHORT zbook.00403A66     //第二次的关键计算:
00403A15  /MOV     AL, BL
00403A17 |MOV     CL, BYTE PTR DS:[EBX+4510C8] ;  CL <==DS:[EBX+4510C8]=37 ('7') 试验码的前12位"789456123012"
00403A1D |INC     AL
00403A1F |MOV     DL, BYTE PTR DS:[EBX+451048] ;  DL <==DS:[EBX+451048]=33 ('3') 试验码的后12位"345678901234"
00403A25 |IMUL    BL                           ;  BL=0
00403A27 |LEA     EDI, DWORD PTR DS:[EBX+EBX]
00403A2A |INC     AL
00403A2C |AND     AL, 0F
00403A2E |SUB     CL, BYTE PTR DS:[EDI+451148] ;  CL=CL-DS:[451148]=37-00=37||=38-01(第一次计算的第三位)=37
00403A34 |SUB     DL, BYTE PTR DS:[EDI+451149] ;  DL=DL-DS:[451149]=33-08=2B
00403A3A |MOV     BYTE PTR DS:[450F40], AL
00403A3F |SUB     CL, 41                       ;  CL=CL-41=37-41=F6
00403A42 |SUB     DL, 41                       ;  DL=DL-41=2B-41=EA
00403A45 |XOR     CL, AL                       ;  CL=CL XOR AL=F6 XOR 01=F7
00403A47 |XOR     DL, AL                       ;  DL=DL XOR AL=EA XOR 01=EB
00403A49 |MOV     BYTE PTR DS:[EBX+4510C8], CL ;  //得到新值DS:[4510C8]<==( F7 F5 F1 FD F5 FF E6 E4 E4 E2 E6 EC )
00403A4F |MOV     BYTE PTR DS:[EBX+451048], DL ;  //得到新值DS:[451048]<==( EB EF E9 FD F7 FB F8 E2 E4 E4 FE F6 )
00403A55 |INC     EBX                          ;  EBX++
00403A56 |MOV     BYTE PTR DS:[EDI+450F48], CL ;  CL =F7
00403A5C |CMP     EBX, ESI                     ;  计算的次数=C (12D)
00403A5E |MOV     BYTE PTR DS:[EDI+450F49], DL ;  //把试验码的前12位
00403A64 \JL      SHORT zbook.00403A15  
00403A66  PUSH    ESI                          ;  ESI=C
00403A67  PUSH    EBP                          ;  上面的新值地址
00403A68  PUSH    zbook.00451048               ;  上面的新值的第二部分地址
00403A6D  CALL    zbook.004083E0               ;  第一部分的值==>00451048
00403A72  LEA     EDI, DWORD PTR DS:[ESI+450F48];  EDI=00450F54,后12位地址
00403A78  PUSH    ESI
00403A79  MOV     EBX, zbook.004510C8           ;  ASCII "骧溻滗怃纩祧"
00403A7E  PUSH    EDI
00403A7F  PUSH    EBX                           ;  第一部分的值==>004510C8
00403A80  CALL    zbook.004083E0                ;  后12组==>004510C8
00403A85  PUSH    ESI
00403A86  PUSH    EBX
00403A87  PUSH    EBP
00403A88  CALL    zbook.004083E0                 ;  连接后的后12位==>00450F48
00403A8D  PUSH    ESI
00403A8E  PUSH    zbook.00451048                 ;  连接后的后12位==>00450F48
00403A93  PUSH    EDI
00403A94  CALL    zbook.004083E0                  ;  连接后的前12位==>00450F54
00403A99  ADD     ESP, 30
00403A9C  XOR     EAX, EAX
00403A9E  TEST    ESI, ESI
00403AA0  POP     EBP
00403AA1  POP     EBX
00403AA2  JLE     SHORT zbook.00403AC0
00403AA4 /MOV     CL, BYTE PTR DS:[EAX*2+450F49] ;  CL<==DS:[450F49]=F8
00403AAB |SHL     CL, 4                          ;  CL=CL SHL 4=F8 SHL 4 =80
00403AAE |OR      CL, BYTE PTR DS:[EAX*2+450F48] ;  CL= CL OR DS:[450F48]=80 OR E6=E6
00403AB5 |INC     EAX                          ;  EAX++
00403AB6 |CMP     EAX, ESI                     ;  ESI=C
00403AB8 |MOV     BYTE PTR DS:[EAX+4511C7], CL ;  CL==>DS:[4511C8]=E6
00403ABE \JL      SHORT zbook.00403AA4        //循环取值
00403AC0  AND     BYTE PTR DS:[ESI+4511C8], 0  

;  004511C8<== E6 E4 E4 E2 E6 EC F7 F5 F1 FD F5 FF

00403AC7  POP     EDI
00403AC8  POP     ESI
00403AC9  RETN


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

CALL    zbook.00408E10             ;  应该是比较部分


00408E10  MOV     EAX, DWORD PTR SS:[ESP+C]
00408E14  TEST    EAX, EAX                    ;  EAX=C
00408E16  JE      SHORT zbook.00408E5C
00408E18  MOV     EDX, DWORD PTR SS:[ESP+4]  

;  EDX<==0012F21C,(ASCII "fxyang163com")

00408E1C  PUSH    ESI
00408E1D  PUSH    EDI
00408E1E  MOV     ESI, EDX                    

;  ESI<==0012F21C,(ASCII "fxyang163com")

00408E20  MOV     EDI, DWORD PTR SS:[ESP+10]  

;  EDI<==004511C8== E6 E4 E4 E2 E6 EC F7 F5 F1 FD F5 FF

00408E24  OR      EDX, EDI
00408E26  AND     EDX, 3
00408E29  JE      SHORT zbook.00408E5D
00408E2B  TEST    EAX, 1
00408E30  JE      SHORT zbook.00408E3D    
00408E32  MOV     CL, BYTE PTR DS:[ESI]
00408E34  CMP     CL, BYTE PTR DS:[EDI]
00408E36  JNZ     SHORT zbook.00408E8A
00408E38  INC     ESI
00408E39  INC     EDI
00408E3A  DEC     EAX
00408E3B  JE      SHORT zbook.00408E5A
00408E3D  /MOV     CL, BYTE PTR DS:[ESI]       ; 逐位比较,相同就成功(可能吗?)  
00408E3F |MOV     DL, BYTE PTR DS:[EDI]
00408E41 |CMP     CL, DL
00408E43 |JNZ     SHORT zbook.00408E8A
00408E45 |MOV     CL, BYTE PTR DS:[ESI+1]
00408E48 |MOV     DL, BYTE PTR DS:[EDI+1]
00408E4B |CMP     CL, DL
00408E4D |JNZ     SHORT zbook.00408E8A
00408E4F |ADD     EDI, 2
00408E52 |ADD     ESI, 2
00408E55 |SUB     EAX, 2
00408E58 \JNZ     SHORT zbook.00408E3D
00408E5A  POP     EDI
00408E5B  POP     ESI
00408E5C  RETN
00408E5D  MOV     ECX, EAX                  ;EAX=C
00408E5F  AND     EAX, 3
00408E62  SHR     ECX, 2
00408E65  JE      SHORT zbook.00408E92      ;  上面不成立就到这里
00408E67  REPE    CMPS DWORD PTR ES:[EDI], DWORD PTR DS:[ESI>

;  比较fxya和"E6E4E4E2"-前四位相同

00408E69  JE      SHORT zbook.00408E92                      

;  关键的跳转,相同就注册成功.完美暴破点

00408E6B  MOV     ECX, DWORD PTR DS:[ESI-4]   ;  ECX<==DS:[12F21C]=61797866
00408E6E  MOV     EDX, DWORD PTR DS:[EDI-4]   ;  EDX<==DS:[4511C8]=E2E4E4E6
00408E71  CMP     CL, DL
00408E73  JNZ     SHORT zbook.00408E85
00408E75  CMP     CH, DH
00408E77  JNZ     SHORT zbook.00408E85
00408E79  SHR     ECX, 10
00408E7C  SHR     EDX, 10
00408E7F  CMP     CL, DL
00408E81  JNZ     SHORT zbook.00408E85
00408E83  CMP     CH, DH
00408E85  MOV     EAX, 0
00408E8A  SBB     EAX, EAX
00408E8C  POP     EDI
00408E8D  SBB     EAX, -1
00408E90  POP     ESI
00408E91  RETN


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

第二次的关键计算的总结:
 1.先把试验码--789456123012345678901234 分成二组每组12位
  1>.第一组: 前12位--789456123012  设为M0
  2>.第二组: 后12位--345678901234  设为N0
 2.第一组的hex值-第一次计算值的奇数位的值设为K0 ;第二组的hex值-第一次计算值的偶数位的值设为L0
 3.把(K0-41)XOR{次数*(次数-1)+1}的个位设为P  
   ;(L0-41)XOR{次数*(次数-1)+1}的个位设为Q 然后把这个值按P Q P1 Q1 ..P12 Q12 放在以00450F48开始的地址中
   ;{次数*(次数-1)+1}的个位这个值是一组固定值设位H:1 3 7 D 5 F B 9 9 B F 5 D 7 1
 //得到新值DS:[450F48]<==( F7 EB F5 EF F1 E9 FD FD F5 F7 FF FB E6 F8 E4 E2 E4 E4 E2 E4 E6 FE EC F6 )
 4.把后12位与前12位对换==>E6 F8 E4 E2 E4 E4 E2 E4 E6 FE EC F6 F7 EB F5 EF F1 E9 FD FD F5 F7 FF FB
 5.然后取奇数位得到一个12位的新数组==>E6 E4 E4 E2 E6 EC F7 F5 F1 FD F5 FF
  实际上就是把P组的前六位与后六位对换就是需要的数组
 6.取得到的数组的后12位与输入e_mail的前12位比较,相同就注册成功.
 7.如果不成功,就取数组的前四位和e_mail 的前四位比较,相同就注册成功

特别说明:上面的注册吗我没有办法可逆,可能我很菜.请大侠们帮忙了.


                                                       fxyang
     
                                                     2003.3.15