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

Post on 26-Mar-2015

259 views 0 download

Tags:

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

Just for fun

投机取巧分析 JavaQQ协议

关于 Just for fun

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

Just for fun,一种精神

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

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

典型的 HTTP Get请求

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………(下面省略 )

我们的目标 :JavaQQ

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

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

How to get started?

传统分析 QQ协议的方法 :

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

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

那么 ,how to get started?

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

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

我有救了 !

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

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

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

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

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

QQ2005请注意文件名

QQ2007 有什么区别 ?

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

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

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

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

Get started

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

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

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

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

Let’s go!命令基本格式

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

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

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版本号有关 ?

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:登陆失败的原因

Get Friend List:

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

TN=160&UN=0:固定值

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:好友的号码 ,用” ,”分隔

Get Online Friend List:

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

TN=50&UN=0:固定值

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)

Get Message:

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

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状态改变为忙碌 .可因此提高好友列表刷新效率 .

Send Message:

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

MG=XXX(utf-8)

Send Message Reply:

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

现在 :

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

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

在手机上实现 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

Other Actions:

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

可以暴料么 ?

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

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

The End