• 标 题:E族百变桌面6.0注册算法分析
  • 作 者:txm123
  • 时 间:2003/07/18 00:15am
  • 链 接:http://bbs.pediy.com

E族百变桌面6.0注册算法分析                
 
软件名称:
 E族百变桌面6.0
 
软件简介:
 e族百变桌面 6.0  
软件大小:1386KB
软件语言:简体中文
软件类别:国产软件/共享版/布景保护
运行环境:Win9x/Me/NT/2000/XP
加入时间:2003-6-30 16:56:23
下载次数:642
软件评级:
联 系 人:未知
开 发 商:Home Page
软件介绍:
  提供25种变换桌面的方式,让您的桌面焕然一新。操作简单,无需费力学习。支持多种Internet流行图片格式。将壁纸文件打包,方便存
储、转发。将壁纸包展开,还原图片文件。e族网真情奉献,免费下载,免费使用。e族百变桌面,桌面从此精彩!


 
下载地址:
 http://www.onlinedown.net/index.htm
 
------------------------------------------------------------
 
破解作者:
 yzez[DFCG]
 
破解工具:
 DeDE3.5、Ollydbg1.09
 
破解目的:
 初次学破解,交流经验。研究注册算法,提高水平。
 
------------------------------------------------------------
 
[破解过程]
 
详细过程:
1、用FI检查是Delphi程序,所以用DeDE3.5反汇编,选过程,在出现的窗口中选择frmbuy--bnNextClick,找到关键点:
  004CCA4A   E8CDC2F3FF             call    00408D1C
004CCA4F   8945F0                 mov     [ebp-$10], eax
004CCA52   8955F4                 mov     [ebp-$0C], edx
004CCA55   8B45FC                 mov     eax, [ebp-$04]
004CCA58   FFB0C4030000           push    dword ptr [eax+$03C4]
004CCA5E   FFB0C0030000           push    dword ptr [eax+$03C0]
004CCA64   FF75F4                 push    dword ptr [ebp-$0C]
004CCA67   FF75F0                 push    dword ptr [ebp-$10]
004CCA6A   B001                   mov     al, $01

|
004CCA6C   E85FF3FFFF             call    004CBDD0---------这是我们要找的关键CALL,这一步我不想详细介绍,这篇破文主要研究算法。
2、退出DeDE3.5,用Ollydbg调试:
004CCA6A   .  B0 01         MOV     AL, 1
004CCA6C   .  E8 5FF3FFFF   CALL    EPAPER.004CBDD0---------------------------在此按F2键设断,按F9运行程序,填入注册信息后,
                                                                             点确定,被断,按F7跟进这个CALL
