百度贴吧客户端(Android)网络通信行为分析
百度贴吧安卓客户端网络通信行为分析
本文由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)网络通信行为分析相关推荐
- Android仿百度贴吧客户端Loading小球
前言 使用百度贴吧客户端的时候发发现加载的小动画挺有意思的,于是自己动手写写看.想学习自定义View以及自定义动画的小伙伴一定不要错过哦. 读者朋友需要有最基本的canvas绘图功底,比如画笔Pain ...
- Android源码分析 - Framework层的Binder(客户端篇)
开篇 本篇以aosp分支android-11.0.0_r25作为基础解析 我们在之前的文章中,从驱动层面分析了Binder是怎样工作的,但Binder驱动只涉及传输部分,待传输对象是怎么产生的呢,这就 ...
- android源码分析
01_Android系统概述 02_Android系统的开发综述 03_Android的Linux内核与驱动程序 04_Android的底层库和程序 05_Android的JAVA虚拟机和JAVA环境 ...
- android 源码分析
感谢网友banketree的收集,压缩包的内容如下: 1.360新版特性界面源代码 实现了360新版特性界面的效果,主要涉及到Qt的一些事件处理与自定义控件.但源码好像是c++. 2.aidl跨进程调 ...
- Android源码分析--MediaServer源码分析(二)
在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...
- Android DRM框架分析
Android DRM框架分析 1. DRM框架 2.DRM架构 3.DRM插件 4. 实现 5.DRM插件详情 6.MediaDrm 7.MediaCrypto 8.参考链接 1. DRM框架 An ...
- 免费分享:5本安卓开发经典书籍,Android 7编程入门经典(第4版),Android底层驱动分析和移植,底层驱动分析和移植
1.Android 7编程入门经典(第4版) 使用Android Studio 2 PDF 下载 下载地址: http://www.askwinds.com/r-c/down-info-02/579 ...
- Android GNSS 模块分析(四)HAL 层
紧接着上一篇(Android GNSS 模块分析(三)JNI 层),继续来分析下 Android GNSS HAL 层的功能,本篇准备先介绍下 HIDL 层的封装.至于后面的 HAL 层的功能,由于使 ...
- idcardweb装入失败_vpk安装错误0xffffe Android Crash问题分析以及解决 - 硬件设备 - 服务器之家...
vpk安装错误0xffffe Android Crash问题分析以及解决 发布时间:2017-04-10 来源:服务器之家 1.问题介绍 Crash问题,无论是java侧还是native侧,在日常测试 ...
- Android display架构分析-SW架构分析(1-8)
参考: Android display架构分析二-SW架构分析 Android display架构分析三-Kernel Space Display架构介绍 Android display架构分析四-m ...
最新文章
- POJ-3687-Labeling Balls
- 关于简聊 Webpack 配置的一些注释
- C++——重载运算符和重载函数
- 来自长辈的5句教导!
- 杂项题的基本解题思路——4、流量取证技术
- adaboost算法java_Adaboost 算法实例解析
- WPF 带CheckBox、图标的TreeView
- SDUT-2121_数据结构实验之链表六:有序链表的建立
- 动物面部识别技术哪个强?奶牛鸡猪狗绵羊……
- android 列表上拉加载更多,Android 下拉刷新,上拉加载更多控件–支持ListView,GridView和ScrollView...
- java中时时检查代码中变量的值_如何调试JDK源代码并查看局部变量值
- cpp调用python_从python ctypes调用CPP函数
- 基于扩频信号的水声信道数据传输系统仿真,研究满足了WSSUS假设的瑞利信道模型,采用相干BPSK调制,联合多普勒Rake接收机
- 安全防范趋势、信息安全管理、隐私保护
- html隐藏图片白色部分,css去掉gif透明图片的白边
- [webpack] Content not from webpack is served from “xxxx“ 并且 http://localhost:8080/ 数据为空解决方案
- 华为设备配置SEP多环
- CUDA实现focal_loss
- java实现微博网站设计_基于jsp的微博网站-JavaEE实现微博网站 - java项目源码
- 【车间调度】模拟退火算法求解车间调度(jobshop-3)问题【含Matlab源码 1082期】