<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://gezhi.org" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
 <title>KJava</title>
 <link>http://gezhi.org/keyword/1144</link>
 <description>The taxonomy view with a depth of 0.</description>
 <language>zh-hans</language>
<item>
 <title>KJava QQ 2005 1.6.1 分析</title>
 <link>http://gezhi.org/blog/trac/1137</link>
 <description>&lt;p&gt;&lt;font face=&quot;Courier New&quot;&gt;在阅读本文之前，我很想让您明白几件事。&lt;/p&gt;
&lt;p&gt;第一，我这分析极不完整，也极不专业。仅仅是作为兴趣，写一写，消磨消磨时间。&lt;/p&gt;
&lt;p&gt;第二，我并不想抢腾讯的饭碗。说实在的，如果让我设计一款 IM，特别是用在手机上的，我决不会使用 HTTP 协议，也决不会将所有的消息以明文发送。用户密码是 MD5 过的，但您听说过山东大学那位受人尊敬的王小云教授吗，她破解了 MD5。HTTP 的头部也太大，浪费流量。&lt;/p&gt;
&lt;p&gt;第三，请您自重。计算机网络通讯协议分析，这本来就属于法律的灰色地带，搞得好那么你可以学习学习，设计出更优秀的协议，搞不好是什么下场我就不细说了。我可不希望看见谁谁谁收到一份包装精美的来自腾讯的律师函。&lt;/p&gt;
&lt;p&gt;好了，客气话说完，我下面就不客气了，说说腾讯 KJava QQ 2005 版协议的几个特点：&lt;/p&gt;
&lt;p&gt;1、使用 HTTP 1.1；&lt;/p&gt;
&lt;p&gt;2、每个 Request / Response 都需要标明 Content-Length。很显然，HTTP 1.1 的 RFC 也要求我们这么做（小道消息，没验证过，我只知道 1.1 的协议要求 Host，这个是为虚拟主机设计的）；&lt;/p&gt;
&lt;p&gt;3、客户发送请求的时候，都是用 POST 方法，所有的参数都包含在 POST 数据里；&lt;/p&gt;
&lt;p&gt;4、可以用代理，但最终必须是从中国移动/中国联通的 IP 访问登录服务器；&lt;/p&gt;
&lt;p&gt;5、密码采用 MD5 加密；&lt;/p&gt;
&lt;p&gt;6、每一次和服务器交换信息，都使用短连接，也就是说，在交换完了之后立即关闭连接（Connection: close）；&lt;/p&gt;
&lt;p&gt;7、全部采用 UTF-8 编码（String mystring(&quot;this is it&quot;, &quot;UTF-8&quot;);）；&lt;/p&gt;
&lt;p&gt;8、每隔一段时间执行一次 GetMsgEx 命令；再隔一定时间执行 Query_Stat。多执行几遍 List 也没人管你，反正具体的时间间隔可以自己来决定；&lt;/p&gt;
&lt;p&gt;9、SEQ，也就是 sequence number，初始值随便设，20，50，200。中间的呢，我试下来也是可以任意的，不过我不保证这一条在你这儿也适用；&lt;/p&gt;
&lt;p&gt;10、更多的嘛，我也讲不完，大家自己拿 6230 模拟器一试就知道。对了，可别忘记将联通或者移动的 SIM 卡放进 GPRS modem 再用它拨号，否则你想啊，腾讯那么精明，怎么会让你登录呢。&lt;/p&gt;
&lt;p&gt;GetMsgEx 是用来检查新消息的，CLTMSG 发送客户端消息，List 列出好友清单，Query_Stat 应该可以查询好友昵称。Login 跟 Logout 就不用解释了吧，一个登录，一个退出（离线）。&lt;/p&gt;
&lt;p&gt;GetMsgEx 可以返回空，也就是没有新消息。如有，也别忘了，那是 UTF-8 编码的。&lt;/p&gt;
&lt;p&gt;最重要的几个方法介绍过了。其它的呢，还是用模拟器运行一会儿再分析分析吧。我没多少时间了，也许开学之后会在 sourceforge.net 上面建立一个项目，今后呢随便写点代码，感兴趣就可以来看看。&lt;/p&gt;
&lt;p&gt;6230 模拟器实际上是诺基亚的 S40 Developer Platform 2.0 SDK，大家去 Forum Nokia 下一个就行。最新版本：1.1。需要 J2SDK，我用的是 1.5.0_16。别忘了注册、登录，下载和使用诺基亚的 SDK 是需要注册的，注册信息会发送到你的 E-mail 收件箱里。当然了，全部免费。&lt;/p&gt;
&lt;p&gt;http://www.forum.nokia.com/&lt;/p&gt;
&lt;p&gt;（需要安装 World Languages Pack）&lt;/p&gt;
&lt;p&gt;用到的QQ：&lt;br /&gt;
KJava QQ 2005 1.6.1&lt;/p&gt;
&lt;p&gt;这 QQ 该怎么下载呢？答案是这样的，用你的手机或者 GPRS modem 拨号，在电脑的浏览器里输入 http://mp.qq.com/m78，回车就可以了。&lt;/p&gt;
&lt;p&gt;最后是截获的数据包。记住，它可能代表什么，也可能不具备任何意义。仅供参考。要想获得自己的版本，可以打开模拟器的监控窗口，那里特别详细，不必在手机上安装 sniffer 了。&lt;/p&gt;
&lt;p&gt;顺便鄙视一下中国联通的 GPRS，居然每小时给我硬切换一次，所有连接统统断开。&lt;/p&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;0.0.0.0:0&lt;br /&gt;
-&amp;gt; kconn.tencent.com:21001&lt;/p&gt;
&lt;p&gt;POST / HTTP/1.1&lt;br /&gt;
Host: kconn.tencent.com:21001&lt;br /&gt;
Content-Type: text/plain&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: UNTRUSTED/1.0&lt;br /&gt;
Content-Length: 110&lt;/p&gt;
&lt;p&gt;VER=1.3&amp;amp;CMD=Login&amp;amp;SEQ=237&amp;amp;UIN=xxxxxxxxx&amp;amp;PS=HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH&amp;amp;M5=1&amp;amp;LG=1&amp;amp;LC=F8B82763B810F34B&amp;amp;CKE=&lt;/div&gt;
&lt;div style=&quot;margin-left: 80px;&quot;&gt;kconn.tencent.com:21001&lt;br /&gt;
-&amp;gt; 0.0.0.0:0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br /&gt;
Server: tencent imserver/1.0.0&lt;br /&gt;
Connection: close&lt;br /&gt;
Content-Type: text/plain; charset=UTF-8&lt;br /&gt;
Content-Length: 76&lt;/p&gt;
&lt;p&gt;VER=1.1&amp;amp;CMD=Login&amp;amp;SEQ=237&amp;amp;UIN=xxxxxxxxx&amp;amp;RES=0&amp;amp;RS=2&amp;amp;SI=121.14.78.201&amp;amp;SP=14000&lt;/div&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;0.0.0.0:0 -&amp;gt; 121.14.78.201:14000&lt;/p&gt;
&lt;p&gt;POST / HTTP/1.1&lt;br /&gt;
Host: 121.14.78.201:14000&lt;br /&gt;
Content-Type: text/plain&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: UNTRUSTED/1.0&lt;br /&gt;
Content-Length: 110&lt;/p&gt;
&lt;p&gt;VER=1.3&amp;amp;CMD=Login&amp;amp;SEQ=238&amp;amp;UIN=xxxxxxxxx&amp;amp;PS=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&amp;amp;M5=1&amp;amp;LG=1&amp;amp;LC=XXXXXXXXXXXXXXXX&amp;amp;CKE=&lt;/div&gt;
&lt;div style=&quot;margin-left: 80px;&quot;&gt;121.14.78.201:14000 -&amp;gt; 0.0.0.0:0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br /&gt;
Server: tencent imserver/1.0.0&lt;br /&gt;
Connection: close&lt;br /&gt;
Content-Type: text/plain; charset=UTF-8&lt;br /&gt;
set-cookie:HHHHHHHHHHHHHHHH&lt;br /&gt;
Content-Length: 85&lt;/p&gt;
&lt;p&gt;VER=1.1&amp;amp;CMD=Login&amp;amp;SEQ=238&amp;amp;UIN=xxxxxxxxx&amp;amp;RES=0&amp;amp;RS=0&amp;amp;HI=60&amp;amp;LI=300&amp;amp;COMP=NOKIA1ABCF7B8D44&lt;/div&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;0.0.0.0:0 -&amp;gt; 121.14.78.201:14000&lt;/p&gt;
&lt;p&gt;POST / HTTP/1.1&lt;br /&gt;
Host: 121.14.78.201:14000&lt;br /&gt;
Content-Type: text/plain&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: UNTRUSTED/1.0&lt;br /&gt;
Content-Length: 76&lt;/p&gt;
&lt;p&gt;VER=1.3&amp;amp;CMD=List&amp;amp;SEQ=239&amp;amp;UIN=xxxxxxxxx&amp;amp;SID=&amp;amp;XP=HHHHHHHHHHHHHHHHH&amp;amp;TN=160&amp;amp;UN=0&lt;/div&gt;
&lt;div style=&quot;margin-left: 80px;&quot;&gt;121.14.78.201:14000 -&amp;gt; 0.0.0.0:0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br /&gt;
Server: tencent imserver/1.0.0&lt;br /&gt;
Connection: close&lt;br /&gt;
Content-Type: text/plain; charset=UTF-8&lt;br /&gt;
Content-Length: 78&lt;/p&gt;
&lt;p&gt;VER=1.1&amp;amp;CMD=LIST&amp;amp;SEQ=239&amp;amp;UIN=xxxxxxxxx&amp;amp;RES=0&amp;amp;FN=1&amp;amp;SN=2&amp;amp;UN=aaaaaaaaa,bbbbbbbbb,&lt;/div&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;0.0.0.0:0 -&amp;gt; 121.14.78.201:14000&lt;/p&gt;
&lt;p&gt;POST / HTTP/1.1&lt;br /&gt;
Host: 121.14.78.201:14000&lt;br /&gt;
Content-Type: text/plain&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: UNTRUSTED/1.0&lt;br /&gt;
Content-Length: 80&lt;/p&gt;
&lt;p&gt;VER=1.3&amp;amp;CMD=Query_Stat&amp;amp;SEQ=240&amp;amp;UIN=xxxxxxxxx&amp;amp;SID=&amp;amp;XP=HHHHHHHHHHHHHHHH&amp;amp;TN=50&amp;amp;UN=0&lt;/div&gt;
&lt;div style=&quot;margin-left: 80px;&quot;&gt;121.14.78.201:14000 -&amp;gt; 0.0.0.0:0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br /&gt;
Server: tencent imserver/1.0.0&lt;br /&gt;
Connection: close&lt;br /&gt;
Content-Type: text/plain; charset=UTF-8&lt;br /&gt;
Content-Length: 95&lt;/p&gt;
&lt;p&gt;VER=1.1&amp;amp;CMD=QUERY_STAT&amp;amp;SEQ=240&amp;amp;UIN=xxxxxxxxx&amp;amp;RES=0&amp;amp;FC=0,&amp;amp;FN=1&amp;amp;SN=1&amp;amp;ST=10,&amp;amp;UN=aaaaaaaaa,&amp;amp;NK=???,&lt;/div&gt;
&lt;div style=&quot;margin-left: 40px;&quot;&gt;0.0.0.0:0 -&amp;gt; 121.14.78.201:14000&lt;/p&gt;
&lt;p&gt;POST / HTTP/1.1&lt;br /&gt;
Host: 121.14.78.201:14000&lt;br /&gt;
Content-Type: text/plain&lt;br /&gt;
Connection: close&lt;br /&gt;
User-Agent: UNTRUSTED/1.0&lt;br /&gt;
Content-Length: 65&lt;/p&gt;
&lt;p&gt;VER=1.3&amp;amp;CMD=Logout&amp;amp;SEQ=241&amp;amp;UIN=xxxxxxxxx&amp;amp;SID=&amp;amp;XP=HHHHHHHHHHHHHHHH&lt;/div&gt;
&lt;div style=&quot;margin-left: 80px;&quot;&gt;121.14.78.201:14000 -&amp;gt; 0.0.0.0:0&lt;/p&gt;
&lt;p&gt;HTTP/1.1 200 OK&lt;br /&gt;
Server: tencent imserver/1.0.0&lt;br /&gt;
Connection: close&lt;br /&gt;
Content-Type: text/plain; charset=UTF-8&lt;br /&gt;
Content-Length: 46&lt;/p&gt;
&lt;p&gt;VER=1.1&amp;amp;CMD=LOGOUT&amp;amp;SEQ=241&amp;amp;UIN=xxxxxxxxx&amp;amp;RES=0&lt;/div&gt;
&lt;p&gt;&lt;/font&gt;&lt;/p&gt;
</description>
 <comments>http://gezhi.org/blog/trac/1137#comments</comments>
 <category domain="http://gezhi.org/keyword/1143">J2ME</category>
 <category domain="http://gezhi.org/keyword/1140">Java</category>
 <category domain="http://gezhi.org/keyword/1144">KJava</category>
 <category domain="http://gezhi.org/keyword/1145">MIDlet</category>
 <category domain="http://gezhi.org/keyword/1142">MIDP</category>
 <category domain="http://gezhi.org/keyword/1139">QQ</category>
 <category domain="http://gezhi.org/keyword/1147">分析</category>
 <category domain="http://gezhi.org/keyword/1146">协议</category>
 <category domain="http://gezhi.org/keyword/1141">腾讯</category>
 <pubDate>Sat, 16 Aug 2008 06:35:15 -0700</pubDate>
 <dc:creator>trac</dc:creator>
 <guid isPermaLink="false">1137 at http://gezhi.org</guid>
</item>
</channel>
</rss>
