【破文标题】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的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考。
[    post]【破解声明】高手请飘过~~~
------------------------------------------------------------------------
【破解过程】安装软件运行一下看看,出现窗口提示: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

运行程序,并试着注册,我用xxhy和123456进行注册,OK前下对话框架断点,OK后程序断在下面:
77D507EA >  8BFF            MOV EDI,EDI
77D507EC    55              PUSH EBP

清除断点,ALT+F9后出现注册失败的对话框,确定后来到这里:
0045409C  |.  85F6          TEST ESI,ESI                             ;  pro.00496604
0045409E  |.  8BF8          MOV EDI,EAX

向上返回一直到这里:
0042EB1C   . /E9 D8000000   JMP pro.0042EBF9
0042EB21   > |8B87 D9000000 MOV EAX,DWORD PTR DS:[EDI+D9]

这里是算法关键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


就在这里下断了,再次注册程序停在此处,F8单步向下走:

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
------------------------------------------------------------------------
【版权声明】本文只是出于学习和交流目的,请勿用于商业用途,否则后果自负。软件版权归作者所有。

  • 标 题:答复
  • 作 者:sando
  • 时 间:2009-06-06 09:00

我很久以前写的Telport pro 注册机,也是VB写的,比较短,算法没有变。

Function stringchange(ssource) As String
Dim stri As String
Dim counter As Integer
stri = ""
For counter = 1 To 4
stri = stri & Hex(Asc(Right(ssource, counter)))
Next counter
stringchange = Val("&H" & stri)
End Function


Private Sub Command1_Click()
Dim stri, text, result As String
Dim i, lenth As Integer
lenth = Len(Text1.text)
If lenth < 5 Then
MsgBox "请输入五位以上的用户名!", vbOKOnly, "错误"
Else
text = Text1.text
result = stringchange(Mid(text, 1, 4)) Xor 1576985764
For i = 2 To lenth - 4
stri = Mid(text, i, 4)
result = result Xor stringchange(stri)
Next i
Text2.text = result
End If
End Sub
Private Sub Command2_Click()
MsgBox "Teleport Pro 注册机,适合Teleport Pro V1.56,其他版本请自行测试。" + Chr(13) + "本软件仅供学习与研究之用,请勿用于商业用途。" + Chr(13) + "由本软件造成的损失,本人概不负责。" + Chr(13) & Chr(13) + "作者:sando      * 2009.03 *", vbOKOnly, "关于"
End Sub