• 标 题: 【原创】电视剧下载2.00算法浅探
  • 作 者:Winter-Night
  • 时 间:2005-01-23 18:25

【破文作者】S.P.S.G
【作者邮箱】spsgeyro@hotmail.com
【所属组织】Winter[CZG]
【组织主页】http://www.5icrack.com
【使用工具】Fuckall,PEiD
【操作系统】Windows 2003

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

【软件名称】电视剧下载2.00     
【软件语言】Borland Delphi 6.0 - 7.0
【破解声明】曾经沧海难为水
【破解目的】我不喜欢有限制

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

【爆破过程】

刚刚开始学算法,手头正好有这个软件,就开始慢慢琢磨^_^

装好以后,peid查一下,无壳,语言delphi,Fuckall载入。

载入后运行,发现软件采取序列号+注册码的保护方式,那么我们先来看看有什么有用的字符串。

第一句:您输入的注册码无效,请重新输入。

双击来到汇编语句:
0049335A   .  83F8 08       CMP EAX,8                     //注册码小于等于八位
0049335D   .  7E 0F         JLE SHORT 电视剧下.0049336E
0049335F   >  B8 C8354900   MOV EAX,电视剧下.004935C8

继续,第二句:您输入的注册码xxx不正确,请与作者联系。

双击来到这里:
004933E4   .  68 00364900   PUSH 电视剧下.00493600                       ; 

往上看:
004933AD   .  8BF0          MOV ESI,EAX
004933AF   .  33C0          XOR EAX,EAX
004933B1   .  55            PUSH EBP                                      //到这里ECX为序列

号的前六位
004933B2   .  68 DF344900   PUSH 电视剧下.004934DF
004933B7   .  64:FF30       PUSH DWORD PTR FS:[EAX]
004933BA   .  64:8920       MOV DWORD PTR FS:[EAX],ESP
004933BD   .  8D55 DC       LEA EDX,DWORD PTR SS:[EBP-24]
004933C0   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]
004933C3   .  8B80 3C030000 MOV EAX,DWORD PTR DS:[EAX+33C]
004933C9   .  E8 8A21FBFF   CALL 电视剧下.00445558
004933CE   .  8B45 DC       MOV EAX,DWORD PTR SS:[EBP-24]                 //EAX为假码
004933D1   .  E8 AE53F7FF   CALL 电视剧下.00408784                       ;  算法CAll,跟进
004933D6   .  8BD8          MOV EBX,EAX
004933D8   .  8BC3          MOV EAX,EBX
004933DA   .  2BC6          SUB EAX,ESI
004933DC   .  3B05 B4EA4B00 CMP EAX,DWORD PTR DS:[4BEAB4]
004933E2   .  74 38         JE SHORT 电视剧下.0049341C
004933E4   .  68 00364900   PUSH 电视剧下.00493600                       ;  REG!Wrong!

其实上面还有一段获取机器码的过程,偷一下懒不看了,有兴趣的朋友自己去研究,我们直接看算法:
00408784  /$  53            PUSH EBX
00408785  |.  56            PUSH ESI
00408786  |.  83C4 F4       ADD ESP,-0C                            //ESP-C
00408789  |.  8BD8          MOV EBX,EAX                            //EBX=EAX
0040878B  |.  8BD4          MOV EDX,ESP                            //EDX=ESP
0040878D  |.  8BC3          MOV EAX,EBX                            //EAX=EBX
0040878F  |.  E8 08A6FFFF   CALL 电视剧下.00402D9C               ;  关键CALL,跟进
00408794  |.  8BF0          MOV ESI,EAX
00408796  |.  833C24 00     CMP DWORD PTR SS:[ESP],0
0040879A  |.  74 19         JE SHORT 电视剧下.004087B5
0040879C  |.  895C24 04     MOV DWORD PTR SS:[ESP+4],EBX
004087A0  |.  C64424 08 0B  MOV BYTE PTR SS:[ESP+8],0B
004087A5  |.  8D5424 04     LEA EDX,DWORD PTR SS:[ESP+4]
004087A9  |.  A1 ACEC4B00   MOV EAX,DWORD PTR DS:[4BECAC]
004087AE  |.  33C9          XOR ECX,ECX
004087B0  |.  E8 33F9FFFF   CALL 电视剧下.004080E8
004087B5  |>  8BC6          MOV EAX,ESI
004087B7  |.  83C4 0C       ADD ESP,0C
004087BA  |.  5E            POP ESI
004087BB  |.  5B            POP EBX
004087BC  \.  C3            RETN

