现在越来越多厂家经常劫持用户机器的浏览器首页,今天给出360浏览器的主页设置算法一些分析。
360浏览器设置主页大致有两次计算机器码:一次是磁盘id,一次是计算网卡mac地址。两种md5计算方法,两次网页拼接设置主页与md51的结果,再次计算md52,两次分别得到的md52的结果再次与设置主页拼接并计算base64的编码最后写入注册表,过程很曲折,接下来我们仔细往下看。以下是列举出计算磁盘id组合生成md5的过程:
现在我们开始设置,下面是使用ollydbg截获的设置函数
我们看到一串字符串”software\360chrome\homepage”,这是360设置主页的注册表的位置。
继续跟踪:函数chrome.65b7E6CA
首先打开 “software\360chrome\homepage”的注册表。
然后计算硬件的机器吗的md5值{4dc99d403b2562e3b8e593ffe85b1ef0}:
然后拼接设置的主页+{4dc99d403b2562e3b8e593ffe85b1ef0}变成了http://www.baidu.com/{4dc99d403b2562e3b8e593ffe85b1ef0}
然后计算以上字符串的md5值:844232b6479fafa0800014bdff25d
到此计算得到的第一次拼接过程结束,还有第二次计算mac地址的机器码过程,暂时略过。两次过程得到结果再进行一次拼接:
“http://www.baidu.com/{844232b6479fafa08ba800014bdff25d}{40ee09ae51dab5e411741b80acd47150}“
最后计算的base64的编码结果:
“aHR0cDovL3d3dy5iYWlkdS5jb20vezg0NDIzMmI2NDc5ZmFmYTA4YmE4MDAwMTRiZGZmMjVkfXs0MGVlMDlhZTUxZGFiNWU0MTE3NDFiODBhY2Q0NzE1MH0=“
最后会把改字符串写入注册表的”Homepage”项目下:
至此整个设置过程计算,我们总结下大致算法:
wchar_t szUrl[MAX_PATH] = {0};
wchar_t szUrl_2[MAX_PATH ] = {0};
char Out[MAX_PATH] = {0};
char md51[32] = {0};
wchar_t umd51[MAX_PATH] = {'{',''};
wchar_t umd52[MAX_PATH] = {'{',''};
unsigned char harddisk[MAX_PATH] = {0};
unsigned char tmp2[16] = {0};
AnsiToUnicode( url , lstrlenA(url) , &szUrl[0] , MAX_PATH );
GetHardDiskId( (char*)harddisk );
do_md51( (unsigned char *)Out ,
20 ,
(unsigned char *)md51);
AnsiToUnicode( md51 , 32 , &umd51[1] , MAX_PATH );
umd51[33] = '}';
ZeroMemory( harddisk , MAX_PATH );
GetMACreg( (TCHAR*)harddisk );
do_md51(
harddisk ,
strlen((const char *)harddisk) ,
(unsigned char *)md51);
AnsiToUnicode( md51 , 32 , &umd52[1] , MAX_PATH );
umd52[33] = '}';
wsprintfW( szUrl_2 , L"%s%s" , szUrl, umd51 );
do_md52( (unsigned char*)&szUrl_2[0] ,
2*lstrlenW(szUrl_2),
(unsigned char *)md51 );
AnsiToUnicode( md51 , 32 , &umd51[1] , MAX_PATH );
wsprintfW( szUrl_2 , L"%s%s" , szUrl, umd52 );
do_md52( (unsigned char*)&szUrl_2[0] ,
2*lstrlenW(szUrl_2),
(unsigned char *)md51 );
AnsiToUnicode( md51 , 32 , &umd52[1] , MAX_PATH );
wsprintfW( szUrl_2 , L"%s%s%s" , szUrl, umd51,umd52 );
char* pcur = new char[MAX_PATH];
STLMemset(pcur , 0 , MAX_PATH);
UnicodeToAnsi( szUrl_2 ,2*lstrlenW(szUrl_2),pcur , MAX_PATH );
int url_size = lstrlen(pcur);
long out_size = MAX_PATH;
base64_encode( (const unsigned char *)&pcur[0] ,
url_size ,
(unsigned char *)Out ,
(unsigned long *)&out_size
);
我们验证下自己的算法结果。
计算http://www.123.com,得到的结果如下图。我们可以看到注册表里是 加密密文,跟踪调试了该算法后,写测试函数于是就有了:
把这些值填入360浏览器的对应的注册表HomePage设置,于是打开360的浏览器,看直接转到了自己填写的地址去了,打开。
验证结果成功!
最后申明:逆向是工具,是我们学习他人软件的方法,而不是用来做一些非法的事情。
*本文作者:浪子_三少,转载请注明来自FreeBuf.COM0day
文章评论