004CCA71   .  8B15 90AF4D00 MOV     EDX, DWORD PTR DS:[4DAF90]       ;  EPAPER.004DCD94
004CCA77   .  8802          MOV     BYTE PTR DS:[EDX], AL
004CCA79   .  A1 90AF4D00   MOV     EAX, DWORD PTR DS:[4DAF90]
004CCA7E   .  8038 00       CMP     BYTE PTR DS:[EAX], 0
004CCA81   .  74 4C         JE      SHORT EPAPER.004CCACF
004CCA83   .  8B45 FC       MOV     EAX, DWORD PTR SS:[EBP-4]
004CCA86   .  C780 CC030000>MOV     DWORD PTR DS:[EAX+3CC], 4
004CCA90   .  FF75 F4       PUSH    DWORD PTR SS:[EBP-C]             ; /Arg2 = 00000000
004CCA93   .  FF75 F0       PUSH    DWORD PTR SS:[EBP-10]            ; |Arg1 = 499602D2
004CCA96   .  8D45 C0       LEA     EAX, DWORD PTR SS:[EBP-40]       ; |
004CCA99   .  E8 BAC1F3FF   CALL    EPAPER.00408C58                  ; \EPAPER.00408C58
004CCA9E   .  8B55 C0       MOV     EDX, DWORD PTR SS:[EBP-40]
004CCAA1   .  8B45 FC       MOV     EAX, DWORD PTR SS:[EBP-4]
004CCAA4   .  8B80 44030000 MOV     EAX, DWORD PTR DS:[EAX+344]
004CCAAA   .  E8 25F3F8FF   CALL    EPAPER.0045BDD4
--------------------追进004CCA6C   .  E8 5FF3FFFF   CALL    EPAPER.004CBDD0我们来到这里:
004CBDD0  /$  55            PUSH    EBP----------------------停在这一行
004CBDD1  |.  8BEC          MOV     EBP, ESP
004CBDD3  |.  83C4 F8       ADD     ESP, -8
004CBDD6  |.  53            PUSH    EBX
004CBDD7  |.  56            PUSH    ESI                              ;  ePaper.0049F0E8
004CBDD8  |.  33D2          XOR     EDX, EDX
004CBDDA  |.  8955 F8       MOV     [LOCAL.2], EDX
004CBDDD  |.  8845 FF       MOV     BYTE PTR SS:[EBP-1], AL
004CBDE0  |.  33C0          XOR     EAX, EAX
004CBDE2  |.  55            PUSH    EBP
004CBDE3  |.  68 67BE4C00   PUSH    ePaper.004CBE67
004CBDE8  |.  64:FF30       PUSH    DWORD PTR FS:[EAX]
004CBDEB  |.  64:8920       MOV     DWORD PTR FS:[EAX], ESP
004CBDEE  |.  33DB          XOR     EBX, EBX
004CBDF0  |.  FF75 14       PUSH    [ARG.4]                          ;  ePaper.0049F0CF
004CBDF3  |.  FF75 10       PUSH    [ARG.3]
004CBDF6  |.  E8 B1000000   CALL    ePaper.004CBEAC------按F7再追进这个CALL.为什么?看看下面的代码,这是很经典的比较语句
004CBDFB  |.  3B55 0C       CMP     EDX, [ARG.2]                     ;  ePaper.0049F10B
004CBDFE  |.  75 07         JNZ     SHORT ePaper.004CBE07
004CBE00  |.  3B45 08       CMP     EAX, [ARG.1]
004CBE03  |.  75 02         JNZ     SHORT ePaper.004CBE07
004CBE05  |.  B3 01         MOV     BL, 1
004CBE07  |>  807D FF 00    CMP     BYTE PTR SS:[EBP-1], 0
004CBE0B  |.  74 44         JE      SHORT ePaper.004CBE51
-----------------追进004CBDF6  |.  E8 B1000000   CALL    ePaper.004CBEAC,我们又会来到这里:
004CBEA4   .  52 65 67 43 6>ASCII   "RegCode",0――注册码,可见我们找到了地方
004CBEAC  /$  55            PUSH    EBP---------停在这一行
004CBEAD  |.  8BEC          MOV     EBP, ESP
004CBEAF  |.  83C4 E0       ADD     ESP, -20
004CBEB2  |.  53            PUSH    EBX
004CBEB3  |.  56            PUSH    ESI                              ;  ePaper.0049F0E8
004CBEB4  |.  33C0          XOR     EAX, EAX
004CBEB6  |.  8945 E0       MOV     [LOCAL.8], EAX
004CBEB9  |.  8945 EC       MOV     [LOCAL.5], EAX
004CBEBC  |.  8945 E8       MOV     [LOCAL.6], EAX
004CBEBF  |.  8945 E4       MOV     [LOCAL.7], EAX
004CBEC2  |.  33C0          XOR     EAX, EAX
004CBEC4  |.  55            PUSH    EBP
004CBEC5  |.  68 D9BF4C00   PUSH    ePaper.004CBFD9
004CBECA  |.  64:FF30       PUSH    DWORD PTR FS:[EAX]
004CBECD  |.  64:8920       MOV     DWORD PTR FS:[EAX], ESP
004CBED0  |.  FF75 0C       PUSH    [ARG.2]                          ; /Arg2 = 00000000
004CBED3  |.  FF75 08       PUSH    [ARG.1]                          ; |Arg1 = 499602D2
004CBED6  |.  8D45 EC       LEA     EAX, [LOCAL.5]                   ; |
004CBED9  |.  E8 7ACDF3FF   CALL    ePaper.00408C58                  ; \ePaper.00408C58
004CBEDE  |.  8B45 08       MOV     EAX, [ARG.1]-―――――把机器码的十六进制值赋给EAX
004CBEE1  |.  8945 F0       MOV     [LOCAL.4], EAX
004CBEE4  |.  8B45 0C       MOV     EAX, [ARG.2]
004CBEE7  |.  8945 F4       MOV     [LOCAL.3], EAX
004CBEEA  |.  8B45 EC       MOV     EAX, [LOCAL.5]
004CBEED  |.  E8 F288F3FF   CALL    ePaper.004047E4
004CBEF2  |.  8BD8          MOV     EBX, EAX
004CBEF4  |.  85DB          TEST    EBX, EBX
004CBEF6  |.  7E 56         JLE     SHORT ePaper.004CBF4E
004CBEF8  |.  BE 01000000   MOV     ESI, 1
004CBEFD  |>  8D45 E0       /LEA     EAX, [LOCAL.8]--从这里开始是一个循环,一共循环10次,因为机器码是:10位
004CBF00  |.  8B55 EC       |MOV     EDX, [LOCAL.5]-----赋EDX为0
004CBF03  |.  8A5432 FF     |MOV     DL, BYTE PTR DS:[EDX+ESI-1]
004CBF07  |.  E8 0088F3FF   |CALL    ePaper.0040470C
004CBF0C  |.  8B45 E0       |MOV     EAX, [LOCAL.8]
004CBF0F  |.  E8 08E5F3FF   |CALL    ePaper.0040A41C
004CBF14  |.  DB2D F0BF4C00 |FLD     TBYTE PTR DS:[4CBFF0]----------------装入实数:4CBFF0的值是:3.1415926535897932380
004CBF1A  |.  DEC9          |FMULP   ST(1), ST--------------ST(1)*ST送入ST,然后出栈,ST是3.1415926535897932380,ST(1)是机器码按
位取数,如第一次循环,取第一位是:3,所以执行运算后其结果是:3.1415926535897932380*3.0000000000000000000=9.4247779607693793480
004CBF1C  |.  E8 4F6CF3FF   |CALL    ePaper.00402B70----------这个CALL干什么用?
--------------下面是004CBF1C  |.  E8 4F6CF3FF   |CALL    ePaper.00402B70这个CALL的代码

