Skip to main content

Android模拟器流量分析实战案例

· 9 min read
Megatron King

今天写一篇教程,讲解如何在Android模拟器上使用Reqable进行流量分析。

1. Android系统证书策略

首先,简单概述下Android系统的证书策略,可以帮助我们更好地分析问题。

在任何一个系统上,都会有一个CA证书管理器,里面内置了绝大多数常用的CA根证书。只有被这些根证书签发的SSL证书才能被系统信任(信任才能使得HTTPS等基于SSL协议的连接正常握手),Android系统也不例外。我们可以在设置中搜索信任的凭据查看系统中所有的证书。

在Android系统上,证书分为两个类型:系统证书用户证书。系统证书是系统出厂(或OTA)内置的,用户证书是用户自行安装的。

那么,系统证书和用户证书又什么区别呢?

目前Android的系统已经迭代到版本14.0了,对证书机制有一个非常重要的分水岭:Android 7.0。在7.0版本之前(不包括)用户证书和系统证书的权威性是等价的,也就是是系统会无条件信任用户证书。很明显,这可能带来一些安全隐患,所以从7.0开始,Android默认不再信任用户证书了。正常情况下,系统证书用户是没有权限修改(添加或者删除证书文件)的,用户证书则是没有限制的。

对于我们分析Android系统的流量,从Android 7.0开始就有了限制,Reqable/Charles/Fiddler等调试工具的证书安装到用户证书目录无效了,只有安装到系统目录才有效。

info

严格来说,上面这段话并不是完全正确的。Android系统为了兼容性考虑,如果App的 targetSDKVersion < 24 在Android 7.0+系统上也是可以信任用户证书的。当然,目前绝大多数App的targetSDKVersion都超过24了。

这种限制对于Android开发者而言也是相当不友好的,所以Android额外补充了网络安全配置文件功能,可以支持开发者在App中配置可以信任哪些用户证书。具体配置方式详见这里

从根本上解决证书问题,唯一可行的方式就是将调试工具的CA证书放到系统目录下,重新编译系统镜像是一种方式,但是粗暴了些。常规的方式还是解锁系统分区,然后手动写入CA证书文件。

2. Android模拟器

前面背景知识科普完了,下面以Android官方模拟器为例,讲解如何使用Reqable进行流量分析。

2.1 模拟器安装

首先下载安装Android Studio,无需梯子,直接下载速度非常快。

安装完成后启动,启动后无需新建项目,点击More Actions -> Virtual Devices Manager,打开模拟器管理器界面。

点击Create virtual Device,打开模拟器列表界面:

Android官方提供了大量的模拟器型号,包括手机、平板、电视、穿戴设备等,我们这里选择创建一个手机模拟器Pixel 6

caution

注意,请勿选择包含Play Store的型号,无法进行Root操作。不同的系统下,模拟器的架构不一样。例如我这里是MacBook M2,推荐的都是arm64架构的模拟器,性能是最佳的。在Windows x64平台下,推荐的一般都是x64架构的模拟器。

接下来,选择系统版本,然后点击Release Name右边的下载图标下载系统镜像,我们这里以Android 13.0为例。系统镜像下载完成后,点击Next进行下一步。

这一步可以对模拟器进行一些参数配置,例如内存大小、存储空间等,我们忽略这个配置。最后,点击Finish,完成模拟器的创建。

2.2 模拟器启动

caution

注意,这里我们通过命令后启动模拟器而不是通过GUI,因为需要追加启动参数。

首选,配置下Android SDK的环境变量,方便我们使用adbemulator命令。

export PATH="$PATH:/Users/megatronking/Library/Android/sdk/platform-tools"
export PATH="$PATH:/Users/megatronking/Library/Android/sdk/emulator"
export PATH="$PATH:/Users/megatronking/Library/Android/sdk/tools"
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"

这里是MacOS的环境变量配置,Windows略有不同。这里一定要注意PATH的先后顺序,否则模拟器可能无法启动。

接下来,我们使用emulator命令启动模拟器,Pixel_6_API_33是模拟器的名字。我们在Android StudioDevice Manager中可以看到模拟器的名字,将空格替换成下划线即可。

emulator -avd Pixel_6_API_33 -writable-system

如果没有报错的话,我们会看到模拟器启动成功了。

2.3 解锁系统分区

我们需要以root模式运行adb服务,新开一个命令行窗口,输入命令:

adb root
# 输出 restarting adbd as root

禁用secure boot verification,输入命令:

adb shell avbctl disable-verification
# 输出 Successfully disabled verification. Reboot the device for changes to take effect.

remount全部分区,输入命令:

adb remount
# 输出 Using overlayfs for /system
# 输出 Using overlayfs for /vendor
# 输出 Using overlayfs for /product
# 输出 Using overlayfs for /system_ext
# 输出 Now reboot your device for settings to take effect
# 输出 remount succeeded

可以看到system已经解锁了,下面就可以导入CA证书了。

2.4 导入CA证书

我们在Reqable中先导出CA证书,点击左下角下载按钮。

使用下面的命令,将上一步下载的证书导入到模拟器系统证书目录:

adb push reqable-ca.crt /system/etc/security/cacerts/364618e0.0

导入后,我们在模拟器系统的Settings中搜索credential,点击Trusted Credentials检查Reqable的CA证书是否存在于System目录中。

上图表示CA证书已经导入成功了。

3. 流量转发

我们需要将Android模拟器的流量转发到PC端的Reqable进行分析,有下面两种方式。

3.1 代理转发

将模拟器的代理配置设置为Reqable的代理服务器地址,点击模拟器右侧功能操作栏最下面的...按钮打开模拟器设置页面。

3.2 VPN转发

在模拟器上安装socksdroid,打开下面的地址下载apk文件。

https://github.com/bndeff/socksdroid/releases/download/1.0.3/socksdroid-1.0.3.apk

将下载好的socksdroid直接拖到模拟器窗口中进行安装,也可以使用adb进行安装。

adb install socksdroid-1.0.3.apk

安装完成后打开socksdroid,配置电脑的IP地址和Reqable代理端口,并启动右上角的开关。

4. 流量分析

在Reqable中启动调试,注意这时候无需配置系统代理,因为我们不需要分析电脑的流量。

在模拟器中使用Chrome打开Reqable官网测试下,效果OK。

我们再测试下原生应用,使用Android Studio写个Demo发送个请求试试:

看起来也没有问题,搞定。

4. 结尾

感谢阅读,再见!