• 标 题:Teleport Pro V1.29简单注册算法分析及注册机C++源码^_*
  • 作 者:cnbragon
  • 时 间:004-11-21,13:48
  • 链 接:http://bbs.pediy.com

不管难度如何,只要有货俺就发

Teleport Pro 所能做的,不仅仅是离线浏览某个网页(让你离线快速浏览某个网页的内容当然是它的一项重要功能),它可以从Internet的任何地方抓回你想要的任何文件,它可以在你指定的时间自动登录到你指定的网站下载你指定的内容,你还可以用它来创建某个网站的完整的镜象,作为创建你自己的网站的参考

Official WebSite:http://www.tenmax.com/

该软件的注册信息保存在
HKLM\\SoftWare\\Tennyson Maxwell\\Teleport pro
"Company"="REG_SZ"
"Name"="REG_SZ"(用户名)
"Registration"="REG_DWORD"(注册码)

该软件没有加壳,VC++编译,先用IDA分析了一下,导出.map文件,然后用Olldbg的LoadMap Plugin 导入.map,下断
bpx GetWindowTextA
断在
004511AE   |.  FF15 0CE54600      call dword ptr ds:[<&USER32.GetWindowTextA>]   ; \GetWindowTextA
004511B4   |.  8B4D 10            mov ecx,dword ptr ss:[ebp+10]
004511B7   |.  6A FF              push -1
004511B9   |.  E8 EA8DFFFF        call <pro.CString::ReleaseBuffer(int)>

0042C074    .  8B87 D9000000      mov eax,dword ptr ds:[edi+D9]  //假码
0042C07A    .  33DB               xor ebx,ebx
0042C07C    .  6A 0A              push 0A
0042C07E    .  53                 push ebx
0042C07F    .  50                 push eax
0042C080    .  E8 B0660000        call <pro._strtoul> //把假码转换为十六进制
0042C085    .  8BF0               mov esi,eax         //假码的十六进制值

0042C0AE    .  E8 BA090000        call <pro.sub_42CA6D>
{
0042CA6D <>/$  57                 push edi                                      ;  
0042CA6E   |.  8B7C24 08          mov edi,dword ptr ss:[esp+8]
0042CA72   |.  85FF               test edi,edi
0042CA74   |.  74 09              je short <pro.loc_42CA7F>
0042CA76   |.  57                 push edi
0042CA77   |.  E8 14590000        call <pro._strlen>
0042CA7C   |.  59                 pop ecx
0042CA7D   |.  EB 02              jmp short <pro.loc_42CA81>
0042CA7F <>|>  33C0               xor eax,eax                                   ;  
0042CA81 <>|>  83F8 05            cmp eax,5                                     ;  用户名长度是不是小于5
0042CA84   |.  73 04              jnb short <pro.loc_42CA8A>
0042CA86   |.  33C0               xor eax,eax
0042CA88   |.  5F                 pop edi
0042CA89   |.  C3                 retn
0042CA8A <>|>  53                 push ebx                                      ;  
0042CA8B   |.  56                 push esi
0042CA8C   |.  BE A4E4FE5D        mov esi,5DFEE4A4                              ;  初始参数
0042CA91   |.  33DB               xor ebx,ebx
0042CA93 <>|>  85FF               /test edi,edi                                 ;  
0042CA95   |.  74 09              |je short <pro.loc_42CAA0>
0042CA97   |.  57                 |push edi                                     ;用户名
0042CA98   |.  E8 F3580000        |call <pro._strlen>                           ;用户名的长度
0042CA9D   |.  59                 |pop ecx
0042CA9E   |.  EB 02              |jmp short <pro.loc_42CAA2>
0042CAA0 <>|>  33C0               |xor eax,eax                                  ;  
0042CAA2 <>|>  83C0 FC            |add eax,-4                                   ;  循环用户名长度减4次
0042CAA5   |.  3BD8               |cmp ebx,eax
0042CAA7   |.  73 0C              |jnb short <pro.loc_42CAB5>
0042CAA9   |.  33343B             |xor esi,dword ptr ds:[ebx+edi]               ;用户名4位4位的和初始的0x5DFEE4A4 XOR
...........................................................................
比如我的用户名Cnbragon,stlen(Cnbragon)=8,那么就循环4次,
第一次用0x72626E43(rbnC) XOR 0x5DFEE4A4=0x2F9C8AE7
第二次用0x6172626E(arbn) XOR 0x2F9C8AE7=0x4EEEE889
第三次用0x67617262(garb) XOR 0x4EEEE889=0x298F9AEB
第四次用0x6F676172(ogar) XOR 0x298F9AEB=0x46E8FB99
这第四次XOR的结果就是注册码的十六进制值
.............................................................................
0042CAAC   |.  F6C3 40            |test bl,40
0042CAAF   |.  74 01              |je short <pro.loc_42CAB2>
0042CAB1   |.  43                 |inc ebx
0042CAB2 <>|>  43                 |inc ebx                                      ;  
0042CAB3   |.^ EB DE              \jmp short <pro.loc_42CA93>
0042CAB5 <>|>  8BC6               mov eax,esi                                   ;  
0042CAB7   |.  5E                 pop esi
0042CAB8   |.  5B                 pop ebx
0042CAB9   |.  5F                 pop edi
0042CABA   \.  C3                 retn
}
0042C0B3    .  3BF0               cmp esi,eax  ;eax是对用户名的处理结果,esi是对注册码处理的结果

简单的用C++写了注册机,VS.net下编译通过

#include <iostream.h>
#include <string.h>

typedef unsigned long int UINT4;

main()
{
  char name[64]={'0'};
  UINT4 arg=0x5DFEE4A4;
  UINT4 temp;
  UINT4 sn;
  cout<<"Please input Your name:"<<endl;
  cin>>name;
  int length;
  length=strlen(name);
  if(length<5)
  {
    cout<<"The Length of Your name must >=5"<<endl;
    return -1;
  }
  for(int i=0;i<length-4;i++)
  {
    temp=((UINT4(name[i]))|(UINT4(name[i+1])<<8)|(UINT4(name[i+2])<<16)|(UINT4(name[i+3])<<24));
    arg=temp^arg;
  }
  sn=arg;
  cout<<sn;
}