|
今天在evan的blog里看到一些关于飞信的资料.不知道是不是火星了
. l1 S# x/ ^+ K* i2 q9 o更新下飞信协议的研究- q: j7 a# I2 U! K: A
Posted by Evan on December 6, 2009 · 447 Views · 10 Comments
; N; g( A1 m& i
; ]* s) D" u. [% S( a0 m: H6 R* P3 ?$ K我很早很早前就抓包研究过下飞信协议,那时还比较简单,除了访问导航服务器获得通信服务器IP外,之后只用和通信服务器联系就可以了。最近在做Adium的飞信插件,原来用libfetion.cn的库的,那个全包装完了,就不用自己操心了,现在我改用fetion for pidgin的开源版的库,就可以自己做些补充改进了。其实它工作得还挺好的,只是小细节问题也不断,所以我打算重新研究下飞信协议。
9 C8 `# Y! K0 H: e! v9 @" i0 C4 C% p }8 ], A9 C
升级到最新的飞信官方版,3.5.2540,然后把抓包工具升级了一下。嗯,这里推荐一下这个叫科来网络分析系统的软件,是个国产工具,个人抓包用它的免费技术交流版就可以了。我感觉很好用,哈,可能只是因为全中文界面?
t7 B5 i( C0 L }& f
: k( ?! `! w4 B0 b, T我看了fetion for pidgin的代码,里面模拟的版本号是3.3.0370的,看起来也不算很远前的。不过几处都是写死进字符串的,我把版本号提出来作为一个常量定义,这样以后会好改些。登录步骤发送的数据几乎和官方版是一模一样的,只有一个参数不同,<device type=”PC” version=”0″ ….> 官方版中version是一串猜不出来意思的长数字串,不过看起来这里发送0也没有什么出错情况,我也没有去改动了。测试发现官方版如果连续多次密码输入错误,会弹出对话框显示一个图片验证码,这版插件里完全没有相关处理的代码。这两天有人在adium fetion插件页面留言说一直说密码错误,我怀疑就是出错若干次后,之后输对的也不能通过了。
0 P/ B- C! H m1 I7 Q2 M
1 g( o. @- h; Q# c+ m当前的登录服务器还是221.176.31.1。登录后的步骤中有个SUB订阅请求,带的内容N: compactlist,这个在飞信插件中也没有见到有发送该请求,我没有查到这个请求是为了更新什么信息。登录后还有一个S服务请求,N: GetScore,这个很明显是请求飞信积分的,其实这玩意儿我也是今天登录才知道飞信也加了这种东西,不过相信一般用户没这个需求。还有个N: GetOfflineMessages在飞信插件中也没有实现,但这个命令很早前就有了,我怀疑是这个请求一直就收不到消息,所以不如不加?按说离线消息都发手机上了,哪还请求得到。8 X+ o' v. p" o0 K
! j4 w2 @; w* r: M4 s" D最主要区别大的是,现在的对话开始有专门的服务器了,这个和MSN一样了,学谁不好,学这么麻烦的。发起方在打开一个非离线联系人,准备开始对话时,就有了以下请求- S fetion.com.cn SIP-C/2.0# q3 h' Q4 z0 T
- F: SID值
6 ]& c8 D5 p' X" H: d$ b - I: 递增值
% [% K8 s# W6 t) Q. C - Q: 1 S
_! h3 W3 {( p/ n5 z& K - N: StartChat
- u7 l; R) a8 k" R+ T# K, v9 O) X - 服务器返回
5 S2 S* t8 Q: W0 S* X, C6 K0 Q - SIP-C/2.0 200 OK* |2 J% S, E+ k6 Z. x" B
- I: 如前值+ F! W3 k; q# Y* [4 F7 B* W2 B% |; m
- Q: 1 S
) w) z6 l( u$ y6 s+ 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.0. r2 a" ]% ~& Z/ Z6 e
- F: SID5 `/ o$ {$ Q- G9 O, g6 y6 J
- I: 1
: ~* c- A; e4 B- a' R6 I6 R - Q: 0 R
i# F _# T4 T# ` - A: TICKS auth=”856933642.870995472″) L, f% ` C! o
- K: text/html-fragment" |8 N# k% J0 }' a0 M) r
- K: multiparty2 u% _9 L3 f2 A7 C
- K: nudge5 ~, V# J+ S& \; G$ v
- K: share-background
4 f6 t2 J9 b; N3 K - K: fetion-show
复制代码 这里就不用密码了,前面有发一个TICKS来做验证,不过话说,这些信息都明文在网上传,完全可以捕获后来伪造成该发起人进行对话啊。从K域支持的内容来看,也比以前多了share-background和fetion-show,看来MSN和QQ都被抄了。3 u, r2 n% }' @, r
登录成功后,可以邀请好友上来进行会话:- S fetion.com.cn SIP-C/2.07 @% e$ ~ E+ g1 x2 s: q
- F: SID3 c; A0 K2 N8 v) v; p
- I: 24 j4 d2 I( o2 @* W; H ]
- Q: 0 S- u- Z, t0 s( _$ X
- N: InviteBuddy
/ T' S, U( z5 B2 e8 o - L: 85
2 A; g9 @4 l% V0 |: }& | - z7 W/ [# }; m$ w: O1 d' ~$ Q
- <args><contacts><contact uri=”sip:xxxxxxxx@fetion.com.cn;p=xxx” /></contacts></args>
* y) \0 B4 _/ S
复制代码 不过我没有用两个官方版飞信来联测,一端用的是adium fetion。所以肯定丢了这个InviteBuddy请求,而发起方发送的消息,还是由登录服务器正常发送过来了。应该是没有得到InviteBuddy成功的答复包,所以还能走原来的路径。我就不能确定这种方式是不是一直能用了。现有的飞信插件显然没有考虑过要连这么多服务器的情况,我还没有测试如果同时打开几个会话,是不是会连不同的chat server,或者就算是同一个chat server,怎么来做不同组。这个chat server的引入看起来应该是为了实现负载均衡,但是这种方式开发实在太麻烦了,我还是更喜欢QQ的方式,登录时就给你找个压力小的,连上后就不用这么搞来搞去了。
, v# n* Q1 Q, Y! v- S0 q2 s0 M; F0 j: J
所以,最后情况就是,关于对话部分,我什么都没能改。我也重现了有用户反映的会发生明明消息发出,但提示超时的问题,这个我需要想想怎么处理,要么干脆把提示去了好了。今晚主要修正的是这插件原来在登录时一直是用在线方式登录,不符合pidgin和adium的用上次登出时状态来登录的习惯。另外还有,原来fetion for pidgin插件里的隐身状态值是899,这个值是错的,所以隐身会没有用。我从最新官方版上抓包的内容来看,隐身的状态号应该是0,其它的状态号倒都没有问题。) j# l% A* w/ B0 L
# U! d$ `2 _$ o* @0 j) v5 ]: M
有谁也研究的,可以讨论讨论。。我把这个fetion for pidgin也升级后,以后可以用在N900上,给上面的pidgin加上飞信功能。 / Q; V1 Q" Y \3 e0 L. q, P/ z/ L
http://www.evan129.com/2009/12/0 ... %e7%a0%94%e7%a9%b6/ |
评分
-
查看全部评分
|