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

本文由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编码【详参我的另一篇博文:《使用WireShark分析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进制值得到。【编码方法详参我的另一篇博文:《使用WireShark分析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编码【详参我的另一篇博文:《使用WireShark分析HTTP协议时几种常见的汉字编码》】。上图中编码转化出来是:未知错误。

百度贴吧客户端(Android)网络通信行为分析相关推荐

  1. Android仿百度贴吧客户端Loading小球

    前言 使用百度贴吧客户端的时候发发现加载的小动画挺有意思的,于是自己动手写写看.想学习自定义View以及自定义动画的小伙伴一定不要错过哦. 读者朋友需要有最基本的canvas绘图功底,比如画笔Pain ...

  2. Android源码分析 - Framework层的Binder(客户端篇)

    开篇 本篇以aosp分支android-11.0.0_r25作为基础解析 我们在之前的文章中,从驱动层面分析了Binder是怎样工作的,但Binder驱动只涉及传输部分,待传输对象是怎么产生的呢,这就 ...

  3. android源码分析

    01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 ...

  4. android 源码分析

    感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...

  5. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  6. Android DRM框架分析

    Android DRM框架分析 1. DRM框架 2.DRM架构 3.DRM插件 4. 实现 5.DRM插件详情 6.MediaDrm 7.MediaCrypto 8.参考链接 1. DRM框架 An ...

  7. 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植

    1.Android 7编程入门经典(第4版) 使用Android Studio 2  PDF 下载 下载地址: http://www.askwinds.com/r-c/down-info-02/579 ...

  8. Android GNSS 模块分析(四)HAL 层

    紧接着上一篇(Android GNSS 模块分析(三)JNI 层),继续来分析下 Android GNSS HAL 层的功能,本篇准备先介绍下 HIDL 层的封装.至于后面的 HAL 层的功能,由于使 ...

  9. idcardweb装入失败_vpk安装错误0xffffe Android Crash问题分析以及解决 - 硬件设备 - 服务器之家...

    vpk安装错误0xffffe Android Crash问题分析以及解决 发布时间:2017-04-10 来源:服务器之家 1.问题介绍 Crash问题,无论是java侧还是native侧,在日常测试 ...

  10. Android display架构分析-SW架构分析(1-8)

    参考: Android display架构分析二-SW架构分析 Android display架构分析三-Kernel Space Display架构介绍 Android display架构分析四-m ...

最新文章

  1. POJ-3687-Labeling Balls
  2. 关于简聊 Webpack 配置的一些注释
  3. C++——重载运算符和重载函数
  4. 来自长辈的5句教导!
  5. 杂项题的基本解题思路——4、流量取证技术
  6. adaboost算法java_Adaboost 算法实例解析
  7. WPF 带CheckBox、图标的TreeView
  8. SDUT-2121_数据结构实验之链表六:有序链表的建立
  9. 动物面部识别技术哪个强?奶牛鸡猪狗绵羊……
  10. android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...
  11. java中时时检查代码中变量的值_如何调试JDK源代码并查看局部变量值
  12. cpp调用python_从python ctypes调用CPP函数
  13. 基于扩频信号的水声信道数据传输系统仿真,研究满足了WSSUS假设的瑞利信道模型,采用相干BPSK调制,联合多普勒Rake接收机
  14. 安全防范趋势、信息安全管理、隐私保护
  15. html隐藏图片白色部分,css去掉gif透明图片的白边
  16. [webpack] Content not from webpack is served from “xxxx“ 并且 http://localhost:8080/ 数据为空解决方案
  17. 华为设备配置SEP多环
  18. CUDA实现focal_loss
  19. java实现微博网站设计_基于jsp的微博网站-JavaEE实现微博网站 - java项目源码
  20. 【车间调度】模拟退火算法求解车间调度(jobshop-3)问题【含Matlab源码 1082期】

热门文章

  1. java Graphics2D 获取当前系统实际支持特殊字符和中文的字体
  2. 关于Windows 443端口被占用问题的解决
  3. 录制软件obs的使用方法
  4. Shapley算法总结
  5. Origin introduction and install
  6. 数字图像处理 matlab图像的几何运算 实验三 旋转 缩放 裁剪 镜像变换 平移
  7. 2022年最新京东滑块验证码破解思路(算法过验)
  8. OpenCV特征检测与匹配方法概览
  9. 神经元模型hhmodel模型_HH神经元模型 -
  10. 51单片机基本刷屏测试实验_320x240真彩TFT屏51单片机驱动刷屏程序