|
今天在evan的blog里看到一些关于飞信的资料.不知道是不是火星了
- O( P) r6 l. z" f6 \更新下飞信协议的研究
! t& m, m/ z, s* C( C4 W" V7 |Posted by Evan on December 6, 2009 · 447 Views · 10 Comments 2 G \% D; w F: e4 j0 n" Y
4 A( u; {! N) R
我很早很早前就抓包研究过下飞信协议,那时还比较简单,除了访问导航服务器获得通信服务器IP外,之后只用和通信服务器联系就可以了。最近在做Adium的飞信插件,原来用libfetion.cn的库的,那个全包装完了,就不用自己操心了,现在我改用fetion for pidgin的开源版的库,就可以自己做些补充改进了。其实它工作得还挺好的,只是小细节问题也不断,所以我打算重新研究下飞信协议。; b1 z) _* _+ _& O1 _+ D; I" Q
- q/ |' L! B1 l! k2 L
升级到最新的飞信官方版,3.5.2540,然后把抓包工具升级了一下。嗯,这里推荐一下这个叫科来网络分析系统的软件,是个国产工具,个人抓包用它的免费技术交流版就可以了。我感觉很好用,哈,可能只是因为全中文界面?
) h3 l) R9 h) R! k3 Q& | |8 a1 |- z* Y( p
我看了fetion for pidgin的代码,里面模拟的版本号是3.3.0370的,看起来也不算很远前的。不过几处都是写死进字符串的,我把版本号提出来作为一个常量定义,这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的,只有一个参数不同,<device type=”PC” version=”0″ ….> 官方版中version是一串猜不出来意思的长数字串,不过看起来这里发送0也没有什么出错情况,我也没有去改动了。测试发现官方版如果连续多次密码输入错误,会弹出对话框显示一个图片验证码,这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误,我怀疑就是出错若干次后,之后输对的也不能通过了。" I2 E7 p$ ]' I7 E
; G- r0 Y8 K, \$ R当前的登录服务器还是221.176.31.1。登录后的步骤中有个SUB订阅请求,带的内容N: compactlist,这个在飞信插件中也没有见到有发送该请求,我没有查到这个请求是为了更新什么信息。登录后还有一个S服务请求,N: GetScore,这个很明显是请求飞信积分的,其实这玩意儿我也是今天登录才知道飞信也加了这种东西,不过相信一般用户没这个需求。还有个N: GetOfflineMessages在飞信插件中也没有实现,但这个命令很早前就有了,我怀疑是这个请求一直就收不到消息,所以不如不加?按说离线消息都发手机上了,哪还请求得到。# x( d1 b1 M0 j
) y+ s* n4 c6 o4 O5 d1 X最主要区别大的是,现在的对话开始有专门的服务器了,这个和MSN一样了,学谁不好,学这么麻烦的。发起方在打开一个非离线联系人,准备开始对话时,就有了以下请求- S fetion.com.cn SIP-C/2.0- W s! t$ o4 l$ ]: x
- F: SID值
! Z8 N& k5 k0 B7 E! `1 R - I: 递增值; n$ C! i$ w/ D/ C1 v
- Q: 1 S
V. c0 @; Z8 f0 W; N. M - N: StartChat* f$ i% A8 Y4 ]9 M9 i) ` k
- 服务器返回: f1 P- b1 _+ @$ \3 j
- SIP-C/2.0 200 OK
, ?( `5 t( f0 e% K - I: 如前值/ i" q8 J+ Z" h3 y! V Y
- Q: 1 S
; C W* v: n0 H4 a9 o0 N# ?" L - 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
9 p# E% v" V* n" {9 y - F: SID6 L; L8 ~6 d9 e, O3 Q2 c
- I: 1
; h. x# E$ M. ?. U# j! g6 `# r/ K - Q: 0 R
' a$ F8 x) S/ j$ y/ g* w - A: TICKS auth=”856933642.870995472″
- I" `3 c, u2 Z - K: text/html-fragment
$ @8 A! Q) l/ f9 h$ f$ |3 O2 @. J) ^ - K: multiparty. W' G9 ~; f1 o5 J; N# }
- K: nudge U* X1 b8 r& j; V; |
- K: share-background
+ l, [6 x% \3 u- p, |- S2 g - K: fetion-show
复制代码 这里就不用密码了,前面有发一个TICKS来做验证,不过话说,这些信息都明文在网上传,完全可以捕获后来伪造成该发起人进行对话啊。从K域支持的内容来看,也比以前多了share-background和fetion-show,看来MSN和QQ都被抄了。
7 ~( v4 j5 ^. \( i# n登录成功后,可以邀请好友上来进行会话:- S fetion.com.cn SIP-C/2.0# g$ Q3 T: ?; D& f" Y: ?& h
- F: SID1 }4 r4 u4 B2 w# }; n u
- I: 2) n) s! P- K& Z0 j, K) E
- Q: 0 S
" H/ |, H$ ~! |( j5 q - N: InviteBuddy
' z- h3 d; v4 ?8 s - L: 85
+ N5 ~. V- r" B4 g `
; _5 R6 `3 f1 @- <args><contacts><contact uri=”sip:xxxxxxxx@fetion.com.cn;p=xxx” /></contacts></args>* R2 z* U4 u. S
复制代码 不过我没有用两个官方版飞信来联测,一端用的是adium fetion。所以肯定丢了这个InviteBuddy请求,而发起方发送的消息,还是由登录服务器正常发送过来了。应该是没有得到InviteBuddy成功的答复包,所以还能走原来的路径。我就不能确定这种方式是不是一直能用了。现有的飞信插件显然没有考虑过要连这么多服务器的情况,我还没有测试如果同时打开几个会话,是不是会连不同的chat server,或者就算是同一个chat server,怎么来做不同组。这个chat server的引入看起来应该是为了实现负载均衡,但是这种方式开发实在太麻烦了,我还是更喜欢QQ的方式,登录时就给你找个压力小的,连上后就不用这么搞来搞去了。4 R/ I- I; q# A3 n0 r9 {
; ?1 x. N _2 @2 V
所以,最后情况就是,关于对话部分,我什么都没能改。我也重现了有用户反映的会发生明明消息发出,但提示超时的问题,这个我需要想想怎么处理,要么干脆把提示去了好了。今晚主要修正的是这插件原来在登录时一直是用在线方式登录,不符合pidgin和adium的用上次登出时状态来登录的习惯。另外还有,原来fetion for pidgin插件里的隐身状态值是899,这个值是错的,所以隐身会没有用。我从最新官方版上抓包的内容来看,隐身的状态号应该是0,其它的状态号倒都没有问题。
- I- l7 a0 d2 M' e4 k* T1 J6 l3 e0 P2 K' n; y# I* m9 G# d+ T, g
有谁也研究的,可以讨论讨论。。我把这个fetion for pidgin也升级后,以后可以用在N900上,给上面的pidgin加上飞信功能。 8 f' i, t/ p/ h
http://www.evan129.com/2009/12/0 ... %e7%a0%94%e7%a9%b6/ |
评分
-
查看全部评分
|