【破文标题】Teleport Pro 1.60破解分析及算法注册机
【破文作者】萧萧黄叶
【作者邮箱】
【作者主页】
【破解工具】OllyICE,PEiD v0.94
【破解平台】WinXP
【软件名称】Teleport Pro 1.60
【更新时间】 2009-03-19
【软件类别】 国外软件 / 离线浏览
【软件语言】 英文
【应用平台】 Win9x/WinNT/Win2000/WinXP
【软件性质】 共享(收费)软件
【软件大小】819 K
【原版下载】http://www1.skycn.com/soft/197.html
【保护方式】
【软件简介】Teleport Pro 所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考。
【破解声明】高手请飘过~~~
------------------------------------------------------------------------
【破解过程】安装软件运行一下看看,出现窗口提示:This copy of Teleport Pro is UNREGISTERED.
试着注册看看,当然失败:You haven't entered a valid username. Your username must be at least six letters long.
下面开始分析了。
第一步当然是探壳,PEiD v0.94:Microsoft Visual C++ 6.0
第二步用C32Asm反汇编,载入后自动退出。
第三步用OllyICE分析。
这里是程序入口处:
00436473 >/$ 55 PUSH EBP
00436474 |. 8BEC MOV EBP,ESP
这里是算法关键CALL和关键跳的中心部位,因为OD已经为我们作出了一些分析,在上上下下的注释中出现了很有价值的提示,如:
DS:[0048C22C]=00491894 (pro.00491894), ASCII "Thank you! Your copy of Teleport Pro is now registered. All limits have been removed."
when you entered it on the"...
DS:[0048C2AC]=00490DBC (pro.00490DBC), ASCII "We're sorry! The registration number you entered appears to be invalid. Please check both your name and the registration code and try entering them again. (Your name must be spelled exactly as you spelled it when you entered it on the"...
跳转来自 0042EB07
0042EA8B . 8BF9 MOV EDI,ECX
0042EA8D . 6A 01 PUSH 1
0042EA8F . E8 B1CE0100 CALL pro.0044B945 ; 取出了注册码
0042EA94 . 8B87 D9000000 MOV EAX,DWORD PTR DS:[EDI+D9]
0042EA9A . 33DB XOR EBX,EBX
0042EA9C . 6A 0A PUSH 0A
0042EA9E . 53 PUSH EBX
0042EA9F . 50 PUSH EAX
0042EAA0 . E8 40670000 CALL pro.004351E5 ; 将注册码从十进制转换为十六进制,并放在EAX上。我的为0001E2405。
0042EAA5 . 8BF0 MOV ESI,EAX
0042EAA7 . A1 845D4900 MOV EAX,DWORD PTR DS:[495D84]
0042EAAC . 83C4 0C ADD ESP,0C
0042EAAF . 897424 10 MOV DWORD PTR SS:[ESP+10],ESI
0042EAB3 . 3898 CD040000 CMP BYTE PTR DS:[EAX+4CD],BL
0042EAB9 0F84 33010000 JE pro.0042EBF2
0042EABF . 3BF3 CMP ESI,EBX
0042EAC1 . BD 10B54800 MOV EBP,pro.0048B510 ; ASCII "User"
0042EAC6 74 59 JE SHORT pro.0042EB21 ; 如果注册码为空则跳走。
0042EAC8 . FFB7 D5000000 PUSH DWORD PTR DS:[EDI+D5] ; 取用户名。
0042EACE . E8 AE090000 CALL pro.0042F481 ; 用户名转换的关键部位。跟进!
0042EAD3 . 3BF0 CMP ESI,EAX ; 用户名经过计算后的结果与注册码的十六进制形式进行对比,相等则不跳,一跳就死!
0042EAD5 . 59 POP ECX
0042EAD6 75 0F JNZ SHORT pro.0042EAE7 ; 注册关键跳。
0042EAD8 . 53 PUSH EBX ; /Arg3
0042EAD9 . 53 PUSH EBX ; |Arg2
0042EADA . FF35 2CC24800 PUSH DWORD PTR DS:[48C22C] ; |Arg1 = 00491894 ASCII "Thank you! Your copy of Teleport Pro is now registered. All limits have been removed."
0042EAE0 . E8 E6550200 CALL pro.004540CB ; \pro.004540CB
0042EAE5 . EB 75 JMP SHORT pro.0042EB5C
0042EAE7 > 8BBF D5000000 MOV EDI,DWORD PTR DS:[EDI+D5]
0042EAED . 395F F8 CMP DWORD PTR DS:[EDI-8],EBX
0042EAF0 . 75 0A JNZ SHORT pro.0042EAFC
0042EAF2 . 53 PUSH EBX
0042EAF3 . 53 PUSH EBX
0042EAF4 . FF35 A4C24800 PUSH DWORD PTR DS:[48C2A4] ; pro.00490F2C
0042EAFA . EB 1B JMP SHORT pro.0042EB17
0042EAFC > 57 PUSH EDI
0042EAFD . E8 7F090000 CALL pro.0042F481
0042EB02 . 59 POP ECX
0042EB03 . 85C0 TEST EAX,EAX
0042EB05 . 53 PUSH EBX
0042EB06 . 53 PUSH EBX
0042EB07 . 75 08 JNZ SHORT pro.0042EB11
0042EB09 . FF35 A8C24800 PUSH DWORD PTR DS:[48C2A8] ; pro.00490ED4
0042EB0F . EB 06 JMP SHORT pro.0042EB17
0042EB11 > FF35 ACC24800 PUSH DWORD PTR DS:[48C2AC] ; |Arg1 = 00490DBC ASCII "We're sorry! The registration number you entered appears to be invalid. Please check both your name and the registration code and try entering them again. (Your name must be spelled exactly as you spelled it when you "...
0042EB17 > E8 AF550200 CALL pro.004540CB ; \pro.004540CB
0042EB1C . E9 D8000000 JMP pro.0042EBF9
0042EB21 > 8B87 D9000000 MOV EAX,DWORD PTR DS:[EDI+D9]
0042EB27 . BE 70B74800 MOV ESI,pro.0048B770 ; ASCII "For Evaluation Only"
0042EB2C . 56 PUSH ESI
跟进0042EACE处的CALL pro.0042F481
0042F481 /$ 57 PUSH EDI
0042F482 |. 8B7C24 08 MOV EDI,DWORD PTR SS:[ESP+8]
0042F486 |. 85FF TEST EDI,EDI
0042F488 |. 74 09 JE SHORT pro.0042F493 ; 将用户名放到EDI上,如为空则跳走。
0042F48A |. 57 PUSH EDI
0042F48B |. E8 C0580000 CALL pro.00434D50 ; 计算用户名的位数。
0042F490 |. 59 POP ECX
0042F491 |. EB 02 JMP SHORT pro.0042F495
0042F493 |> 33C0 XOR EAX,EAX
0042F495 |> 83F8 05 CMP EAX,5
0042F498 |. 73 04 JNB SHORT pro.0042F49E ; 用户名的位数如小于5位则不跳,EAX等于0,不跳就死!我要重新来过,修改用户名为xxhyy。
0042F49A |. 33C0 XOR EAX,EAX
0042F49C |. 5F POP EDI
0042F49D |. C3 RETN
0042F49E |> 53 PUSH EBX ; 跳转成功来到这里。
0042F49F |. 56 PUSH ESI
0042F4A0 |. BE A4E4FE5D MOV ESI,5DFEE4A4 ; 取一个数值放在ESI上。
0042F4A5 |. 33DB XOR EBX,EBX
0042F4A7 |> 85FF /TEST EDI,EDI
0042F4A9 |. 74 09 |JE SHORT pro.0042F4B4
0042F4AB |. 57 |PUSH EDI
0042F4AC |. E8 9F580000 |CALL pro.00434D50
0042F4B1 |. 59 |POP ECX
0042F4B2 |. EB 02 |JMP SHORT pro.0042F4B6
0042F4B4 |> 33C0 |XOR EAX,EAX
0042F4B6 |> 83C0 FC |ADD EAX,-4
0042F4B9 |. 3BD8 |CMP EBX,EAX
0042F4BB |. 73 0C |JNB SHORT pro.0042F4C9 ; 用户名位数加上-4,结果如为小于等于EBX则跳走,起初EBX=0
0042F4BD |. 33343B |XOR ESI,DWORD PTR DS:[EBX+EDI] ; 将用户名前四个倒序取其ASCII码与ESI作异或运算,结果仍放在ESI上,用于下一次运算。
0042F4C0 |. F6C3 40 |TEST BL,40
0042F4C3 |. 74 01 |JE SHORT pro.0042F4C6
0042F4C5 |. 43 |INC EBX
0042F4C6 |> 43 |INC EBX ; EBX=EBX+1
0042F4C7 |.^ EB DE \JMP SHORT pro.0042F4A7
0042F4C9 |> 8BC6 MOV EAX,ESI ; 最后ESI的值放到EAX上。我的结果为:24969CDC
0042F4CB |. 5E POP ESI
0042F4CC |. 5B POP EBX
0042F4CD |. 5F POP EDI
0042F4CE \. C3 RETN
------------------------------------------------------------------------
【破解总结】1、算法
1)先对注册码进行转换,转换为十六进制。结果设为X。
2)先判断用户名位数是否大于四位,即不小于五位。
3)如果为五位从第一位起取四位的倒序的字符ASCII码,如为六位则在第一具四位取好后,再继续从第二位起取四位,依次类推,取出的值先与&H5DFEE4A4作异或运算,其结果留待下一次继续运算,如果运算结束其就是最后的值。设为Y。
4)对比X和Y,相等则注册成功,不相等则注册失败。
2、注册机源码
VB
Private Sub Command1_Click()
txt1 = Text1.Text
For i = 1 To Len(txt1)
txt1_0 = Hex(Asc(Mid(txt1, i, 1)))
txt1_1 = txt1_1 & txt1_0
Next
For i = 1 To Len(txt1_1) Step 2
txt1_3 = Mid(txt1_1, i, 2)
txt1_2 = txt1_3 & txt1_2
Next
If Len(txt1_1) > 8 Then
int1_1 = &H5DFE
int1_2 = &HE4A4
n = 0
For m = 1 To Len(txt1_2) Step 2
int2 = Mid(txt1_2, Len(txt1_2) - 6 - m, 8)
int2_1 = Left(int2, 4)
int2_2 = Right(int2, 4)
int1_1 = int1_1 Xor ("&H" & int2_1)
int1_2 = int1_2 Xor ("&H" & int2_2)
n = n + 1
If n >= (Len(txt1_2) / 2 - 4) Then
Exit For
End If
Next
int1_2 = Right(Hex(int1_2), 4)
txt2 = Hex(int1_1) & int1_2
For i = 1 To Len(txt2)
Select Case Mid(txt2, Len(txt2) - i + 1, 1)
Case "0": B = B + 16 ^ (i - 1) * 0
Case "1": B = B + 16 ^ (i - 1) * 1
Case "2": B = B + 16 ^ (i - 1) * 2
Case "3": B = B + 16 ^ (i - 1) * 3
Case "4": B = B + 16 ^ (i - 1) * 4
Case "5": B = B + 16 ^ (i - 1) * 5
Case "6": B = B + 16 ^ (i - 1) * 6
Case "7": B = B + 16 ^ (i - 1) * 7
Case "8": B = B + 16 ^ (i - 1) * 8
Case "9": B = B + 16 ^ (i - 1) * 9
Case "A": B = B + 16 ^ (i - 1) * 10
Case "B": B = B + 16 ^ (i - 1) * 11
Case "C": B = B + 16 ^ (i - 1) * 12
Case "D": B = B + 16 ^ (i - 1) * 13
Case "E": B = B + 16 ^ (i - 1) * 14
Case "F": B = B + 16 ^ (i - 1) * 15
End Select
Next i
Text2.Text = B
Else
Text2.Text = "请输入一个位数大于五位的英文名或大于两位的中文名!"
End If
End Sub
------------------------------------------------------------------------
【版权声明】本文只是出于学习和交流目的,请勿用于商业用途,否则后果自负。软件版权归作者所有。