• 标 题:小小气象台 V1.1.3
  • 作 者:fxyang
  • 时 间:2003/02/27 04:30pm 
  • 链 接:http://bbs.pediy.com

一个气象软件的算法跟踪:


【软件限制】:无功能限制,但启动时跳出注册窗口

【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请各大侠赐教!

【破解工具】:Ollydbg1.09 中文版、W32Dasm8.93黄金版


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


呵呵,我们开工吧!唉!^-^^-^ 我的水平很低,许多地方表达的有问题,烦请各位老师指教!

为了保护国人软件,软件信息不贴了,要的发个消息.

这个软件的注册是先输入试验码,然后加密放在软件目录下的REG.KEY 中,那么关键点的查找就从REG.KEY关键
值开始,用W32Dasm8.93黄金版反汇编它,然后查找reg.key关键字.

==========================================================
00402596  |.  68 34B74000   PUSH    tqyb.0040B734               ;  ASCII "register.key"
0040259B  |.  C64424 3C 03  MOV     BYTE PTR SS:[ESP+3C], 3
004025A0  |.  E8 F1430000   CALL    <JMP.&MFC42.#5186>
004025A5  |.  85C0          TEST    EAX, EAX
004025A7  |.  75 41         JNZ     SHORT tqyb.004025EA
**********************************************************
然后用Ollydbg1.09 中文版加载它,下中断在:

00402596  |.  68 34B74000   PUSH    tqyb.0040B734               ;  ASCII "register.key"

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
运行程序,中断后不久就到了核心部分,来看看:

这里应该是计算部分1