00402B70  /$  83EC 08       SUB     ESP, 8
00402B73  |.  DF3C24        FISTP   QWORD PTR SS:[ESP]--------将ST以整数形式保存,注意四舍五入,如:9.4247779607693793480保留
                                                             整数是9。
00402B76  |.  9B            WAIT
00402B77  |.  58            POP     EAX                              ;  ePaper.00404719
00402B78  |.  5A            POP     EDX                              ;  ePaper.00404719
------------------------------------------------------------------――――――――――
004CBF21  |.  3345 F0       |XOR     EAX, [LOCAL.4]  ;  ePaper.0049F0E8----------------第一次循环是把机器码的十六进制值与EAX
             异或送入EAX,EAX是多少?就是上面浮点运算取得的整数值(转为十六进制).如:第一次循环就是:E62C6708 XOR 9=E62C6701
             (E62C6708是我的机器码3861669640的十六进制值)                                                               
004CBF24  |.  3355 F4       |XOR     EDX, [LOCAL.3]----------------------EDX清零
004CBF27  |.  81F0 A09EF21B |XOR     EAX, 1BF29EA0---------------------E62C6701 XOR 1BF29EA0=FDDEF9A1
004CBF2D  |.  81F2 00000000 |XOR     EDX, 0
004CBF33  |.  85D2          |TEST    EDX, EDX
004CBF35  |.  7D 07         |JGE     SHORT ePaper.004CBF3E--大于等于转移
004CBF37  |.  F7D8          |NEG     EAX
004CBF39  |.  83D2 00       |ADC     EDX, 0-------------带进位+0
004CBF3C  |.  F7DA          |NEG     EDX
004CBF3E  |>  0345 F0       |ADD     EAX, [LOCAL.4]  ;  ePaper.0049F0E8--------FDDEF9A1+E62C6708=E40B60A9
004CBF41  |.  1355 F4       |ADC     EDX, [LOCAL.3]--带进位加:EDX+EDX=1+0=1赋给Arg2
004CBF44  |.  8945 F0       |MOV     [LOCAL.4], EAX--E40B60A9替换E62C6708赋值给Arg1
004CBF47  |.  8955 F4       |MOV     [LOCAL.3], EDX
004CBF4A  |.  46            |INC     ESI      ;  ePaper.0049F0E8------调整
004CBF4B  |.  4B            |DEC     EBX---------------------------EBX减一,
004CBF4C  |.^ 75 AF         \JNZ     SHORT ePaper.004CBEFD--完了吗?没完继续.跳回前面重新来过!
004CBF4E  |>  FF75 F4       PUSH    [LOCAL.3]                        ; /Arg2 = 000003F7
004CBF51  |.  FF75 F0       PUSH    [LOCAL.4]                        ; |Arg1 = 1C02DF42这是十次循环计算后的Arg1和Arg2的值
004CBF54  |.  8D45 E8       LEA     EAX, [LOCAL.6]                   ; |
004CBF57  |.  E8 FCCCF3FF   CALL    ePaper.00408C58  ; \ePaper.00408C58----------------此CALL把上述运算得到的Arg1、Arg2连接
                                                                    起来,就是;3F71C02DF42,再转化为十进制值是:4359861755714
