在安卓模拟器上进行抓包分析

背景

笔者目前在一家从事手机游戏开发的公司担任运维岗,为了方便测试,我们往往会在办公电脑里面安装安卓模拟器去运行我们开发的游戏。在日常的工作中,会遇到一些场景需要对游戏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

安装并启动whistle

详细步骤请参考官方文档: http://wproxy.org/whistle/install.html

当whistle正常启动后,默认会监听0.0.0.0:8899端口,提供http代理服务。

whistle_status

在安卓系统中配置http代理

安卓版本太多,操作起来也有不一样,下面是一个示例:

configure

在whistle中查看抓包内容

一切都配置妥当后,我们就可以在电脑上通过浏览器打开whistle的页面去查看抓包结果了。

如下图,我在安卓模拟器上的浏览器刷新百度的首页,在whistle的页面上就能显示整个http请求过程。

capture

使用tcpdump抓包

使用adb接入安卓模拟器的shell环境

在大多数时候,当你电脑安装了安卓模拟器后,在模拟器的安装路径中,都会自带有adb工具。 建议把adb所在的路径添加到系统的环境变量PATH中,方便调用。

以下操作在windows cmd.exe中完成:

1
2
3
4
5
6
C:\Users\rondochen>adb devices
List of devices attached
emulator-5554 device

C:\Users\rondochen>adb shell
root@aosp:/ #

使用tcpdump开始抓取网络流量

以下操作在安卓系统的shell中完成:

1
2
# 注意保存路径的权限设置
tcpdump -vv -s 0 -p -w /data/dumpfiles/test.pcap

抓取完成后,使用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,有空再试试看;-) 。