Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

31
Just for fun 投投投投投投 JavaQQ 投投

Transcript of Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Page 1: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Just for fun

投机取巧分析 JavaQQ协议

Page 2: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

关于 Just for fun

大名鼎鼎的 Linux创始人 Linus Torvalds的自传书名

Just for fun,一种精神

Page 3: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

前置知识 :典型的 HTTP Get请求

Page 4: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

GET / HTTP/1.1Accept: */*Accept-Language: zh-cnAccept-Encoding: gzip, deflateIf-Modified-Since: Fri, 16 Mar 2007 09:02:51 GMTIf-None-Match: "aa242be0a967c71:216“User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon)Host: ehoo.gfkd.mtnConnection: Keep-Alive

Page 5: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

典型的 HTTP Get请求

Page 6: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

HTTP/1.1 404 Not FoundContent-Length: 1308Content-Type: text/htmlServer: Microsoft-IIS/6.0X-Powered-By: ASP.NETDate: Fri, 11 May 2007 15:28:10 GMT

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01//EN” “http://www.w3.org/TR/html4/strict.dtd”>..<HTML><HEAD><TITLE>............</TITLE>..<META HTTP-EQUIV=“Content-Type” Content=“text/html; charset=GB2312”>..<STYLE type=“text/css”>.. BODY………(下面省略 )

Page 7: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

我们的目标 :JavaQQ

很久很久以前 ,我拥有一个 PDA,我以为有它 ,我就拥有了全世界

但是…所以我决定 :自己写个 QQ所以我需要知道 JavaQQ的通信协议Where to get it?

Page 8: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

How to get started?

传统分析 QQ协议的方法 :

用 Iris(刚才用到的 )等抓包软件自己抓包分析 ,偶尔会用到一点点逆向工程的知识 ?

前人告诉我们 :这 ,是需要耐心的 .而我最缺少的就是耐心 .

Page 9: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

那么 ,how to get started?

手机上用的 QQ是 java写的 ,名字叫 ***.jarJAR(Java ARchive),可以简单理解为一大堆 java的 class(java执行的最小单位 )文件打包的产物

这意味着什么 ?这意味着……

Page 10: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

我有救了 !

Class文件在被生成时保留了源文件的大部分信息

有许许多多的工具可以让我们由 class文件反编译出原来的代码文件 ,甚至包括注释 !

腾迅本可以 ,但是它没有使用通常的 java代码混淆技术 ,他把代码白送给了我们

BTW:腾迅的疏忽只是早期招聘的 java程序员的不懂事而已 ,后期已经没有这一现象 .这一现象似乎仅仅发生在 QQ2005?

Page 11: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

JavaQQ2005与 JavaQQ2007对比--用 winrar解压相应的 qq jar文件

QQ2005请注意文件名

Page 12: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

QQ2007 有什么区别 ?

Page 13: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

从 QQ2005源代码我们可以得到什么 ?

我们可以从中学习到面向对象的编程方法(C++教员 )

我们可以从中学习到对于一个聊天软件所应使用的数据结构 (数据结构教员 )

我们可以…但我只想要 QQ的通信协议

Page 14: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get started

你应该知道真相 ,真相使你自由 .

Page 15: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Some tips协议实现主要在 HttpPoster.java中JavaQQ协议基于 HTTP,使用 POST方法Server:http://218.18.95.203:21001/(随版本变化 )

发送编码为 utf-8代码基于 ver 1.0(HttpPoster.java)此版本仅有最基本的聊天功能 ,没有视频聊天等高级功能

Connection-close:每次都要重新连接

Page 16: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Let’s go!命令基本格式

VER=1.0&CMD=XXX&SEQ=XXX&UIN=XXX…………

CMD因命令而异SEQ是为防止重复发送数据包而设置的标记 ,在 JavaQQ代码中 ,SEQ值在每次发送数据包后自动加一UIN是你的 QQ号码

Page 17: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Login

VER=1.0&CMD=Login&SEQ=XXX&UIN=XXX&PS=XXX&M5=1&LG=XXX&LC=9326B87B234E7235

PS:经MD5加密后的密码值LG:手机使用的语言 ,如 en,cn等LC,M5:固定值 ,可能与手机型号 /QQ版本号有关 ?

Page 18: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Login Reply:VER=1.0&CMD=Login&SEQ=XXX&UIN=

XXX&RES=0&RS=0

RES=0:成功返回RS=0:登陆成功

VER=1.0&CMD=Login&SEQ=XXX&UIN=XXX&RES=0&RS=1&RA=XXXX

RS=1:登陆失败RA=XXX:登陆失败的原因

Page 19: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Friend List:

VER=1.0&CMD=List&SEQ=XXX&UIN=XXX&TN=160&UN=0

TN=160&UN=0:固定值

Page 20: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Friend List Reply:

VER=1.0&CMD=LIST&SEQ=XXX&UIN=XXX&RES=0&FN=1&SN=XX&UN=XXX,XXX,XXX,…..

FN=1:固定值SN=XX:好友个数UN=XX,XX,XX:好友的号码 ,用” ,”分隔

Page 21: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Online Friend List:

VER=1.0&CMD=Query_Stat&SEQ=XXX&UIN=XXX&TN=50&UN=0

TN=50&UN=0:固定值

Page 22: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Online Friend List Reply:

VER=1.0&CMD=QUERY_STAT&SEQ=XXX&UIN=XXX&RES=0&FC=XXX,XXX,XXX,&FN=1&SN=XX&ST=XX,XX,XX,&UN=XX,XX,XX,&NK=XX,XX,XX,

FC=XX:XX为头像的 id,可参考 PC版 QQ.

SN=XX:在线好友人数 .

ST=XX:好友状态 ,10上线 ,20离线 ,30忙碌UN=XX:好友号码NK=XX:好友昵称 (记得 utf-8)

Page 23: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Message:

VER=1.0&CMD=GetMsgEx&SEQ=XXX&UIN=XXX

Page 24: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Get Message Reply:

VER=1.0&CMD=GETMSGEX&SEQ=XXX&UIN=XXX&RES=0&MN=X&MT=X,X,X,&UN=XX,XXX,XXXX,&MG=XXX,XXX,XXXX,MN=X:消息个数MT=X:消息类型 ,99系统消息 ,9用户消息UN=X:不用说了吧MG=XX:得到的消息 (utf-8).BTW:MT=99&UN=10000&MG=30好友 10000状态改变为忙碌 .可因此提高好友列表刷新效率 .

Page 25: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Send Message:

VER=1.0&CMD=CLTMSG&SEQ=XXX&UIN=XXX&UN=XXX&MG=XXX

MG=XXX(utf-8)

Page 26: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Send Message Reply:

VER=1.0&CMD=CLTMSG&SEQ=XXX&UIN=XXX&RES=0

Page 27: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

现在 :

我们已经可以写出最最简单的 QQ聊天客户端了

我们可以登陆 ,可以收发消息 ,能看到所有的好友以及在线的好友

Page 28: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

在手机上实现 QQ时 , 一个登陆请求应该是这样 :

POST HTTP/1.1

Content-Type:text/plain;charset=UTF-8

Content-length:100

VER=1.0&CMD=Login&SEQ=413&UIN=409621426&PS=21232f297a57a5a743894a0e4a801fc3&M5=1&LC=9326B87B234E7235

Page 29: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

Other Actions:

GetInfo获取好友信息AddToList添加好友Ack_AddToList添加好友回应DelFromList删除好友Finger查找好友Change_Stat更改状态Logout注销

Page 30: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

可以暴料么 ?

JavaQQ用的协议同 PC上 QQ的 HTTP QQ协议基本相同 ,但是 server不同 ,手机可以通过代理 10.0.0.172:80使用 PC上的 HTTP QQ Server.这意味着 :如果 JavaQQ再次收费 ,我们有了免费的选择— PC上的server是不会收费的

聊天内容根本没有加密 ,真是令人伤心

Page 31: Just for fun JavaQQ. Just for fun Linux Linus Torvalds Just for fun,

The End