不管难度如何,只要有货俺就发
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;
}