004CBF5C  |.  8B45 E8       MOV     EAX, [LOCAL.6]                   ;  ePaper.004CBE67
004CBF5F  |.  E8 8088F3FF   CALL    ePaper.004047E4
004CBF64  |.  8BD8          MOV     EBX, EAX----------------------取位数,EAX是0D(即13),上面转化的数值就是十三位数
004CBF66  |.  8B45 EC       MOV     EAX, [LOCAL.5]
004CBF69  |.  E8 7688F3FF   CALL    ePaper.004047E4
004CBF6E  |.  3BD8          CMP     EBX, EAX----------------------比较位数:EAX为0A(10),EBX为0D(13)
004CBF70  |.  7D 08         JGE     SHORT ePaper.004CBF7A---------大于等于转移
004CBF72  |.  8B45 E8       MOV     EAX, [LOCAL.6]                   ;  ePaper.004CBE67
004CBF75  |.  E8 DA91F6FF   CALL    ePaper.00435154
004CBF7A  |>  8B45 E8       MOV     EAX, [LOCAL.6] ----------------转移到此 ,赋注册码位数为0A即10位                
004CBF7D  |.  E8 6288F3FF   CALL    ePaper.004047E4
004CBF82  |.  8BD8          MOV     EBX, EAX
004CBF84  |.  8B45 EC       MOV     EAX, [LOCAL.5]
004CBF87  |.  E8 5888F3FF   CALL    ePaper.004047E4
004CBF8C  |.  2BD8          SUB     EBX, EAX----------------------这里调整位数:EBX=0D-0A
004CBF8E  |.  43            INC     EBX---------------------------EBX+1
004CBF8F  |>  8D45 E4       /LEA     EAX, [LOCAL.7]
004CBF92  |.  50            |PUSH    EAX
004CBF93  |.  8B45 EC       |MOV     EAX, [LOCAL.5]
004CBF96  |.  E8 4988F3FF   |CALL    ePaper.004047E4
004CBF9B  |.  8BC8          |MOV     ECX, EAX
004CBF9D  |.  8BD3          |MOV     EDX, EBX
004CBF9F  |.  8B45 E8       |MOV     EAX, [LOCAL.6]  ;  ePaper.004CBE67-------------注册码只取十位
004CBFA2  |.  E8 9D8AF3FF   |CALL    ePaper.00404A44
004CBFA7  |.  4B            |DEC     EBX---------------------------------------------EBX减一就是3
004CBFA8  |.  8B45 E4       |MOV     EAX, [LOCAL.7]------把4359861755714去掉前三位:9861755714赋给EAX这就是我们所需要的注册码!
004CBFAB  |.  8038 30       |CMP     BYTE PTR DS:[EAX], 30
004CBFAE  |.^ 74 DF         \JE      SHORT ePaper.004CBF8F
004CBFB0  |.  8B45 E4       MOV     EAX, [LOCAL.7]
004CBFB3  |.  E8 64CDF3FF   CALL    ePaper.00408D1C
004CBFB8  |.  8945 F8       MOV     [LOCAL.2], EAX
004CBFBB  |.  8955 FC       MOV     [LOCAL.1], EDX
004CBFBE  |.  33C0          XOR     EAX, EAX
004CBFC0  |.  5A            POP     EDX                              ;  0012F7B0
004CBFC1  |.  59            POP     ECX                              ;  0012F7B0
004CBFC2  |.  59            POP     ECX                              ;  0012F7B0
004CBFC3  |.  64:8910       MOV     DWORD PTR FS:[EAX], EDX
004CBFC6  |.  68 E0BF4C00   PUSH    ePaper.004CBFE0
004CBFCB  |>  8D45 E0       LEA     EAX, [LOCAL.8]
004CBFCE  |.  BA 04000000   MOV     EDX, 4
004CBFD3  |.  E8 7085F3FF   CALL    ePaper.00404548
004CBFD8  \.  C3            RETN
--------------------------------------------------------------------------------------
算法小结:这是根据软件随机产生的十位机器码进行计算,得出正确的注册码。计算分两步:
1、机器码经过按位运算产生Arg1和Arg2两组值。Arg1的运算是这样:首先按位取值,取出注册码的一位值乘3.1415926535897932380,把结果
取整数(注意四舍五入)赋给EAX,然后机器码的十六进制值异或EAX,结果存EAX(注意这是第一次循环),然后再与常数:1BF29EA0相异或,结果
加上机器码的十六进制值,完成第一次循环,把这一运算结果保存,进行第二次循环。语言太差,总觉得说不清楚,下面举例说明:
 第一次循环:Arg1(1)我假定为Arg1(1),Arg1(1)=机器码 XOR 3.1415926535897932380*3.0000000000000000000的整数值的十六进制(9) XOR