这里是关键,各寄存器的值
EAX 00D4ED64 ASCII "87654321"//输入的假码
ECX 0012F3DC
EDX 0012F5C8
EBX 00D4ED64 ASCII "87654321"
ESP 0012F5C4
EBP 0012F644
ESI 00B77800
EDI 0012F7C0

00402D9C  /$  53            PUSH EBX
00402D9D  |.  56            PUSH ESI
00402D9E  |.  57            PUSH EDI                            //保存环境变量
00402D9F  |.  89C6          MOV ESI,EAX                         //ESI=EAX=假码
00402DA1  |.  50            PUSH EAX                            //EAX入栈
00402DA2  |.  85C0          TEST EAX,EAX                         
00402DA4  |.  74 6C         JE SHORT 电视剧下.00402E12
00402DA6  |.  31C0          XOR EAX,EAX                          //EAX清零
00402DA8  |.  31DB          XOR EBX,EBX                          //EBX清零
00402DAA  |.  BF CCCCCC0C   MOV EDI,0CCCCCCC                     //给EDI赋值 
00402DAF  |>  8A1E          /MOV BL,BYTE PTR DS:[ESI]            //取假码第一位
00402DB1  |.  46            |INC ESI                             //假码减一位
00402DB2  |.  80FB 20       |CMP BL,20                           
00402DB5  |.^ 74 F8         \JE SHORT 电视剧下.00402DAF          //如果是空格则循环取
00402DB7  |.  B5 00         MOV CH,0                             //ECX=1200DC
00402DB9  |.  80FB 2D       CMP BL,2D 
00402DBC  |.  74 62         JE SHORT 电视剧下.00402E20           //是符号-则跳
00402DBE  |.  80FB 2B       CMP BL,2B
00402DC1  |.  74 5F         JE SHORT 电视剧下.00402E22           //是符号+则跳
00402DC3  |>  80FB 24       CMP BL,24
00402DC6  |.  74 5F         JE SHORT 电视剧下.00402E27           //是符号$则跳
00402DC8  |.  80FB 78       CMP BL,78
00402DCB  |.  74 5A         JE SHORT 电视剧下.00402E27           //是字母x则跳
00402DCD  |.  80FB 58       CMP BL,58
00402DD0  |.  74 55         JE SHORT 电视剧下.00402E27           //是字母X则跳
00402DD2  |.  80FB 30       CMP BL,30
00402DD5  |.  75 13         JNZ SHORT 电视剧下.00402DEA          //不是零则跳去做比较
00402DD7  |.  8A1E          MOV BL,BYTE PTR DS:[ESI]
00402DD9  |.  46            INC ESI
00402DDA  |.  80FB 78       CMP BL,78
00402DDD  |.  74 48         JE SHORT 电视剧下.00402E27
00402DDF  |.  80FB 58       CMP BL,58
00402DE2  |.  74 43         JE SHORT 电视剧下.00402E27
00402DE4  |.  84DB          TEST BL,BL
00402DE6  |.  74 20         JE SHORT 电视剧下.00402E08
00402DE8  |.  EB 04         JMP SHORT 电视剧下.00402DEE
00402DEA  |>  84DB          TEST BL,BL                           //跳到这里
00402DEC  |.  74 2D         JE SHORT 电视剧下.00402E1B           //检查是否注册码只有一位
00402DEE  |>  80EB 30       /SUB BL,30                           //第一位注册码为8,则38-30=8

