前言
注:
本文由楼主个人博客原创文章修改整理而来,菜鸟技术,大神莫喷。
首先抓包一下 然后我们一个一个数据包分析,今天仅仅分析密码加密。地址进行了一定的处理
第一个包
http://www.baidu.com/cmps/login.php/ppi/authIdentity
version=1.0.9.23&name=13788888888
可以看到第一个数据包仅仅发送了version和name分别为版本和手机号
{"resultCode":0,"resultMsg":"","data":"{\"challege_id\":\"*************************\"}"}
验证成功则返回了一个Challege_id
我们可以冷静的忽略
第二个包
http://www.baidu.com/cmps/login.php/ppi/authChallege
version=1.0.9.23&mac=13:24:73:45:a7:b6&ip=172.36.27.14&name=13788888888&algorithm=1&challege=MAT7I3z6N5DCUa2K&gw_address=192.168.1.1&gw_id=GEXE&ap_mac=&sta_type=pc&sta_model='Microsoft Windows 10, 64-bit'&sta_nic_type=0
mac=13:24:73:45:a7:b6是我们的mac地址
ip=172.36.27.14是我们的局域网ip地址
name=13788888888是我们的手机号
challege=MAT7I3z6N5DCUa2K应该是密码的加密
gw_address=192.168.1.1是服务器地址
sta_model='Microsoft Windows 10, 64-bit'收集了我们的电脑端版本以及是不是pc(pc和手机版网速不一致)
那么我们主要分析challege
搜索一下文本找到了
中文搜索引擎, 条目 854
地址=004328CF
文本字符串=version=%s&mac=%s&ip=%s&name=%s&algorithm=%d&challege=%s&gw_address=%s&gw_id=%s&ap_mac=%s&sta_type=%s&sta_model=%s&sta_nic_type=%d4
然后往上下断点慢慢找 发现一个我们的密码和token会传入
[Asm] 纯文本查看 复制代码 004327C7 |. 68 B1000000 push 0xB1
004327CC |. 8D85 1CE5FFFF lea eax,[local.1721]
004327D2 |. 50 push eax
004327D3 |. E8 283CFEFF call GiWiFiAs.00416400
004327D8 |. 83C4 08 add esp,0x8
我们进入这个call
[Asm] 纯文本查看 复制代码 0042FDCE |. /EB 0F jmp short GiWiFiAs.0042FDDF ; 计算开始
0042FDD0 |> |8B85 28FEFFFF /mov eax,[local.118] ; eax=0
0042FDD6 |. |83C0 01 |add eax,0x1 ; eax=1
0042FDD9 |. |8985 28FEFFFF |mov [local.118],eax ; 118=1
0042FDDF |> \8B85 28FEFFFF mov eax,[local.118]
0042FDE5 |. 3B85 34FEFFFF |cmp eax,[local.115]
0042FDEB |. 7D 3C |jge short GiWiFiAs.0042FE29
0042FDED |. 8B85 28FEFFFF |mov eax,[local.118]
0042FDF3 |. 8B8D 28FEFFFF |mov ecx,[local.118]
0042FDF9 |. 8A940D 64FEFF>|mov dl,byte ptr ss:[ebp+ecx-0x19C]
0042FE00 |. 889445 F8FEFF>|mov byte ptr ss:[ebp+eax*2-0x108],dl
0042FE07 |. 8B85 40FEFFFF |mov eax,[local.112]
0042FE0D |. 2B85 28FEFFFF |sub eax,[local.118]
0042FE13 |. 8B8D 28FEFFFF |mov ecx,[local.118]
0042FE19 |. 8B55 0C |mov edx,[arg.2]
0042FE1C |. 8A4402 FF |mov al,byte ptr ds:[edx+eax-0x1]
0042FE20 |. 88844D F9FEFF>|mov byte ptr ss:[ebp+ecx*2-0x107],al
0042FE27 |.^ EB A7 \jmp short GiWiFiAs.0042FDD0
发现这里会混杂我们的token和已经加密过的密码
0042FE1C |. 8A4402 FF |mov al,byte ptr ds:[edx+eax-0x1]
0042FE20 |. 88844D F9FEFF>|mov byte ptr ss:[ebp+ecx*2-0x107],al
负责放入token 因为是edx+eax-0x1 eax eax初始为十六进制的20 (十进制32) 随后慢慢递减
0042FDF9 |. 8A940D 64FEFF>|mov dl,byte ptr ss:[ebp+ecx-0x19C]
0042FE00 |. 889445 F8FEFF>|mov byte ptr ss:[ebp+eax*2-0x108],dl
负责放入加密后的密码
我们继续往上找寻找加密密码的call
找到了00432835 |. E8 46D4FFFF call GiWiFiAs.0042FC80
然后我们进入找到计算的call 可以分析一下
这样我们就可以写出来加密密码的代码
[C++] 纯文本查看 复制代码 #include<iostream>
#include <string>
using namespace std;
string calPass(string Pass);
string MakeTempPass(int TempPass);
string GetChallge(string MakePass, string TokenChallge);
int main()
{
cout<<GetChallge(calPass("123456"), "12sax1a1x5sa1da2w864t8hf1h5tf2bf1");
cin.get();
}
string calPass(string Pass)
{
string Res="";
int temps=0;
for (int i = 1; i <= Pass.length(); i++)
{
temps=temps ^ Pass[i-1];
if (i%3==0)
{
Res+=MakeTempPass(temps);
}
temps=temps << 8;
}
return Res;
}
string MakeTempPass(int TempPass)
{
string Res="";
string Charlist = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456";
int Temp = 0;
for (size_t i = 0; i <4; i++)
{
Temp = (TempPass >> ((3 - i)*6))&0x3F;
Res += Charlist[Temp];
}
return Res;
}
string GetChallge(string MakePass, string TokenChallge)
{
string res = "";
for (size_t i = 0; i < MakePass.length(); i++)
{
res += MakePass[i];
res += TokenChallge[31 - i];
}
return res;
}
密码与客户端计算一致
|