百度贴吧安卓客户端网络通信行为分析
本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!
一、实验环境与结果概述
1.1 实验环境
手机型号:HUAWEI C8812
操作系统:Android 4.0.3
应用版本:百度贴吧4.0.0
分析工具:Tcpdump for Android,WireShark 1.10.0rc2
【抓包的具体方法详参我的下一篇博文:《基于tcpdump的安卓手机抓包完整解决方案》】
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 一个最简单的响应正文示例
如上图,还原出来的完整响应正文处于一对大括号{ }内。正文一般分成多个段,每个段由名和值组成,段与段之间用逗号隔开。有些段的值会由多个子段构成,一个段的所有子段也会用一对方括号[ ]或是大括号{ }括起来。大部分情况下,有四个一级段在正文是都存在的,包括: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】原创,转载请注明出处!------
备注:
本文其实是作者的一门课程作业,为了使本文不至于因太过冗长而显得枯燥,本文略去了原文中一些比较乏味的内容,尽量呈现的是一些可能更令您感兴趣的贴吧功能。若是您确实需要阅读更完整的版本,可以前往CSDN下载频道 【http://download.csdn.net/detail/ping_fani07/6028411】下载本文的PDF完整版。