找回密码
 立即注册
查看: 2023|回复: 10

转:百度贴吧客户端(Android)网络通信行为分析

[复制链接]

7469

回帖

2063

基友

1万

积分

萨菲尔斯

One more time One more chance

Rank: 17Rank: 17Rank: 17Rank: 17Rank: 17

苍海的女仆

发表于 2013-10-1 19:47:26 | 显示全部楼层 |阅读模式
本帖最后由 汐宫栞 于 2013-10-1 19:55 编辑

本文其实是作者的一门研究生课程作业,为了使本文不至于因太过冗长而显得枯燥,本文特意略去了原文中一些比较重复乏味的内容,尽量呈现的是一些可能更令您感兴趣的贴吧功能。若是您确实需要阅读更完整的版本请下载:
完整版本 百度贴吧客户端(Android)网络通信行为分析.zip (1.81 MB, 下载次数: 81)

一、实验环境与结果概述1.1 实验环境

        手机型号:HUAWEI C8812
    操作系统:Android 4.0.3
   应用版本:百度贴吧4.0.0
    分析工具:Tcpdump for Android,WireShark 1.10.0rc2

【抓包的具体方法详参我的下一篇博文:《基于tcpdump的Android智能移动终端数据包捕获完整解决方案》】

1.2 结果概述

        百度贴吧客户端的所有重要通信行为都使用了HTTP协议。
        贴吧客户端发出的HTTP请求一般采用POST方法,表1-1对比展示了不同操作对应的请求报文。其中application/x-www-form-urlencoded格式将请求正文分成多个元素,各元素本身由名和值(可能使用URL编码)组成,各元素之间使用&符号隔开;multipart/form-data格式被用在使用POST方法发送HTML表单时,请求正文被分隔符(由boundary定义)分割成很多子段,每个子段可以自定义子段名称和值,从而实现在单个消息实体中封装多个主体的功能。

表1-1 不同操作对应的POST请求对比

         服务器返回的响应有着类似的头部,如图1-1所示。

图1-1 贴吧服务器返回的响应头部

        状态行一般为HTTP/1.1 200 OK,正文的类型一般纯文本文件,正文本身一般经过gzip编码压缩,且在传输过程中一般使用了chunked编码进行分块传输。后文在说到响应正文时,一般是指重组解压后的正文,后文中不再特别指出这一点。一个简单的正文示例如图1-2所示。

图1-2 一个最简单的响应正文示例

        如上图,还原出来的完整响应正文普遍使用了JSON格式。该数据格式的特征是整个正文都处于一对大括号{ }内。正文一般分成多个段,每个段由名和值组成,段与段之间用逗号隔开。有些段的值会由多个子段构成,一个段的所有子段也会用一对方括号[ ]或是大括号{ }括起来。大部分情况下,有四个一级段在正文是都存在的,包括:error_code(操作成功时值为0,操作失败时为对应错误代码)、time、ctime,以及logid。
【我们约定,与error_code处在同一层次的称为一级段,一级段的子段为二级段,以此类推。】
        下面就各行为做具体分析。


二、登录行为分析2.1 登录请求

        登录时,贴吧客户端使用一个POST请求来提交认证信息。该登录请求的请求行使用固定的URI:/c/s/login。由请求行的特征和Host头域的值可以确定一个登录行为。图2-1展示了当登录用户名为xinhua0123,登录口令为fengping888时,该请求报文的具体形式。

图2-1 一个登录请求报文示例

        请求报文的正文中存在变化过的登录口令和明文的用户名,其特征分别如下:

  • 变化后的口令
    前缀特征:passwd=
  • 用户名
    前缀特征:un=

        口令与用户名的结束标志均为&。贴吧客户端在发送登录请求前先对明文口令fengping888进行了Base64编码,得到中间结果ZmVuZ3Bpbmc4ODg=,接着再对中间结果进行了URL编码,由此得到最终结果ZmVuZ3Bpbmc4ODg%3D。

2.2 登录结果

        登录的结果在前述请求所对应的响应报文中。该响应报文的头部类似于图1-1所示的范例,其响应正文根据登录的结果不同而格式不同。图2-2分别展示了登录成功和失败时,所对应的响应正文。

(a)登录失败后响应正文

