本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创

百度贴吧安卓客户端网络通信行为分析

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

写在前面

本文其实是作者我的一门研究生课程作业,为了使本文不至于因太过冗长而显得枯燥,本文特意略去了原文中一些比较重复乏味的内容,尽量呈现的是一些可能更令您感兴趣的贴吧功能。若是您确实需要阅读更完整的版本,可以前往CSDN下载频道 【http://download.csdn.net/detail/ping_fani07/6028411】下载本文的PDF完整版。

出于个人隐私保护的考量,本文所举的例子中,改动了一些关键信息,请勿对号入座~

Thank you for your reading !

一、实验环境与结果概述

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协议分析中几种常见的汉字编码》】。上图中编码转化出来是:未知错误。

百度贴吧安卓客户端网络通信行为分析相关推荐

  1. 企鹅安卓客户端联系人列表数据解密分析及Java实现

    由于某些原因,本文暂不提供成型的软件,只提供思路和部分代码,感兴趣的同学可以用Swing或者JavaFX写个UI出来 前段时间,我的企鹅号莫名其妙的被封了7天,在此期间无论如何申诉都没有效果,只好作罢 ...

  2. 端傳媒 android客户端,知乎安卓客户端交互设计分析!

    虽然不是重度知乎使用者,但几乎有问题都会第一时间在知乎上进行搜索,空闲时也会刷刷知乎解解闷.在使用过程中,发现知乎客户端有不少地方可以改进,下面说说我的一些想法. 安卓4.0版本 搜索和提问 如果我想 ...

  3. android 交互什么意思,知乎安卓客户端交互设计分析

    虽然不是重度知乎使用者,但几乎有问题都会第一时间在知乎上进行搜索,空闲时也会刷刷知乎解解闷.在使用过程中,发现知乎客户端有不少地方可以改进,下面说说我的一些想法. 安卓4.0版本 搜索和提问 如果我想 ...

  4. FishRedux完成一个玩安卓客户端

    文章目录 FishRedux完成一个玩安卓客户端 前言 基本架子 页面预览 路由定义: 首页 view and so on 定义自己的TabController 页面保活 Adapter写法 adap ...

  5. 关于 微软必应词典客户端 的案例分析

    关于 微软必应词典客户端 的案例分析 第一部分 调研,评测 朋友的体验 背景和需求 我采访的是我的同学:樊皓楠 他是我们计算机学院13级学生,有着很强的学习能力和欣赏能力.对于英语翻译软件,他一直都有 ...

  6. android 网页交互设计,知乎安卓客户端交互设计分析

    虽然不是重度知乎使用者,但几乎有问题都会第一时间在知乎上进行搜索,空闲时也会刷刷知乎解解闷.在使用过程中,发现知乎客户端有不少地方可以改进,下面说说我的一些想法. 安卓4.0版本 搜索和提问 如果我想 ...

  7. 某手安卓自动刷视频分析

    某手安卓自动刷视频分析 首先致敬大佬 快手apk本身的签名验证 工具框架环境介绍得差不多了,进入正题 既然已经找到执行代码的关键call TimeTask 示例 越写越觉得自己很啰嗦,本人菜鸟,大神勿 ...

  8. 基于servlet的服务端与安卓客户端的通信(文本)

    首先,先看一下服务端包的结构 首先是UserManager类 package com.server.servelt; import java.io.ByteArrayOutputStream; imp ...

  9. 安卓端和服务器端通信协议,安卓客户端和服务器如何通信协议

    安卓客户端和服务器如何通信协议 内容精选 换一换 华为云ROMA Connect服务帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助 ...

  10. 安卓连接mysql客户端_安卓客户端与mysql服务器端数据交互

    1.安卓客户端的配置(上传数据) package com.dlvtc.upphp; import java.io.IOException; import java.io.UnsupportedEnco ...

最新文章

  1. python批量删除特定字符_根据某个特定字符删除一行
  2. JavaScript网页换肤
  3. 不合法的媒体文件 id_注意!伦敦男孩、DKNY、Coach、地素... 这些品牌的服装,抽检不合格...
  4. 从零入门 Serverless | 一文详解 Serverless 架构模式
  5. 教师节特辑丨网易云信:素质教育「名师」是如何炼成的?
  6. 常见八种安卓开发报错的方式
  7. mysql存储引擎使用教程_mysql教程:如何写MySQL存储引擎
  8. datetime的文本时间处理
  9. ioprofile mysql_使用pt-ioprofile对MySQL作IO剖析
  10. c++ 字符串中的字符无效_13python中的字符串
  11. Android 轮播图从 0 到 1
  12. python 和scikit安装
  13. 一些关于java的笔记
  14. 计算机怎么看c盘用户名,如何查看c盘的软件 如何查看电脑上安装在C盘的软件...
  15. 虚拟机安装linux输入密钥,远程连接虚拟机并做密钥认证
  16. 英文论文要怎么查重?
  17. 猿辅导 x DorisDB:构建统一OLAP平台,全面升级数据分析能力
  18. uci拒绝认证_关于车架上UCI认证贴纸的10个常见问题
  19. ORB_SLAM2及其他SLAM精度测评
  20. 关于Abaqus+python提取s11残余应力(按路径提取)

热门文章

  1. 八数码问题matlab实现,A* 算法解决八数码问题 matlab
  2. mixly 添加micropython_Mixly软件下载-Mixly(米思齐图形化编程工具)官方版下载v1.04 - 欧普软件园...
  3. 服务器启动端口被占用,解决Nginx启动出现端口被占用的问题
  4. matlab矩阵处理实验报告,MATLAB矩阵实验报告.doc
  5. 一文带你详解矩阵键盘工作原理
  6. matlab 中没有imrotate,matlab – 在没有图像处理工具箱的情况下旋转图像
  7. 平衡小车——编码器原理及其使用
  8. 复数fft的时间复杂度_DFT算法与FFT算法的优劣分析
  9. 靶机渗透练习06-driftingblues6 (利用脏牛提权)
  10. 烽火服务器查询服务器型号,烽火服务器应该起的进程