更新下飞信协议的研究

我很早很早前就抓包研究过下飞信协议,那时还比较简单,除了访问导航服务器获得通信服务器ip外,之后只用和通信服务器联系就可以了。最近在做adium的飞信插件,原来用libfetion.cn的库的,那个全包装完了,就不用自己操心了,现在我改用fetion for pidgin的开源版的库,就可以自己做些补充改进了。其实它工作得还挺好的,只是小细节问题也不断,所以我打算重新研究下飞信协议。

升级到最新的飞信官方版,3.5.2540,然后把抓包工具升级了一下。嗯,这里推荐一下这个叫科来网络分析系统的软件,是个国产工具,个人抓包用它的免费技术交流版就可以了。我感觉很好用,哈,可能只是因为全中文界面?

我看了fetion for pidgin的代码,里面模拟的版本号是3.3.0370的,看起来也不算很远前的。不过几处都是写死进字符串的,我把版本号提出来作为一个常量定义,这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的,只有一个参数不同,<device type=”pc” version=”0″ ….> 官方版中version是一串猜不出来意思的长数字串,不过看起来这里发送0也没有什么出错情况,我也没有去改动了。测试发现官方版如果连续多次密码输入错误,会弹出对话框显示一个图片验证码,这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误,我怀疑就是出错若干次后,之后输对的也不能通过了。

当前的登录服务器还是221.176.31.1。登录后的步骤中有个sub订阅请求,带的内容n: compactlist,这个在飞信插件中也没有见到有发送该请求,我没有查到这个请求是为了更新什么信息。登录后还有一个s服务请求,n: getscore,这个很明显是请求飞信积分的,其实这玩意儿我也是今天登录才知道飞信也加了这种东西,不过相信一般用户没这个需求。还有个n: getofflinemessages在飞信插件中也没有实现,但这个命令很早前就有了,我怀疑是这个请求一直就收不到消息,所以不如不加?按说离线消息都发手机上了,哪还请求得到。

最主要区别大的是,现在的对话开始有专门的服务器了,这个和msn一样了,学谁不好,学这么麻烦的。发起方在打开一个非离线联系人,准备开始对话时,就有了以下请求
s fetion.com.cn sip-c/2.0
f: sid值
i: 递增值
q: 1 s
n: startchat
服务器返回
sip-c/2.0 200 ok
i: 如前值
q: 1 s
a: cs address=”221.176.31.120:8080;221.176.31.120:443″,credential=”856933642.870995472″”
这样就可以去连221.176.31.120:8080或者443(我猜连后者就可以加密会话,不如目前没这个设置而已)来进行对话。连接上后进行注册
r fetion.com.cn sip-c/2.0
f: sid
i: 1
q: 0 r
a: ticks auth=”856933642.870995472″
k: text/html-fragment
k: multiparty
k: nudge
k: share-background
k: fetion-show
这里就不用密码了,前面有发一个ticks来做验证,不过话说,这些信息都明文在网上传,完全可以捕获后来伪造成该发起人进行对话啊。从k域支持的内容来看,也比以前多了share-background和fetion-show,看来msn和qq都被抄了。
登录成功后,可以邀请好友上来进行会话:
s fetion.com.cn sip-c/2.0
f: sid
i: 2
q: 0 s
n: invitebuddy
l: 85

<args><contacts><contact uri=”sip:xxxxxxxx@fetion.com.cn;p=xxx” /></contacts></args>
不过我没有用两个官方版飞信来联测,一端用的是adium fetion。所以肯定丢了这个invitebuddy请求,而发起方发送的消息,还是由登录服务器正常发送过来了。应该是没有得到invitebuddy成功的答复包,所以还能走原来的路径。我就不能确定这种方式是不是一直能用了。现有的飞信插件显然没有考虑过要连这么多服务器的情况,我还没有测试如果同时打开几个会话,是不是会连不同的chat server,或者就算是同一个chat server,怎么来做不同组。这个chat server的引入看起来应该是为了实现负载均衡,但是这种方式开发实在太麻烦了,我还是更喜欢qq的方式,登录时就给你找个压力小的,连上后就不用这么搞来搞去了。

所以,最后情况就是,关于对话部分,我什么都没能改。我也重现了有用户反映的会发生明明消息发出,但提示超时的问题,这个我需要想想怎么处理,要么干脆把提示去了好了。今晚主要修正的是这插件原来在登录时一直是用在线方式登录,不符合pidgin和adium的用上次登出时状态来登录的习惯。另外还有,原来fetion for pidgin插件里的隐身状态值是899,这个值是错的,所以隐身会没有用。我从最新官方版上抓包的内容来看,隐身的状态号应该是0,其它的状态号倒都没有问题。

有谁也研究的,可以讨论讨论。。我把这个fetion for pidgin也升级后,以后可以用在n900上,给上面的pidgin加上飞信功能。

About Evan

Comments

10 Responses to “更新下飞信协议的研究”
  1. BobGreen says:

    非常好的帖子啊,学到很多知识和方法,我回头再仔细研究研究。不过iPhone上已经有飞信了…而我手头就剩iPhone了…我纯粹当研究吧~~

    [Reply]

    Evan Reply:

    我本来也不是做手机上的。iPhone上用的就是libfetion的库吧,那其实也是用PC协议的。好像只有见到Palm版那个是第三方做的手机协议的。

    [Reply]

    Anonymous Reply:

    很好,一直在关注你的博客,包括前不久你的台湾行和那次发烧的事件,感觉你的文字和经历都很有意思,呵呵。
    赶紧搞,搞好了我移植到palm的WebOS上面去d(^_^)b,我就坐等你的成果果实了

    [Reply]

  2. Alsor.Zhou says:

    有意思的分析~前段时间也参与了桌面版libfetion的一些活动,个人感觉libfetion底层库可能有必要好好设计一下,不过因为closed source的原因,只能依靠ddd一个人的努力。准备改天看看你提到的这个pidgin插件.

    [Reply]

    Evan Reply:

    那个库用起来也不是太方便。比如包装成插件后,在adium只能添加一个帐户,多个会有问题。
    另外,其他一些错误,没有代码,不容易debug

    [Reply]

    Alsor.Zhou Reply:

    不过至少有一个好处,协议部分的分析不用重新做了

    [Reply]

  3. HY says:

    离线消息当然不都是发手机上。。。不然我还收啥。。。

    [Reply]

    Evan Reply:

    大概关机了就这样吧。。

    [Reply]

    HY Reply:

    倒,飞信上有设定离线消息要不要前转的。。。

    [Reply]

    Evan Reply:

    好吧。。反正我又不太常用。那我看看把这个功能加上好了

Speak Your Mind

Tell us what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!