(b)登录成功后响应正文
图2-2 登录请求的响应正文

        如上图,登录成功与否可以根据error_code的值来判定,若为0,则成功。登录失败后的响应正文里存在名为error_msg的一级段,其值为服务器返回的错误提示信息的Unicode编码【详参我的另一篇博文:《HTTP协议分析中几种常见的汉字编码》】,如上图(a),将\u5bc6\u7801\u9519\u8bef\uff0c\u8bf7\u91cd\u65b0\u8f93\u5165转换为对应的Unicode字符,为:密码错误,请重新输入。这个错误信息将会显示在贴吧客户端,如图2-3.所示。

图2-3 登录失败后贴吧客户端给出错误提示“密码错误,请重新输入”

        登录成功后,服务器所给响应正文中一个比较重要的段是user,其子段中包含一些重要信息,一是登录用户的id和用户名,另一个是BDUSS。BDUSS是贴吧服务器在用户每次登录成功后所给出的一个通行证,以后用户在进行一些非匿名的操作时,就不用每次都重复登录,只需在请求正文中包含BDUSS即可。BDUSS在用户注销登录后失效,再次登录获得的BDUSS和上次不同。但尚不清楚BDUSS是否存在最长有效期(即在超过某个时限后不论用户是否注销登录,均强制失效)。推测在有效期内,通过BDUSS应该可以实施重放攻击,即可冒充登录用户进行操作,但尚未进行验证。

        在贴吧客户端上有“首页”、“进吧”、“身边”、“个人中心”四大功能区,下面按使用频率依次进行分析。


三、“进吧”相关操作分析

3.1 选择“进吧”功能区

        (……略,详参备注……)

3.2 进入某一个吧

        (……略,详参备注……)

3.3 看帖

        (……略,详参备注……)

3.4 回帖

        当我们点击“回复”后,客户端发出一个POST请求,其请求行URI固定为/c/c/post/add,Host头域的值为c.tieba.baidu.com。
        请求正文以BDUSS=开始,其值与登陆成功后服务器所返回的响应中一致。正文中还有三处重要的信息,分别是回复的内容(中文使用url编码)、被回复贴所在的贴吧的名字(中文使用url编码)、被回复贴子的ID。他们的前缀特征分别为content= 、kw= 、tid= ,后缀特征为&。当在四川大学吧回复一个ID为2404920336的帖子,回复内容为”too bad !”时,请求报文如图3-8所示。

图3-8 回帖时客户端发送的请求示例

        服务器返回的响应比较简单,头部和正文分别和图1-1、1-2类似。响应正文中比较重要的是error_code的值,为0的时候说明回复成功。

3.5 发帖

        当我们点击“发帖”后,客户端发出一个POST请求,其请求行URI固定为/c/c/thread/add,Host头域的值为c.tieba.baidu.com。请求正文则如图3-9所示。

图3-9 发帖时客户端发送的请求正文示例

        如上图,请求正文以BDUSS=开始,其值与登陆成功后服务器所返回的响应中一致。正文中还有三处重要的信息,分别是所发帖子的内容(中文使用url编码)、发贴所在贴吧的名字(中文使用url编码)、所发贴子的标题(中文使用url编码)。他们的前缀特征分别为content= 、kw=、title= ,后缀特征为&。
        服务器返回的响应比较简单,头部和正文分别和图1-1、1-2类似。响应正文中比较重要的是error_code的值,为0的时候说明回复成功。

3.6 签到

        用户在某贴吧里点击“签到”后,客户端发出一个POST请求,其请求行URI固定为/c/c/forum/sign,Host头域的值为c.tieba.baidu.com。请求正文以BDUSS=开始,其值与登陆成功后服务器所返回的响应中一致。正文中特征串kw=后是本次所要签到的的贴吧名(中文使用url编码),其结束标志是&。当在三国杀吧签到时,请求报文如图3-10所示。

图3-10 在“三国杀”吧点击“签到”后客户端发出的请求报文示例

        服务器返回的响应头部与图1-1基本一致,解压后的响应正文如图3-11所示。

图3-11 点击“签到”后服务器的响应正文

        如上图,正文以user_info一级段开始,其值由多个子段构成,含义分别为:is_sign_in表示签到是否成功,user_sign_rank的值表示用户第几个签到,sign_time表示用户签到时间,cont_sign_num表示用户本月连续签到数,cont_total_sign_num表示用户本月累计签到数。在整个user_info一级段之后是在1.2节中提到的四个常见一级段。

四、“个人中心”相关操作分析

        如图4-1所示,“个人中心”中进行的会引起网络通信行为的常见操作包括查看“我喜欢的吧”、“我的关注”、“我的粉丝”、“我的收藏”、“我的消息”、“我的帖子”、“我的微贴”,以及在“设置”里查看和修改个人资料。下面分别进行分析。