1BF29EA0+机器码= FDDEF9A1+ E62C6708=E40B60A9
 第二次循环:Arg1(2)= Arg1(1) XOR 3.1415926535897932380*8.0000000000000000000的整数值的十六进制(19) XOR 1BF29EA0+ Arg1(1)=
E4055EB9
。。。。。。。。。。。。。。。。。。。下述相类似省略
 第十次循环:Arg1(10)= Arg1(9) XOR 3.1415926535897932380*0.0000000000000000000的整数值的十六进制(0) XOR 1BF29EA0+ Arg1(9)=
1C02DF42,这就是:Arg1的最后结果。
 Arg2的运算:Arg2=(位数-1)+1+(位数-1)(这也是第一次的循环),后面的循环: Arg2(n)= Arg2(n-1)+1+ Arg2(n-1),如第一次循环:
Arg2(1)=0(1-1)+1+0(1-1)=1;
Arg2(2)=1+1+1=3。。。。。。。。。以下省略
Arg2(10)=1FB+1+1FB=3F7,这是Arg2的值。
2、这是第二步运算,把Arg1和Arg2连接起来,构成一个十六进制值,即Arg2Arg1=3F71C02DF42,转化为十进制值是:4359861755714,注册码是
10位,把前面3位去掉,就是真正的注册码,如我的注册码是:9861755714。