Charles 移动设备抓包(转载)
除了最常见的网页爬虫,还有一种是针对客户端软件的爬虫。前者使用范围广泛,对后者的数据采集需求越来越大。潜水多年的小白第一次发帖,内容如有不当,请随意斧正。
常见客户端:
PC( Windows 、macOS 、Linux )、Android 、IOS
抓包工具:
支持平台:Windows 、 macOS 、 Linux
以下内容都是基于这款抓包软件。
需求分析:
想要批量或者自动获取某一平台客户端的某些数据。要做到我们的需求,需要使用网络抓包工具。据了解得知,网络协议层的每一层几乎都有对应的抓包工具。现如今最常用的协议是 https、http 这两种网络传输协议。
HTTP 协议抓包:
http 协议不包含 SSL ,抓包时只需要简单配置网络代{过}{滤}理即可抓取,而 https 需要安装证书并且信任证书才能抓取,否则无法解析显示为红色的 unknown 。
HTTPS 协议抓包:
https 协议在配置网络代{过}{滤}理的前提下还需要安装证书,并且必须让系统信任安装的证书才能实现对 https 协议进行抓包。
Charles 快速上手:
主界面:
常用功能菜单:
常用功能菜单,故名思义这两个菜单是经常会用到的,这里先做一些说明:
Proxy:
- Start Recording : 开始捕获网络流量,对应主界面的红点图标。
- Start Throttling : 进入低速网络模式,对应主界面的乌龟图标。
- macOS Porxy : 勾选时 Charles 处理 macOS 的网络流量。
- Proxy Settings : 配置 HTTP 代{过}{滤}理端口,在给同一局域网内设备安装证书,或是设置代{过}{滤}理时需用到,常见设置为 8888。这里还包含一些 HTTP 、SOCKS 相关的设置。
- SSL Porxying Setting : 配置是否启用 SSL ,启用时需配置主机(HOST)与端口(PORT)勾选上即为激活状态,在不清楚主机和端口时,可将主机与端口都设置为 *(星号),这样做可以捕获 http 和 https 的所有流量。
Help —— SSL Porxying:
- Install Charles Root Certificate : 安装证书到 macOS 系统内。
- Install Charles Root Certificate on a Mobile Device or Remote Browser : 为同一局域网内的其它设备安装 Charles 证书.
- Save Charles Root Certificate : 保存 Charles 证书到本地,可选 .pem .cer 两种类型的文件,推荐选择 .pem ,后续便于 Android 设备导入证书。
安装 Charles 证书
-
macOS :
- Charles 主界面点击 help —— SSL Porxying —— Install Charles Root Certificate ,默认安装即可完成安装。
- 正如前面所说,安装完以后还需要让系统信任这个证书,具体做法:在所有程序中找到 钥匙串访问 —— 左栏下方 —— 点击证书 —— 双击 Charles Proxy CA ——信任 ,可以将所有的选项都设置为 始终信任。即可成功开启对 HTTPS 协议的捕获。
-
IOS :
- Charles 主界面点击 help —— SSL Porxying —— Install Charles Root Certificate on a Mobile Device or Remote Browser 会出现 " Configure you device …… HTTP proxy on 192.168.1.6:8888 , then browse to chls.pro/ssl " 这里的 8888 在 Proxy —— Proxy Settings 内设置。
- 手机或者其它设备要和抓包主机连接到同一局域网(网络频段也有影响),打开 设置 —— 无线局域网 —— 点击与抓包主机同一个局域网的那个 Wi-Fi 拉到底部 —— HTTP 代{过}{滤}理 —— 配置代{过}{滤}理 —— 手动 —— 服务器填前面的 192.168.1.6 端口填 8888 —— 右上角存储 。
- 回到主界面,打开 Safari 浏览器,在地址栏输入前面的 chls.pro/ssl 打开。Charles 会弹出是否允许连接,点击 Allow 。手机上允许下载一个配置描述文件,下载完成后关闭。
- 手机打开设置 —— 通用 —— 拉到底部找到 描述文件 打开 —— 点击 Charles Proxy CA(……)—— 右上角安装 —— 输入密码再次安装 —— 完成后拉到上面找到 关于本机 进入 —— 拉到底部找到 证书信任设置 进入 —— 打开 针对根证书启用完全信任。
- 完成以上步骤后,即可抓取 IOS 客户端数据。
-
Android:
自 Android 7.0 以后无法信任第三方根证书,抓取第三方 app 数据时,现有方法几乎都需要 Root 设备,自行考虑风险。还可以使用 Android 模拟器来抓取数据,但是模拟器的信息不是很完整,容易被客户端app后台所识别出来,比较费力不讨好。现有的几种 Root 后抓取 HPPTS 的方法我都尝试过:
使用 Xposed & edxposed 模块,在安装了 Xposed & Edxposed 框架的前提下,再安装 TrustMeAlready 模块并激活(经测试,部分系统 Android 10 ,部分软件无法使用,比如X信小程序);
安装 VirtualXposed ,再安装 TrustMeAlready 模块并激活,因为 VirtualXposed 较容易被第三方app识别,从而禁止使用,优势是不需要root ;
Root 后将 Charles 根证书导入并信任根证书,这个办法其实是将 Charles 根证书转换后放到 Android 系统根目录内。
-
Charles 主界面点击help —— SSL Porxying —— Save Charles Root Certificate ,选择保存为 .pem 文件,以下只讲这种文件的转换方法。.cer 文件转换方法请自行寻找,欢迎交流。
-
保存好 .pem 文件后,macOS 需要安装 openssl ,然后打开 终端app —— 输入 openssl x509 -subject_hash_old -in Charles根证书文件.pem 回车结果如下,圈起来的这串字符很重要: d2479ff1
-
上一步完成后,将下载的 charles-proxy-ssl-proxying-certificate.pem 重命名为 d2479ff1.0 ,将 d2479ff1.0 文件放到手机内。
-
手机端安装 MT文件管理器 ,打开授予 root 权限,使用 MT文件管理器复制到 /system/etc/security/cacerts/ 文件夹内,重启手机,在设置内搜索 加密与凭据 —— 打开后找到 信任的凭据 打开 —— 在系统部分可以找到 详细信息为 Charles Proxy CA (……) 的证书,代表成功导入证书到系统中。 可使用 Charles 抓取 HTTPS 协议。
-
利用 Magisk 导入证书
自 Android O(8.0)以来,即使是获取了 root 权限,也很难修改系统分区文件,无法进行读写。且当下手机 root 方式都是利用 Magisk 修补 boot ,Magisk 还可以利用旁载的方式加载各种自定义模块,包括且不限于修改、替换系统文件。那么在这里我们可以根据上文所诉,创建一个 Magisk 补丁包,用以导入证书文件到根目录。
首先还是需要安装 Charles 以及 OpenSSL( Windows 推荐使用 choco install openssl 命令安装,需使用带管理员权限的 powershell )
导出证书文件
依次点击 charles -> help -> SSL Proxying -> Save Charles Root …… 选择位置导出 Charles 证书文件
转换证书文件
命令行切换到证书所在文件夹,运行:
openssl x509 -subject_hash_old -in 证书文件.pem
将证书文件改名为 d2479ff1.0 (以上文为例,后缀为 .0 )
创建 Magisk 模块
首先需要 Magisk 模块模板 magisk-module-template ,解压后文件列表为:
└─magisk-module-template-master │ customize.sh │ module.prop │ post-fs-data.sh │ README.md │ service.sh │ system.prop │ ├─META-INF │ └─com │ └─google │ └─android │ update-binary │ updater-script │ └─system #内部文件夹为自建 └─etc └─security └─cacerts
上图详细文件说明详见 Developer Guides这里我们关注 system 文件夹及子文件夹即可。模板文件是仅有 system 而没有其子文件夹的,system/etc/security/cacerts/ 刚好对应着我们本来要放证书的地方,即系统证书所在目录.此时将我们的证书文件放到 cacerts 文件夹内,将整个文件夹压缩为 zip 文件,放入手机内,在 Magisk 内刷入即可,验证方式如上。