|
今天在evan的blog里看到一些关于飞信的资料.不知道是不是火星了: }, Y. Z* d- S
更新下飞信协议的研究 k" W" ~: A# b1 B0 V
Posted by Evan on December 6, 2009 · 447 Views · 10 Comments
, R1 D8 A% d3 D: o7 Y4 M1 W3 A- B
! w% G2 d/ H- W$ q) ?8 [2 y我很早很早前就抓包研究过下飞信协议,那时还比较简单,除了访问导航服务器获得通信服务器IP外,之后只用和通信服务器联系就可以了。最近在做Adium的飞信插件,原来用libfetion.cn的库的,那个全包装完了,就不用自己操心了,现在我改用fetion for pidgin的开源版的库,就可以自己做些补充改进了。其实它工作得还挺好的,只是小细节问题也不断,所以我打算重新研究下飞信协议。
2 E5 J' O) D: M8 X) B* E7 p M- L0 C, r7 z$ ?
升级到最新的飞信官方版,3.5.2540,然后把抓包工具升级了一下。嗯,这里推荐一下这个叫科来网络分析系统的软件,是个国产工具,个人抓包用它的免费技术交流版就可以了。我感觉很好用,哈,可能只是因为全中文界面?
; P; K# m6 X, [- V2 K# b9 c
" }/ T; S( o' h$ i7 J- @/ }3 o6 I我看了fetion for pidgin的代码,里面模拟的版本号是3.3.0370的,看起来也不算很远前的。不过几处都是写死进字符串的,我把版本号提出来作为一个常量定义,这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的,只有一个参数不同,<device type=”PC” version=”0″ ….> 官方版中version是一串猜不出来意思的长数字串,不过看起来这里发送0也没有什么出错情况,我也没有去改动了。测试发现官方版如果连续多次密码输入错误,会弹出对话框显示一个图片验证码,这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误,我怀疑就是出错若干次后,之后输对的也不能通过了。* u8 I4 T& X |$ m1 x/ Q
9 F* U/ T! d/ w8 \2 w. f: ^当前的登录服务器还是221.176.31.1。登录后的步骤中有个SUB订阅请求,带的内容N: compactlist,这个在飞信插件中也没有见到有发送该请求,我没有查到这个请求是为了更新什么信息。登录后还有一个S服务请求,N: GetScore,这个很明显是请求飞信积分的,其实这玩意儿我也是今天登录才知道飞信也加了这种东西,不过相信一般用户没这个需求。还有个N: GetOfflineMessages在飞信插件中也没有实现,但这个命令很早前就有了,我怀疑是这个请求一直就收不到消息,所以不如不加?按说离线消息都发手机上了,哪还请求得到。5 A/ `& n& ^4 z/ C9 v' i; X
6 R8 Z0 l. b: w3 H: f9 F6 l3 M最主要区别大的是,现在的对话开始有专门的服务器了,这个和MSN一样了,学谁不好,学这么麻烦的。发起方在打开一个非离线联系人,准备开始对话时,就有了以下请求- S fetion.com.cn SIP-C/2.0
/ h5 l: ]% O( G# c9 H: r% X7 {( x - F: SID值
# p% [6 B! i3 Y+ j3 ^ - I: 递增值8 p9 r4 M( i# q- G
- Q: 1 S
# v- _, k- d W& O+ ^ - N: StartChat+ b M2 T4 O" z I7 \- b# r/ J- y
- 服务器返回/ t7 m0 B8 M9 ?* ]
- SIP-C/2.0 200 OK7 r% X' E4 z+ I) G! q" O# V# b4 [5 Q
- I: 如前值- k. S" }) z- F4 p
- Q: 1 S
& c: y- D4 j: e# t+ J, F8 Z8 a - 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.07 E8 j, V3 [/ E( n2 |" [: t% `
- F: SID
/ K6 F% }) j4 k8 e. d' ~. u - I: 1% F& Q6 T$ K2 e3 B4 X! i3 Y7 P* ?
- Q: 0 R
7 M, E* H) ]" S& u6 [( w' I( C3 i - A: TICKS auth=”856933642.870995472″- n- ~8 Y! Z6 f7 [* ?, I. e7 ]
- K: text/html-fragment
' M4 l+ ~- k' L* { - K: multiparty0 G. j+ W* q3 W, K# L; Y3 x T. z
- K: nudge1 ~1 E1 j- b& O' W& Z7 K9 `% m; o& V: a
- K: share-background1 y& N' L% w( X6 R
- K: fetion-show
复制代码 这里就不用密码了,前面有发一个TICKS来做验证,不过话说,这些信息都明文在网上传,完全可以捕获后来伪造成该发起人进行对话啊。从K域支持的内容来看,也比以前多了share-background和fetion-show,看来MSN和QQ都被抄了。
$ q3 {/ L/ d# z( `, ^% l登录成功后,可以邀请好友上来进行会话:- S fetion.com.cn SIP-C/2.0: f2 |' P8 f; o! A6 z% g, R: X+ R
- F: SID
) E& q, k5 Q( @( e: t1 L, b9 \ - I: 2
! ^% d! \, Z9 I1 t9 d5 B4 } - Q: 0 S
8 i/ g6 v; h4 N2 H$ f - N: InviteBuddy+ Q8 G* u. N$ Q1 F- o( u9 E" D
- L: 85
( y0 }7 Z: Y" w4 W - 6 `8 p; Q ~- g1 n
- <args><contacts><contact uri=”sip:xxxxxxxx@fetion.com.cn;p=xxx” /></contacts></args>, z! ]$ V% V2 L* }7 Q
复制代码 不过我没有用两个官方版飞信来联测,一端用的是adium fetion。所以肯定丢了这个InviteBuddy请求,而发起方发送的消息,还是由登录服务器正常发送过来了。应该是没有得到InviteBuddy成功的答复包,所以还能走原来的路径。我就不能确定这种方式是不是一直能用了。现有的飞信插件显然没有考虑过要连这么多服务器的情况,我还没有测试如果同时打开几个会话,是不是会连不同的chat server,或者就算是同一个chat server,怎么来做不同组。这个chat server的引入看起来应该是为了实现负载均衡,但是这种方式开发实在太麻烦了,我还是更喜欢QQ的方式,登录时就给你找个压力小的,连上后就不用这么搞来搞去了。+ v7 W- R) `2 K$ M3 X9 ^! H2 g
5 k3 _& u ]- l5 `+ ^所以,最后情况就是,关于对话部分,我什么都没能改。我也重现了有用户反映的会发生明明消息发出,但提示超时的问题,这个我需要想想怎么处理,要么干脆把提示去了好了。今晚主要修正的是这插件原来在登录时一直是用在线方式登录,不符合pidgin和adium的用上次登出时状态来登录的习惯。另外还有,原来fetion for pidgin插件里的隐身状态值是899,这个值是错的,所以隐身会没有用。我从最新官方版上抓包的内容来看,隐身的状态号应该是0,其它的状态号倒都没有问题。. P" q& e1 n; l3 |# @# k* k& u
6 ^8 o# `6 A% J3 G: E
有谁也研究的,可以讨论讨论。。我把这个fetion for pidgin也升级后,以后可以用在N900上,给上面的pidgin加上飞信功能。 8 y2 ]4 Y- Z5 H
http://www.evan129.com/2009/12/0 ... %e7%a0%94%e7%a9%b6/ |
评分
-
查看全部评分
|