在安卓模拟器上进行抓包分析
背景
笔者目前在一家从事手机游戏开发的公司担任运维岗,为了方便测试,我们往往会在办公电脑里面安装安卓模拟器去运行我们开发的游戏。在日常的工作中,会遇到一些场景需要对游戏APP进行抓包分析,下面来分享一些工作经验。
工具介绍
Whistle
Github地址:https://github.com/avwo/whistle
Whistle是基于 Node 实现的跨平台抓包调试代理工具,支持多种协议,并具有丰富的功能。
adb
Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。
官方文档:https://developer.android.google.cn/studio/command-line/adb
tcpdump
TCPDump可以将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
官方文档:https://www.tcpdump.org/manpages/tcpdump.1.html
Wireshark
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
官方文档:https://wiki.wireshark.org/FrontPage
两种方法
使用whistle进行http代理抓包
实现原理
如下图,在安卓模拟器的网络设置中,添加http代理设置,指向运行Whistle的IP和端口。这样,安卓模拟器的http流量就会经过whistle,最后我们可以在whistle的后台页面上看到安卓模拟器中发起的各个http请求以及返回情况。
安装并启动whistle
详细步骤请参考官方文档: http://wproxy.org/whistle/install.html
当whistle正常启动后,默认会监听0.0.0.0:8899
端口,提供http代理服务。
在安卓系统中配置http代理
安卓版本太多,操作起来也有不一样,下面是一个示例:
在whistle中查看抓包内容
一切都配置妥当后,我们就可以在电脑上通过浏览器打开whistle的页面去查看抓包结果了。
如下图,我在安卓模拟器上的浏览器刷新百度的首页,在whistle的页面上就能显示整个http请求过程。
使用tcpdump抓包
使用adb接入安卓模拟器的shell环境
在大多数时候,当你电脑安装了安卓模拟器后,在模拟器的安装路径中,都会自带有adb工具。 建议把adb所在的路径添加到系统的环境变量PATH
中,方便调用。
以下操作在windows cmd.exe
中完成:
1 | C:\Users\rondochen>adb devices |
使用tcpdump开始抓取网络流量
以下操作在安卓系统的shell中完成:
1 | # 注意保存路径的权限设置 |
抓取完成后,使用ctrl+c
终止命令即可,抓包数据会保存在指定的路径下。
把抓包结果传回PC
以下操作在cmd.exe
中进行:
1 | adb pull /data/dumpfiles/test.pcap C:/dumpfiles/ |
最后我们就可以在PC的C:/dumpfiles/
目录下获得抓包结果,就可以用wireshark打开,进行常规的抓包分析了。
总结
不难看出,上面介绍到的方案各有优劣:
使用tcpdump配合wireshark的抓包结果无疑是最全的,除了http请求外,还能清楚看到像dns或者是TLS握手过程等步骤,代价就是需要多一些功夫。但是方便快捷的whistle也有一个逃不掉的硬伤,因为whistle是通过系统代理实现的抓包,当遇到了绕过了系统http代理设置的场景,这个方法就不适用了。
而从我的工作日常来看,大部分时候我使用的都是whistle。因为我的分析工作大多数都是基于http场景,而且whistle除了抓包之外还提供了debug工具,还可以很轻易地通过中间人攻击原理解密https请求,让我快速定位到故障。
至于说到使用adb+tcpdump操作起来有点麻烦这个问题,这里提供一个一劳永逸的方案:androiddump,有空再试试看;-) 。