放入EBX
00402DF1  |.  80FB 09       |CMP BL,9             
00402DF4  |.  77 25         |JA SHORT 电视剧下.00402E1B          //是英文字母则直接跳向出错
00402DF6  |.  39F8          |CMP EAX,EDI
00402DF8  |.  77 21         |JA SHORT 电视剧下.00402E1B          //比0CCCCCCC大则跳向出错
00402DFA  |.  8D0480        |LEA EAX,DWORD PTR DS:[EAX+EAX*4>    //EAX=EAX+EAX*4
00402DFD  |.  01C0          |ADD EAX,EAX                         //EAX=EAX*2
00402DFF  |.  01D8          |ADD EAX,EBX                         //EAX=EAX+EBX
00402E01  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]            //取下一位假码
00402E03  |.  46            |INC ESI
00402E04  |.  84DB          |TEST BL,BL
00402E06  |.^ 75 E6         \JNZ SHORT 电视剧下.00402DEE         //有假码则循环,无则走下去   

 
00402E08  |>  FECD          DEC CH                               //ECX=12FFDC
00402E0A  |.  74 09         JE SHORT 电视剧下.00402E15
00402E0C  |.  85C0          TEST EAX,EAX
00402E0E  |.  7D 54         JGE SHORT 电视剧下.00402E64          //跳向出口,准备下一步运算
00402E10  |.  EB 09         JMP SHORT 电视剧下.00402E1B
00402E12  |>  46            INC ESI
00402E13  |.  EB 06         JMP SHORT 电视剧下.00402E1B
00402E15  |>  F7D8          NEG EAX
00402E17  |.  7E 4B         JLE SHORT 电视剧下.00402E64
00402E19  |.  78 49         JS SHORT 电视剧下.00402E64
00402E1B  |>  5B            POP EBX                          ;  Default case of switch 

00402E3B
00402E1C  |.  29DE          SUB ESI,EBX
00402E1E  |.  EB 47         JMP SHORT 电视剧下.00402E67
00402E20  |>  FEC5          INC CH
00402E22  |>  8A1E          MOV BL,BYTE PTR DS:[ESI]
00402E24  |.  46            INC ESI
00402E25  |.^ EB 9C         JMP SHORT 电视剧下.00402DC3
00402E27  |>  BF FFFFFF0F   MOV EDI,0FFFFFFF
00402E2C  |.  8A1E          MOV BL,BYTE PTR DS:[ESI]
00402E2E  |.  46            INC ESI
00402E2F  |.  84DB          TEST BL,BL
00402E31  |.^ 74 DF         JE SHORT 电视剧下.00402E12
00402E33  |>  80FB 61       /CMP BL,61
00402E36  |.  72 03         |JB SHORT 电视剧下.00402E3B
00402E38  |.  80EB 20       |SUB BL,20
00402E3B  |>  80EB 30       |SUB BL,30                       ;  Switch (cases 30..46)
00402E3E  |.  80FB 09       |CMP BL,9
00402E41  |.  76 0B         |JBE SHORT 电视剧下.00402E4E
00402E43  |.  80EB 11       |SUB BL,11
00402E46  |.  80FB 05       |CMP BL,5
00402E49  |.^ 77 D0         |JA SHORT 电视剧下.00402E1B
00402E4B  |.  80C3 0A       |ADD BL,0A                       ;  Cases 41 ('A'),42 ('B'),43 

('C'),44 ('D'),45 ('E'),46 ('F') of switch 00402E3B
00402E4E  |>  39F8          |CMP EAX,EDI                     ;  Cases 30 ('0'),31 ('1'),32 

('2'),33 ('3'),34 ('4'),35 ('5'),36 ('6'),37 ('7'),38 ('8'),39 ('9') of switch 00402E3B
00402E50  |.^ 77 C9         |JA SHORT 电视剧下.00402E1B
00402E52  |.  C1E0 04       |SHL EAX,4
00402E55  |.  01D8          |ADD EAX,EBX
00402E57  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]
00402E59  |.  46            |INC ESI
00402E5A  |.  84DB          |TEST BL,BL
00402E5C  |.^ 75 D5         \JNZ SHORT 电视剧下.00402E33
00402E5E  |.  FECD          DEC CH
00402E60  |.  75 02         JNZ SHORT 电视剧下.00402E64
00402E62  |.  F7D8          NEG EAX
00402E64  |>  59            POP ECX                            //恢复环境变量
00402E65  |.  31F6          XOR ESI,ESI                        //ESI清零
00402E67  |>  8932          MOV DWORD PTR DS:[EDX],ESI
00402E69  |.  5F            POP EDI
00402E6A  |.  5E            POP ESI
00402E6B  |.  5B            POP EBX
00402E6C  \.  C3            RETN

