中国移动飞信协议分析
登录
POST /nav/getsystemconfig.aspx HTTP/1.1
User-Agent:IIC2.0/PC2.2.0230
Content-Type:application/x-www-form-urlencode;charset=utf-8
Host:nav.fetion.com.cn
Content-Length:75
Connection: Keep-AliveHTTP/1.1 100 Continue
<config><client type="PC" version="2.2.0230" platform="w5.1" /></config>
HTTP/1.1200OK
DATE:Wed,11Apr200708:19:39GMT
Server:Microsoft-IIS/6.0
X-Powered-By:ASP.NET
X-AspNet-Version:2.0.50727
Content-Language:zh-cn
Set-Cookie:ASP.NET_SessionId=3siqq555hhsjllshshsssw32;path=/;HttpOnly
Cache-Control:private
Content-Type:text/html;charset=utf-8
Content-Length: 202<?xml version="1.0" encoding="utf-8" ?><config><client version="2.0.0.0"><compatible>
2.0.0.0</compatible><date>2006-7-2718:48:27</date><pc-live-updatevalue="http://221.130.45.198/"/></client></config>
//此处返回升级服务器地址查看是否有升级
GET/UpdateInfo.ashx?Version=2.2.0230&Switch=HTTP/1.1
User-Agent:IIC2.0/PC2.2.0230
Host:221.130.45.198
Connection: Keep-AliveHTTP/1.1 204 No Content
Connection:close
Date:Wed,11Apr200708:19:39GMT
Server:Microsoft-IIS/6.0
X-Powered-By:ASP.NET
X-AspNet-Version:2.0.50727
Cache-Control:private
Content-Length: 0//开始取配置文件
POST/nav/getsystemconfig.aspxHTTP/1.1
User-Agent:IIC2.0/PC2.2.0230
Host:nav.fetion.com.cn
Content-Length:262
Connection: CloseHTTP/1.1 100 Continue
<config><user mobile-no="13412344321" /><client type="PC" version="2.2.0230" platform="W5.1"/><servers version="0"/><service-no version="0"/><parameters version="0" /><hints version="0" /><http-applications version="0" /><client-config version="0" /></config>
HTTP/1.1 200 OK
Connection:close
Date:Wed,11Apr200709:41:41GMT
Server:Microsoft-IIS/6.0
X-Powered-By:ASP.NET
X-AspNet-Version:2.0.50727
Content-Language:zh-cn
Set-Cookie:ASP.NET_SessionId=1lkl1h550rvost2ujpr0prfy;path=/;HttpOnly
Cache-Control:private
Content-Type:text/html;charset=utf-8
Content-Length: 5644<?xml version="1.0" encoding="utf-8" ?><config><servers version="12"><apply-sub-service>HTTP://221.130.45.201/nav/ApplySubscribe.aspx</apply-sub-service><crbt-portal>http://221.130.46.134/crbt/default.aspx</crbt-portal><get-general-info>HTTP://221.130.45.201/nav/GeneralGetInfo.aspx</get-general-info><get-pic-code>HTTP://221.130.45.201/nav/GetPicCode.aspx</get-pic-code><get-svc-order-status>HTTP://221.130.45.201/nav/GetSvcOrderStatus.aspx</get-svc-order-status><get-system-status>HTTP://221.130.45.201/nav/GetSystemStatus.aspx</get-system-status><get-uri>HTTP://221.130.45.205/hds/geturi.aspx</get-uri><http-tunnel>HTTP://221.130.45.203/ht/sd.aspx</http-tunnel><j2me-adapter></j2me-adapter><matching-portal></matching-portal><portal>http://www.fetion.com.cn/</portal><sipc-proxy>221.130.45.203:8080</sipc-proxy><ssi-app-sign-in>https://221.130.45.201/ssiportal/SSIAppSignIn.aspx</ssi-app-sign-in><ssi-app-sign-out>http://221.130.45.201/ssiportal/SSIAppSignOut.aspx</ssi-app-sign-out><sub-service>https://221.130.45.201/nav/Subscribe.aspx</sub-service></servers><service-no version="1"><help-desk>10086</help-desk><ivr>125862</ivr><mms></mms><rbt>12530</rbt><sms>161</sms></service-no><parameters version="4"><batch-sms-max-receivers>8</batch-sms-max-receivers><forbidden-share-content-type>exe;bat;cmd;msi</forbidden-share-content-type><ivr-invite-timeout>60</ivr-invite-timeout><max-ivr-participants>8</max-ivr-participants><max-msg-convert-sms>3</max-msg-convert-sms><max-msg-length>400</max-msg-length><max-share-content-size>10485760</max-share-content-size><max-sms-length>182</max-sms-length><max-sms-unicode>70</max-sms-unicode><offline-max-share-content-size>2048000</offline-max-share-content-size><portrait-file-type>image/pjpeg;image/jpeg;image/bmp;image/x-windows-bmp;image/png;image/gif</portrait-file-type><single-sms-max-length>70</single-sms-max-length><temp-group-max-share-content-size>2048000</temp-group-max-share-content-size><max-blacklist>128</max-blacklist><max-buddies>300</max-buddies><max-buddy-list>64</max-buddy-list><max-chat-buddies>20</max-chat-buddies></parameters><hints version="4"><i-not-log-on>您没有登录,不能发送消息</i-not-log-on><i-not-online>您当前的状态设置为“{0}”</i-not-online><participants-not-online>一些参与者可能无法及时回复 您的消息</participants-not-online><user-busy>{0}可能无法及时回复您的消息,因为{1}的状态为{2}。</user-busy><user-in-blacklist>对方在您的黑名单中,您不能和他会话</user-in-blacklist><user-offline>{0}已离线,不能立即收到您的消息。 您发送的消息将被保存下来并延迟发送。</user-offline><user-sms-status>{0}没有登录,您的消息将会以短信发送到对方的手机。每条消息最多{1}个字符,根据您输入的内容长度,消息可 能会被拆为2~{2}条短信。</user-sms-status></hints><http-applications version="5"><crbt-common-access>HTTP://221.130.45.205/hds/CrbtCommonAccess.aspx</crbt-common-access><del-portrait>HTTP://221.130.45.205/hds/DeletePortrait.aspx</del-portrait><delete-msg-history>HTTP://221.130.45.205/hds/DeleteMessageHistory.aspx</delete-msg-history><get-ad>HTTP://221.130.45.205/hds/GetAd.aspx</get-ad><get-personal-ext-info>HTTP://221.130.45.205/hds/getpresenceinfo.aspx</get-personal-ext-info><get-personal-info>HTTP://221.130.45.205/hds/getpersonalinfo.aspx</get-personal-info><get-portrait>HTTP://221.130.45.205/hds/getportrait.aspx</get-portrait><get-tab-info>HTTP://221.130.45.205/hds/GetTabInfo.aspx</get-tab-info><query-msg-history>HTTP://221.130.45.205/hds/QueryMessageHistory.aspx</query-msg-history><record-share-content-op>HTTP://221.130.45.205/hds/recordsharecontentevent.aspx</record-share-content-op><relay-upload-share-content>HTTP://221.130.45.206/hds/RamRelayUploadShareContent.aspx</relay-upload-share-content><set-personal-info>HTTP://221.130.45.205/hds/setpersonalinfo.aspx</set-personal-info><set-portrait>HTTP://221.130.45.205/hds/setportrait.aspx</set-portrait><set-tone-info>HTTP://221.130.45.205/hds/SetToneInfo.aspx</set-tone-info><upload-share-content>HTTP://221.130.45.205/hds/BlockUploadShareContent.aspx</upload-share-content></http-applications><client-config version="5"><item key="sms-mode-main-desc" value="您可以发送短信与好友进行交流、使用语音聊天,还可以邀请您 的手机好友加入Fetion服务" /><item key="sms-mode-invite-buddy" value="hy" /><item key="sms-mode-invite-ivr" value="yy" /><item key="sms-mode-no-contact-list" value="目前您还没有好友,可以通过登录后邀请,获取好友或将手机通讯簿的联系人导入为Fetion好友" /><item key="online-no-buddies" value="目前您还没有好友,可以通过菜单中的导入手机联系人、移动速配交友、用飞信号和手机号添加好友的方式来添加好友。" /><item key="online-garden-desc" value="" /><item key="mobile-no-dist" value="<r><c v="cmcc"><d s="13500000000" e="13999999999"/><d s="13400000000" e="13489999999"/><d s="15900000000" e="15999999999"/><d s="15800000000" e="15899999999"/></c></r>" /><item key="fee-charge-desc-url" value="http://www.fetion.com.cn/shuoming1.aspx"/><item key="ivr-charge-desc" value="资费咨询当地10086"/><item key="info-redirect-url" value="https://uid.fetion.com.cn/SSIPortal/Redirect.aspx?key="/></client-config><client version="2.0.0.0"><compatible>2.0.0.0</compatible><date>2006-7-27 18:48:27</date><pc-live-update value="http://221.130.45.198/"/></client> </config>
抓包看了一下,飞信是用了混合协议的: 1、基于HTTP(XML Web Services吧?)进行获取系统配置、更新程序、注册用户
2、基于HTTPS进行登录时密码验证
3、应用层协议是SIP协议,但不是标准的,估计是自创的?所有交互过程如发消息、短信通过SIP协议进行。
关于SIP,有巨多的RFC描述,飞信的SIP协议栈实现的是TCP、HTTP承载
1.TCP承载方式:连接服务器(目前是221.130.45.203)的8080端口,这时在客户端的“网络设置”中显示的是“TCP直接连接”,SIP信令直接就放在TCP的包中。 2.HTTP承载方式:连接服务器(目前是221.130.45.203)的80端口,采用POST方式,将信令包在POST请示中,这时在客户端的“网络设置”中显示的是“HTTP直接连接”
因为是TCP和HTTP承载,所以其包格式是非常清楚的,那么注意力就可以直接放到SIP协议或SIP信令上,详细的内容稍后再写。
总的来说,飞信协议是比较简单的,不对,准确地说法是比较规范和清晰,但协议本身是复杂的,另外: 1. 飞信的协议是明文,这一点如同其兄弟MSN,是不如QQ和RTX的,因此,通过飞信的交谈过程是可轻易截获的,通过很简单的工具,就可以截到同一网段上所有人的交谈,估计会有人写Fetion Chat Sniffer的,就跟MSN一样,假如有一天Fetion有那么流行......要不我写一个?:)
2.协议效率比较低,我加了近200人,一次登录过程要传递的数据量居然超过了230K,我靠。
3.状态有问题,presence处理得不太好好象,我在线别人却看到我离线,真是奇怪,而且一会儿发一个presence一会儿发一个,讨厌啊。
以下分析均基于飞信的这一版本:Fetion 2006 beta 版本 2.1.0.0。
作协议分析时,一抓包,就发现飞信工作时连的是221.130.45.203这个服务器。那这个IP地址从哪来的呢?会变吗?飞信的客户端程序中并没有配置服务器地址这一说。固定一个IP?不会吧,一面向全国的系统,不可能用一个IP地址。用一个固定域名解析出来的多IP地址中的一个吗?抓出它访问DNS的包一看,它就只在开始时解析过一次域名:nav.fetion.com.cn,这个域名的IP是221.130.45.201——听说开发飞信的人就是微软开发MSN的人,所以啥都跟MSN一样,你看那飞信的主界面元素,你能找一个位置和功能跟MSN不一样的吗?连解析域名这点都跟MSN一样,没意思啊,印象中MSN也是一开始就解析一个地址,好象是Messenger.msn.com?如果想在局域网内封锁MSN,就把这个域名给指向127.0.0.1,MSN就傻了。
既然只解析过nav.fetion.com.cn,那么221.130.45.203这个工作服务器(SIP的Proxy Server)地址,就应该是nav.fetion.com.cn返回来的了。确实是,但只是第一次登录时返回,并保存在了本地。后面再登录时,如果版本不更新,是不会再返回这些系统配置信息的。所以,除第一次外,再抓包是看不到这些配置信息的。
本地配置文件并没放在Fetion的程序目录中,而是放到了%USERPROFILE%ApplicationFetion目录下。这个目录下有configuration.dat和飞信的用户目录,每个飞信用户目录下还有configuration.dat、contacts.dat、userinfo.dat这三个配置文件,看名字就知道是与用户相关的系统配置文件、好友列表文件、用户的个人信息文件。
这些文件全是XML格式的,所以可以用Notepad打开,不过,你打开后就会发现,这些文件的内容全被加密了,变态啊,这些文件有什么好加密的呢。
我们如何获得这里头的信息呢?
方法有两个:
一、我们让Fetion不要加密这些文件的内容,方法是:修改FetionFx.EXE文件。用ildasm,将FeionFX.EXE反汇编出来,将其中的Imps.Client.Pc.PersistentManager.EncodeMode1和Imps.Client.Pc.PersistentManager.DecodeMode1这两个函数改掉,将这两个函数体改成以下内容:
.maxstack1
IL_0000:ldarg.0
IL_0001:ret
即,立即将参数返回。然后再用ilasm工具重新汇编生成FetionFX.EXE文件,覆盖掉以前那个,然后,再运行飞信,所有配置文件就不会再加密了。二、构造一个请求,给nav.fetion.com.cn,让它返回。请求的内容很简单,抓一下包就会知道,取系统配置的请求过程是:
xxx.xxx.xxx.xxx:xxxx>>>>>>>>221.130.45.201:80
POST/nav/getsystemconfig.aspxHTTP/1.1
User-Agent:IIC2.0/PC2.1.0.0
Host:nav.fetion.com.cn
Content-Length:233
Connection: Keep-Alive--------------------------------------
xxx.xxx.xxx.xxx:xxxx<<<<<<<<221.130.45.201:80
HTTP/1.1 100 Continue--------------------------------------
xxx.xxx.xxx.xxx:xxxx>>>>>>>>221.130.45.201:80
<config><user mobile-no="139xxxxxxxx" /><client type="PC" version="2.1.0.0" platform="W5.1" /><servers version="12" /><service-no version="1" /><parameters version="4" /><hints version="4" /><http-applications version="5" /></config>将以上内容中的从servers version开始的version全置为"0",服务器就会返回配置信息。注意,配置信息全是UTF-8编码的。用nc就可构造一个http请求发过去,服务器立马就返回了。
推荐用方法一,因为这样可以看和修改所有配置信息,而方法二仅有系统配置信息。
与我们关注的服务器地址相关的信息在飞信用户目录下的configuration.dat中,一看就明白是啥:
....
<sipc-proxy>221.130.45.203:8080</sipc-proxy>这就是我们关心的TCP直接连接时的服务器地址
<http-tunnel>HTTP://221.130.45.203/ht/sd.aspx</http-tunnel>HTTP直接连接时的入口地址
<get-pic-code>HTTP://221.130.45.201/nav/GetPicCode.aspx</get-pic-code>注册时,取验证代码图片的URL
<get-system-status>HTTP://221.130.45.201/nav/GetSystemStatus.aspx</get-system-status>取系统状态啦
....这个配置信息放到飞信用户目录下是有原因的,就象SIP协议支持的,登录的服务器是可以分用户群的,不同的用户可以登录不同的Proxy Server,每个飞信用户(手机)可以分别登录到本省的Proxy Server,就如同现在的手机和电话网络一样。
其实这些配置内容没什么啊,为什么要加密呢?而且随便构造一个http请求,就可以获得这些内容的。 最变态的是通过飞信的交谈内容不加密不变换,却把无关紧要配置文件加密了。
另外,用户的密码就保存在Application DataFetion目录下的Configuration.dat中,当然这个密码进行了变换,遗憾的是,在程序中是还原出了用户密码的,因此,用户密码别人是可以轻易获得的。幸好丢了可以手机找回。但这仍然是个非常不安全的因素。
J2me版飞信的通信协议,与PC版的协议是完全不同的。
两个版本的协议,都是以HTTP为基础。不同的是,PC版的飞信,在HTTP上采用了SIP协议。
而J2me版的飞信,在HTTP上传输的,则是一个自定义的数据格式。J2me版飞信(以下简称飞信)的通信协议,基于HTTP协议
可以看到,每个包都分为Header和Payload两部分。 header是固定长度4个字节,其中,前三个字节(Length)表示整个数据包的程度,包括Header本身的长度,第4个字节(Code) 表示请求的命令吗。表示长度的三个字节是按大端(big-endian)的格式(也就是网络字节序)来表示一个整数的。具体说就是,字节0表示长度的最高 8位,字节1表示长度的中间8位,字节2表示长度的低8位。字节3表示请求码。
这个长度可以表示的很大,当然,暂时还用不上这么大。
Header后的有效数据(Payload)是变长的。该部分长度可以为0。一些简单的命令比如退出登录,只需要设置Code为对应的代码,Payload部分是不需要数据的。
服务器返回的数据格式和客户端发出的具有相同的格式。
=== 特殊的包 === 在服务器响应中,有一个特殊的包,Code为 -1。 Code 为-1的包,实际上是有多个包组成的。需要把这些包全部分离出来,逐个处理它们。
**我不清楚是不是可以用Code为-1的包同时发送多个包到服务器,不过在飞信的代码里,没有看到这样的应用,只有从服务器收到的响应中有code为-1的包
=== 登录导航服务器 ===
在飞信客户端与服务器通信的过程中,登录导航服务器是第一步 。目的是获得真正的服务Url。可能是因为移动在以后会改动服务的URL,或者按照就近服务的原则,动态的返回离使用飞信的手机最近的服务器上的服务URL。
得到的这个服务URL,就是后来的 登录,聊天,注销的目的地址。
从飞信的代码中可以看到缺省的导航服务器url是 http://nav.m161.com.cn/getadapteruri.aspx
该导航服务器url,在MANIFEST.MF中serverIP 也有定义,如果MANIFEST.MF没有定义serverIP,就使用该默认的url。
要获取服务URL,需要往导航服务器URL POST一个字节,这个字节可以是任意数据。 如请求成功后,会返回一个xml文档,如下
<?xml version="1.0" encoding="utf-8" ?>
<Root xmlns="http://tempuri.org/DateExchange.xsd">
<Response>
<Error>0</Error>
<Memo/>
</Response>
<Uri>
http://liveja.amigo.bjmcc.net/transfer.vurl
</Uri>
</Root>
从Uri节点得到的就是飞信协议使用的服务URL。这以后的通信,就与导航服务器无关了。
本篇文章来源于中国协议分析网|www.cnpaf.net原文链接:http://www.cnpaf.net/Class/OtherAnalysis/200810/23084.html