利用飞信制作免费短信提醒(一)
最近在网上看到很牛人发布的分析的飞信协议的确很不错,只是让人不快的是只提供一些做好的接口或成品exe,用户难免会为自己飞信密码担心是否安全。在接下来的时间决定写一个小程序以实现飞信在登陆到发送短信过程中的各个环节。
根据前面各位牛人的经验步骤我这里就省略不说了,对于抓包工具是采用的自制的NetworkLook程序,将包并存到记事本进行分析。
第一步:向SSIPortal登录
请求地址:https://nav.fetion.com.cn/ssiportal/SSIAppSignIn.aspx?mobileno=134XXXXXXXX&pwd=XXXX
目的:通过手机号及密码获取自己的飞信号,同时获取请求中cookie中的SSIC值,这个值将去在后面的web请求中用到。
第二步:与服务器221.176.31.1第一次通信
当然并不一定是这个地址。这个地址可以通过 以POST(我是用的Post)Nav.fetion.com.cn/nav/getsystemconfig.aspx获取系统的详细服务器地址。
发此地址发送:
F: 641142419
I: 1
Q: 1 R
L: 249
<args><device type="PC" version="0" client-version="3.3.0370" /><caps value="simple-im;im-session;temp-group;personal-group" /><events value="contact;permission;system-message;personal-group" /><user-info attributes="all" /><presence><basic value="400" desc="" /></presence></args>
此时服务器会返回一个带有nonce值的回复串。
第三步:与服务器221.176.31.1第二次通信(登陆)
本次通信将用到第一次通信的nonce值与飞信号,飞信密码,以及飞信的Hash密码,计算机一个response
计算方式(引用nathan2007)为:
计算response和cnonce需要用到sid(飞信号)、password、domain(fetion.com.cn)、nonce。飞信计算cnonce是用了4个随机数组成一个16进制的字符串然后求这个字符串的MD5,responce的计算方法是:
1.求"sid:domain:passwd"这个utf8字符串的MD5值,得出key
2.求"key:nonce:cnonce"这个utf8字符串的MD5字符串,得出H1
3.求“REGISTER:sid"这个utf8字符串的MD5字符串,得出H2
4.求"H1:nonce:H2"这个utf8字符串的MD5字符串,即为response.
R fetion.com.cn SIP-C/2.0
F: 641142419
I: 1
Q: 2 R
A: Digest response="xxxxxxxxxxxxxxx",cnonce="xxxxxxxxxxxxxxxx" ----------(cnonce为四个随机数加密码得来)
L: 249
<args><device type="PC" version="0" client-version="3.3.0370" /><caps value="simple-im;im-session;temp-group;personal-group" /><events value="contact;permission;system-message;personal-group" /><user-info attributes="all" /><presence><basic value="400" desc="" /></presence></args>
请求后,便可以登陆了。
此处先布一个测试。
http://www.tech138.cn/sms/default.aspx
计算Hash密码:
public class HashPasswod
{
public static string DoHashPassword(byte[] password)
{
byte[] bytes = BitConverter.GetBytes(Environment.TickCount);
return DoHashPassword(password, bytes);
}
public static string DoHashPassword(string pwd)
{
char[] chars = pwd.ToCharArray();
return DoHashPassword(Encoding.UTF8.GetBytes(chars));
}
public static string DoHashPassword(byte[] password, byte[] b0)
{
using (SHA1 sha = SHA1.Create())
{
byte[] src = sha.ComputeHash(password);
for (int i = 0; i < password.Length; i++)
{
password[i] = 0;
}
byte[] dst = new byte[b0.Length + src.Length];
Buffer.BlockCopy(b0, 0, dst, 0, b0.Length);
Buffer.BlockCopy(src, 0, dst, b0.Length, src.Length);
byte[] buffer3 = sha.ComputeHash(dst);
byte[] buffer4 = new byte[b0.Length + buffer3.Length];
Buffer.BlockCopy(b0, 0, buffer4, 0, b0.Length);
Buffer.BlockCopy(buffer3, 0, buffer4, b0.Length, buffer3.Length);
return ComputeAuthResponse.BinaryToHex(buffer4);
}
}
}
其它代码有点乱,明天整理一下在发布。Demo源码也将一起发布.
http://www.tech138.cn/sms/default.aspx(发关短信时中文有异常)