图4-1 贴吧客户端---个人中心


4.1 查看“我喜欢的吧”

        (……略,详参备注……)

4.2 查看“我的关注”

        (……略,详参备注……)

4.3 查看“我的粉丝”

        (……略,详参备注……)

4.4 查看“我的收藏”

        (……略,详参备注……)

4.5 查看“我的消息”

        (……略,详参备注……)

4.6 查看“我的帖子”

        (……略,详参备注……)

4.7 查看“我的微贴”

        (……略,详参备注……)

4.8 查看“设置---个人资料”

        在“个人中心”的右上角有“设置”,点进去后的第二项叫“个人资料”,点击后即可查看个人资料,如图4-13所示。

图4-13 查看个人资料

        在这个过程中,客户端也会发送一个POST请求,其请求行URI固定为/c/u/user/profile,Host头域的值为c.tieba.baidu.com。如图4-14,请求正文以BDUSS=开始,其值与登陆成功后服务器所返回的响应中一致。正文中有uid元素,值为客户端用户的ID。

图4-14 查看个人资料时客户端发出的请求正文示例

        服务器返回的响应头部与图1-1基本一致。如图4-15所示


图4-15 查看个人资料时服务器返回的响应正文

        如上图,响应正文中最重要的是user这个一级段。组成其值的几个重要子段分别为: id(用户ID)、name(用户名,客户端上有显示)、intro(用户个人简介,中文使用Unicode编码,客户端上有显示)、sex(用户性别,客户端上有显示)、like_forum_num(用户喜欢的贴吧数,即用户已成为会员的贴吧数)、concern_num(用户关注的用户数)、fans_num(用户拥有的粉丝数)。

4.9 修改“设置---个人资料”

        在“个人资料”的右上角有“保存”按钮,点击后即可完成修改个人资料。在这个过程中,客户端会发出一个POST请求,其请求行URI固定为/c/c/profile/modify,Content-Type头域的值为multipart/form-data ; boundary=--------7da3d81520810* ,表明正文采用了multipart/form-data格式,正文各子段之间使用"--------7da3d81520810*"作为分隔符。请求正文如图4-16所示(由于报文过长,部分不重要的子段被省略,用……代替)。

图4-16 修改“个人资料”时客户端发出的请求正文

        如上图,正文以“ --------7da3d81520810* ”标志开始,以“--------7da3d81520810*-- ”标志结束。正文中比较重要的子段的name分别为:BDUSS(登录凭证)、intro(个人简介)和sex(性别)。BDUSS子段的值与登陆成功后服务器所返回的响应中一致;intro子段的值是图4-13中“个人简介”的信息(中文使用UTF-8字符集);sex子段的值对应图4-13中的“性别”信息,男为1,女为2。
        服务器返回的响应比较简单,头部和正文分别和图1-1、1-2类似。响应正文中比较重要的是error_code的值,为0的时候说明修改成功。


五、其他操作及行为分析

5.1 首页

        (……略,详参备注……)

5.2 身边

        点击“身边”后,客户端和服务端会进行四次重要的HTTP会话,前两个会话用于客户端用户的定位,后两个会话分别用于查看“身边的微贴”和“身边的吧”。下面分别进行分析。

5.2.1 定位

        在定位过程进行的两次HTTP会话中,客户端使用的都是POST请求,两个请求头部的结构类似,但与其他操作发出的请求报文结构有极大不同。首先,两个POST的请求行URI都固定为/sdk.php;其次,请求的服务器(由请求头部Host头域的值指定)都变为了loc.map.baidu.com,而不再是其他请求中所用的c.tieba.baidu.com。请求正文的格式(由请求头部Content-Type头域的值指定)依旧是application/x-www-form-urlencoded。两个请求报文的头部、正文分别如图5-2【a】、【b】、【c】所示。


【a】定位请求的头部示例

【b】第一个定位请求的正文


【c】第二个定位请求的正文
图5-2进行定位时客户端发出的请求报文示例

        请求正文的含义尚未分析出来。
        服务器所给两个响应的报文结构基本一致,但正文的内容有很大不同,如图5-3所示。


【a】第一个定位请求对应的响应