回到这里:
00408794  |.  8BF0          MOV ESI,EAX
00408796  |.  833C24 00     CMP DWORD PTR SS:[ESP],0           //这里Stack SS:[0012F5D4]

=00000000
0040879A  |.  74 19         JE SHORT 电视剧下.004087B5         //跳
0040879C  |.  895C24 04     MOV DWORD PTR SS:[ESP+4],EBX
004087A0  |.  C64424 08 0B  MOV BYTE PTR SS:[ESP+8],0B
004087A5  |.  8D5424 04     LEA EDX,DWORD PTR SS:[ESP+4]
004087A9  |.  A1 ACEC4B00   MOV EAX,DWORD PTR DS:[4BECAC]
004087AE  |.  33C9          XOR ECX,ECX
004087B0  |.  E8 33F9FFFF   CALL 电视剧下.004080E8
004087B5  |>  8BC6          MOV EAX,ESI                        //跳到这里
004087B7  |.  83C4 0C       ADD ESP,0C                         //ESP+C
004087BA  |.  5E            POP ESI
004087BB  |.  5B            POP EBX                            恢复环境变量
004087BC  \.  C3            RETN

然后单步跟踪,回来到这里
004933D6   .  8BD8          MOV EBX,EAX                        //EBX=EAX
004933D8   .  8BC3          MOV EAX,EBX                       
004933DA   .  2BC6          SUB EAX,ESI                        //EAX=EAX-ESI,ESI为序列号前六


004933DC   .  3B05 B4EA4B00 CMP EAX,DWORD PTR DS:[4BEAB4]      //DS:[004BEAB4]=00023F3A
004933E2   .  74 38         JE SHORT 电视剧下.0049341C         //相等则跳向成功,否则出错

整理一下注册码,关键是这段.
00402DEE  |>  80EB 30       /SUB BL,30                           //第一位注册码为8,则38-30=8

放入EBX
00402DF1  |.  80FB 09       |CMP BL,9             
00402DF4  |.  77 25         |JA SHORT 电视剧下.00402E1B          //是英文字母则直接跳向出错
00402DF6  |.  39F8          |CMP EAX,EDI
00402DF8  |.  77 21         |JA SHORT 电视剧下.00402E1B          //比0CCCCCCC大则跳向出错
00402DFA  |.  8D0480        |LEA EAX,DWORD PTR DS:[EAX+EAX*4>    //EAX=EAX+EAX*4
00402DFD  |.  01C0          |ADD EAX,EAX                         //EAX=EAX*2
00402DFF  |.  01D8          |ADD EAX,EBX                         //EAX=EAX+EBX
00402E01  |.  8A1E          |MOV BL,BYTE PTR DS:[ESI]            //取下一位假码
00402E03  |.  46            |INC ESI
00402E04  |.  84DB          |TEST BL,BL
00402E06  |.^ 75 E6         \JNZ SHORT 电视剧下.00402DEE 

很容易可以发现,注册码是EAX=ESI+00023F3A,而ESI是序列号前前六位,后者好像是一个固定的值.

接下来把EAX转换成十进制就是我们需要输入的注册码.

注册机:(这里要谢谢小虾的帮助^_^) 
Dim x, z, a, b, m As String
Private Sub Command1_Click()
x = Text1.Text
If x = "" Then
MsgBox "请输入序列号^_^", 64, "注意"
Else
a = "23f3a"
z = Mid(x, 1, 6)
m = Format("&h" + z)
b = Format("&h" + a)
y = Val(m) + Val(b)
Text2.Text = y
End If
End Sub
(此注册机支持最新的星空电影院 V2.06^_^)
刚开始学汇编和VB,写的有点乱,大家不要笑啊,感谢您耐心读完全文.

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

【版权声明】转载请注明作者以及确保文章完整性,谢谢