安卓抓包实战:使用 Charles 抓取 App 数据全流程详解
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/
抓包环境准备
1. 下载安装charles
charles下载地址:https://www.charlesproxy.com/latest-release/download.do
2. SSL代理设置
SSL Proxying Settings…
说明:如果需要抓 PC 上的数据就开启 Windows Proxy,如果只是抓手机上的数据可以不用开启。
配置说明:
*:443 — 表示拦截所有域名的 HTTPS 请求
*:80 — 表示拦截所有域名的 HTTP 请求
3. Enable transparent HTTP proxying
打开 Proxy Settings 勾选 Enable transparent HTTP proxying
transparent HTTP proxying:客户端无需设置代理,Charles 通过网络层拦截(如防火墙、端口转发、网关路由等)来强制把 HTTP 流量转发到 Charles
4. 设置Charles与Clash共存
如果开启了Clash,需要设置Charles与Clash共存
打开扩展代理设置
分别点击 Web Proxy、Seure Web Proxy 和 SOCKS Proxy 设置一下Clash的地址和端口
5. 共享热点
通过 ipconfig 命令找到电脑的 ip 地址
或者打开【网络和Internet】找到电脑的 ip 地址
电脑开启共享热点,手机连接热点并设置代理
6. 安装证书
手机端访问 http://chls.pro/ssl 安装证书
下载并保存Charlles证书
Android 7.0 之后抓取HTTPS数据出现unknown
Android 7.0+ 系统默认不再信任用户证书(即只信任系统证书),所以必须安装为系统证书
1. 保存Charles证书
2. 计算证书的Hash值
下载安装 OpenSSL:https://slproweb.com/products/Win32OpenSSL.html
计算证书的Hash值
cd D:\App\OpenSSL-Win64\bin
./openssl x509 -inform PEM -subject_hash_old -in E:\charles.pem
比如这里得到的hash值为e4473cf9,把证书的文件名改为 e4473cf9.0
3. 安装证书到系统证书目录
把证书 push 到 /system/etc/security/cacerts(系统证书目录)
# 先把证书 push 到 sdcard
adb push E:\e4473cf9.0 /sdcard/e4473cf9.0
# 获取超级管理员权限
adb root
# 进入adb shell
adb shell
# 挂载 / 为可读写
mount -o remount,rw /
# 把 sdcard 下面的证书移动到
/system/etc/security/cacerts
mv /sdcard/e4473cf9.0 /system/etc/security/cacerts/e4473cf9.0
# 进入 /system/etc/security/cacerts 目录 ls 一下检查是否有刚添加的证书文件
cd /system/etc/security/cacerts
ls
# 重启手机让证书生效
reboot
手机设置中打开【信任的凭据】【系统】可以看到已经有charles的证书了
4. 测试
重启手机和 Charles 后,再重新抓包 app 数据,可以看到已经能正常显示 https 数据了
Android证书安装自动化脚本
编写一个自动化脚本把证书复制的 Android 系统证书目录
@echo off
setlocal enabledelayedexpansion
:: 检查参数是否存在
if "%~1"=="" (
echo 请将证书文件拖到该脚本上运行,或输入完整路径:
set /p CERT_PATH=请输入证书文件路径:
) else (
set CERT_PATH=%~1
)
:: 获取证书文件名
for %%F in ("%CERT_PATH%") do set CERT_FILE=%%~nxF
echo [*] 正在 push 证书到 /sdcard/...
adb push "%CERT_PATH%" /sdcard/%CERT_FILE%
echo [*] 获取 root 权限并 remount /
adb root
adb remount
echo [*] 开始复制证书到 /system/etc/security/cacerts/
adb shell "mv /sdcard/%CERT_FILE% /system/etc/security/cacerts/%CERT_FILE% && chmod 644 /system/etc/security/cacerts/%CERT_FILE%"
echo.
echo [*] 检查是否复制成功:
adb shell "ls /system/etc/security/cacerts/ | grep %CERT_FILE%"
echo.
set /p REBOOT=是否现在重启设备以生效?(Y/N):
if /I "%REBOOT%"=="Y" (
echo [*] 正在重启设备...
adb reboot
) else (
echo [!] 请手动重启设备以让证书生效。
)
pause
效果如下:
Charles证书过期怎么处理
当 Charles 证书过期抓包也会出现数据包全是 unkown 的情况
这时候需要重新生成并安装新的根证书。
1. 看证书有效期
从以下路径查看证书有效期
Charles证书一般有效期是1年,过了有效期之后再次抓包会显示unknown
2. 重置证书
如果证书过期,从以下路径重置证书
点击 Reset
重新查看证书有效期已经更新
3. 重新安装证书(Windows)
把设备上的旧证书删除,重新安装新的证书。
打开计算机证书
删除过期证书
Help -> SSL Proxying -> Install Charles Root Certificate
安装证书
本地计算机
受信任的根证书颁发机构,点确定,导入完成。
4. 重新安装证书(Android)
删除旧证书
# 获取超级管理员权限
adb root
adb shell
# 挂载 / 为可读写
mount -o remount,rw /
# 删除旧证书
rm /system/etc/security/cacerts/e4473cf9.0
保存新证书到本地
把 charles.pem 转换为系统证书格式(.0)
cd D:\App\OpenSSL-Win64\bin
./openssl x509 -inform PEM -subject_hash_old -in E:\charles.pem
得到 hash 值 30cb9a2e,把 charles.pem 改名为 30cb9a2e.0
把证书 push 到 /system/etc/security/cacerts(系统证书目录)
重启一下设备和 Charles ,再抓包可以看到 https 数据已经成功解密