【b】第二个定位请求对应的响应正文
图5-3 进行定位时服务器返回的响应报文示例

        服务器对第一个定位请求返回响应的含义尚未分析出来,但是在第二个定位请求所对应的响应正文中,我们可以还原出一些感兴趣的东西。它分为content和result两个一级段,在content一级段的值中有两个重要的子段:addr(客户端用户的当前地址信息),以及point(客户端用户的当前经纬度信息)。
        addr这个子段的值是将中文的地址信息(省、市、区、路)分别进行url编码得到中间结果,然后再将中间结果的%符号替换成\符号,将16进制值转换为8进制值得到。【编码方法详参我的另一篇博文:《HTTP协议分析中几种常见的汉字编码》】,上图【b】中addr的值还原出来就是:四川省,成都市,武侯区,建德北路,,75。
        在result一级段中有个time子段,这是客户端进行定位的时间。

5.2.2 查看“身边的微贴”

        (……略,详参备注……)

5.2.3 查看“身边的吧”

        (……略,详参备注……)

5.3 注销

        当用户在“账号管理”选择“编辑-->删除”以注销本次登录时,贴吧客户端使用一个POST请求来提交认证信息。该登录请求的请求行使用固定的URI:/c/s/loginout。由请求行的特征和Host头域的值可以确定一个注销行为。正文中特征串bduss=后是当前有效的通行证,与登陆成功后服务器所返回响应中的BDUSS一致,其结束标志是&。
        服务器返回的响应头部与图1-1基本一致,响应正文如图5-8所示。

图5-8 注销时服务器返回的响应正文

        如上图,注销成功后服务器所返回的响应正文的结构与登录失败时相类似,存在error_code和error_msg两个一级段,其中error_code的值为101,error_msg的值经过了Unicode编码【详参我的另一篇博文:《HTTP协议分析中几种常见的汉字编码》】。上图中编码转化出来是:未知错误。



------本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!------





回复

使用道具 举报

113

回帖

381

基友

582

积分

通神1段 Lv.4

Rank: 2

发表于 2013-10-15 02:10:09 | 显示全部楼层
长见识了
回复 支持 反对

使用道具 举报

282

回帖

139

基友

462

积分

凡人3阶 Lv.3

Rank: 2

发表于 2013-10-22 14:59:31 | 显示全部楼层
厉害呀。
回复 支持 反对

使用道具 举报

18

回帖

68

基友

71

积分

凡人2阶 Lv.2

Rank: 1

发表于 2013-11-13 09:56:39 | 显示全部楼层
netstat -nnetstat -n
回复 支持 反对

使用道具 举报

7657

回帖

86万

基友

34万

积分

天下一番

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

伯爵荣耀

发表于 2013-11-13 17:05:27 | 显示全部楼层
有些返回的json(比如说读贴吧页面)看的我头晕 必须通过json解析器来看= =
回复 支持 反对

使用道具 举报

167

回帖

21

基友

930

积分

通神2段 Lv.5

Rank: 3Rank: 3

伯爵荣耀

发表于 2013-11-15 20:00:57 | 显示全部楼层
本文特意略去了原文中
回复 支持 反对

使用道具 举报

6531

回帖

1万

基友

1万

积分

仙人6层 Lv.15

Rank: 9Rank: 9Rank: 9

发表于 2013-11-16 15:29:00 | 显示全部楼层
不明觉厉。
回复 支持 反对

使用道具 举报

87

回帖

150

基友

401

积分

凡人3阶 Lv.3

Rank: 2

发表于 2013-11-26 00:50:31 | 显示全部楼层
研究这个很快乐啊
回复 支持 反对

使用道具 举报

8

回帖

10

基友

38

积分

凡人1阶 Lv.1

Rank: 1

发表于 2014-2-21 12:28:27 | 显示全部楼层
不懂、、、、、、、、、、、、、、、、、、、、、、
回复 支持 反对

使用道具 举报

187

回帖

1301

基友

1948

积分

通神3段 Lv.6

Rank: 3Rank: 3

发表于 2014-3-10 08:52:48 | 显示全部楼层
谢谢分享
回复 支持 反对

使用道具 举报

280

回帖

-10

基友

190

积分

凡人2阶 Lv.2

Rank: 1

发表于 2014-5-16 10:57:09 | 显示全部楼层
逛逛
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|苍海国际 ( 鲁ICP备13020644号-1 )

GMT+8, 2024-5-17 10:13 , Processed in 0.047205 second(s), 30 queries .

Powered by Discuz! Theme By eRic Modified by 4bpa

© CangHai International We Do Our Rights!

返回顶部