00402900  /$  8A41 37       MOV     AL, BYTE PTR DS:[ECX+37]    ;  AL <== DS:[041E0BB]= 78
00402903  |.  8A51 3E       MOV     DL, BYTE PTR DS:[ECX+3E]    ;  DL <== DS:[0041E0C2]=94
00402906  |.  8881 33040000 MOV     BYTE PTR DS:[ECX+433], AL  
;  然后把得到的值==>DS:[0041E4B7]
0040290C  |.  8A41 4C       MOV     AL, BYTE PTR DS:[ECX+4C]    
;  这说明输入的试验码是二个一组分开存放在reg.key中,这段程序就是解码
0040290F  |.  8891 32040000 MOV     BYTE PTR DS:[ECX+432], DL
00402915  |.  8A51 61       MOV     DL, BYTE PTR DS:[ECX+61]
00402918  |.  8881 2F040000 MOV     BYTE PTR DS:[ECX+42F], AL
0040291E  |.  8A41 76       MOV     AL, BYTE PTR DS:[ECX+76]
00402921  |.  8891 30040000 MOV     BYTE PTR DS:[ECX+430], DL
00402927  |.  BA DCFBFFFF   MOV     EDX, -424
0040292C  |.  8881 31040000 MOV     BYTE PTR DS:[ECX+431], AL  
;  连接后就是输入的数字5612309478
00402932  |.  53            PUSH    EBX                        
;  原来就是这样读出输入的数字的
00402933  |.  8D81 24040000 LEA     EAX, DWORD PTR DS:[ECX+424]
00402939  |.  2BD1          SUB     EDX, ECX
0040293B  |>  8A88 F4FBFFFF /MOV     CL, BYTE PTR DS:[EAX-40C]  
;  CL <== DS:[0041E09C] =36 ,这个地址内是机器码存放的地方,按照顺序放的
00402941  |.  8A58 0B       |MOV     BL, BYTE PTR DS:[EAX+B]    
;  BL <== DS:[0041E4B3] = 56 ,这个地址是输入的数字的存放的地方,顺序是从34521
00402944  |.  32CB          |XOR     CL, BL                    
;  CL= 36 XOR 56 =60
00402946  |.  8A18          |MOV     BL, BYTE PTR DS:[EAX]    
;  BL <== DS:[0041E4A8]=11 这个地址中是常数存放的地方
00402948  |.  32CB          |XOR     CL, BL                    
;  CL= 60 XOR 11 =71
0040294A  |.  75 10         |JNZ     SHORT tqyb.0040295C        
;  注册码关键比较的地方,即条件是56 xor 36 =11
0040294C  |.  40            |INC     EAX                        
;  关键的比较,实际上就是比较是不是相同
0040294D  |.  8D0C02        |LEA     ECX, DWORD PTR DS:[EDX+EAX>
00402950  |.  83F9 05       |CMP     ECX, 5                    
;  这里是前10位的计算和比较部分
00402953  |.^ 7C E6         \JL      SHORT tqyb.0040293B
00402955  |.  B8 01000000   MOV     EAX, 1
0040295A  |.  5B            POP     EBX
0040295B  |.  C3            RETN
0040295C  |>  33C0          XOR     EAX, EAX
0040295E  |.  5B            POP     EBX
0040295F  \.  C3            RETN
-----------------------------------------------------

这里应该是计算部分2

00402960  /$  8A81 8B000000 MOV     AL, BYTE PTR DS:[ECX+8B]    
;  AL <== DS:[0041E10F]=12  (
00402966  |.  8A91 F4000000 MOV     DL, BYTE PTR DS:[ECX+F4]
0040296C  |.  8881 2F040000 MOV     BYTE PTR DS:[ECX+42F], AL
00402972  |.  8A81 F9000000 MOV     AL, BYTE PTR DS:[ECX+F9]
00402978  |.  8891 30040000 MOV     BYTE PTR DS:[ECX+430], DL
0040297E  |.  8A91 09010000 MOV     DL, BYTE PTR DS:[ECX+109]
00402984  |.  8881 31040000 MOV     BYTE PTR DS:[ECX+431], AL
0040298A  |.  8A81 DB010000 MOV     AL, BYTE PTR DS:[ECX+1DB]
00402990  |.  8891 32040000 MOV     BYTE PTR DS:[ECX+432], DL  
;  这说明输入的试验码是二个一组分开存放在reg.key中,这段程序就是解码
00402996  |.  BA D7FBFFFF   MOV     EDX, -429
0040299B  |.  8881 33040000 MOV     BYTE PTR DS:[ECX+433], AL  
;  第二次把输入的试验码的后10位安顺序放在DS:[0041E4B3]中
004029A1  |.  53            PUSH    EBX
004029A2  |.  8D81 29040000 LEA     EAX, DWORD PTR DS:[ECX+429]
004029A8  |.  2BD1          SUB     EDX, ECX
004029AA  |>  8A88 F4FBFFFF /MOV     CL, BYTE PTR DS:[EAX-40C]  
;  CL <== DS:[0041E0A1] =21 ,这个地址内是机器码后10位存放的地方,按照顺序放的
004029B0  |.  8A58 06       |MOV     BL, BYTE PTR DS:[EAX+6]    
;  BL <== DS:[0041E4B3] = 12 ,这个地址是输入的数字的后10位存放的地方,顺序
004029B3  |.  32CB          |XOR     CL, BL
004029B5  |.  8A18          |MOV     BL, BYTE PTR DS:[EAX]      
;  BL <== DS:[0041E4AD] = AA (常数的地址)
004029B7  |.  32CB          |XOR     CL, BL
004029B9  |.  75 10         |JNZ     SHORT tqyb.004029CB        
;  关键的比较,实际上就是比较是不是相同
004029BB  |.  40            |INC     EAX
004029BC  |.  8D0C02        |LEA     ECX, DWORD PTR DS:[EDX+EAX>
004029BF  |.  83F9 05       |CMP     ECX, 5                    
;  这里是后10位的计算和比较部分
004029C2  |.^ 7C E6         \JL      SHORT tqyb.004029AA
004029C4  |.  B8 01000000   MOV     EAX, 1
004029C9  |.  5B            POP     EBX
004029CA  |.  C3            RETN


===================================================
以下是内存中的关键数据:

0041E4A8  11 33 55 77 99 AA CC BB  3Uw櫔袒   <==参数
0041E4B0  EE FF
                  56 12 30 94 78  ?.V0攛     <== 输入的数字   (分两次调入,每次10位)
0041E098              36 B5 44 13  @4.6礑    <==机器码存放的地方

0041E0A0  12 21 3B 40 58 6D        !;@Xm.

=========================================================================================
到此注册码计算的分析完成,下面来总结注册码的计算方法:
  条件:  注册码的长度为20位 , 因为是两个一组,现在我们用一个字符来表示一组.
         机器码我们也用同样的方法表示.
  设:
      1.机器码 = M0 M1 M2 M3 M4 M5 M6 M7 M8 M9
      2.注册码 = N0 N1 N2 N3 N4 N5 N6 N7 N8 N9

      注册码的计算方法: N0 = M4 XOR 11
                        N1 = M3 XOR 33
                        N2 = M0 XOR 55
                        N3 = M1 XOR 77
                        N4 = M2 XOR 99
                        N5 = M5 XOR AA
                        N6 = M6 XOR CC
                        N7 = M7 XOR BB
                        N8 = M8 XOR EE
                        N9 = M9 XOR FF
                       

                                                       fxyang
   
                                                      2003.2.27