版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/

抓包环境准备

1. 下载安装charles

charles下载地址:https://www.charlesproxy.com/latest-release/download.do

word/media/image1.png

2. SSL代理设置

SSL Proxying Settings…

word/media/image2.png 说明:如果需要抓 PC 上的数据就开启 Windows Proxy,如果只是抓手机上的数据可以不用开启。

配置说明:

  • *:443 — 表示拦截所有域名的 HTTPS 请求

  • *:80 — 表示拦截所有域名的 HTTP 请求

word/media/image3.png

3. Enable transparent HTTP proxying

打开 Proxy Settings 勾选 Enable transparent HTTP proxying

word/media/image4.png transparent HTTP proxying:客户端无需设置代理,Charles 通过网络层拦截(如防火墙、端口转发、网关路由等)来强制把 HTTP 流量转发到 Charles

4. 设置Charles与Clash共存

如果开启了Clash,需要设置Charles与Clash共存

打开扩展代理设置

word/media/image5.png

分别点击 Web Proxy、Seure Web Proxy 和 SOCKS Proxy 设置一下Clash的地址和端口

word/media/image6.png

5. 共享热点

通过 ipconfig 命令找到电脑的 ip 地址

word/media/image7.png

或者打开【网络和Internet】找到电脑的 ip 地址

word/media/image8.png

电脑开启共享热点,手机连接热点并设置代理

word/media/image9.png

6. 安装证书

手机端访问 http://chls.pro/ssl 安装证书

word/media/image10.png

word/media/image11.png

下载并保存Charlles证书

word/media/image12.png

Android 7.0 之后抓取HTTPS数据出现unknown

Android 7.0+ 系统默认不再信任用户证书(即只信任系统证书),所以必须安装为系统证书

word/media/image13.png

1. 保存Charles证书

word/media/image14.png

word/media/image15.png

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

word/media/image16.png

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的证书了

word/media/image17.jpeg

4. 测试

重启手机和 Charles 后,再重新抓包 app 数据,可以看到已经能正常显示 https 数据了

word/media/image18.png

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

效果如下:

word/media/image19.png

Charles证书过期怎么处理

当 Charles 证书过期抓包也会出现数据包全是 unkown 的情况

word/media/image20.png 这时候需要重新生成并安装新的根证书。

1. 看证书有效期

从以下路径查看证书有效期

word/media/image21.png

Charles证书一般有效期是1年,过了有效期之后再次抓包会显示unknown

word/media/image22.png

2. 重置证书

如果证书过期,从以下路径重置证书

word/media/image23.png

点击 Reset

word/media/image24.png

重新查看证书有效期已经更新

word/media/image25.png

3. 重新安装证书(Windows)

把设备上的旧证书删除,重新安装新的证书。

打开计算机证书

word/media/image26.png

删除过期证书

word/media/image27.png

Help -> SSL Proxying -> Install Charles Root Certificate

word/media/image28.png

安装证书

word/media/image29.png

本地计算机

word/media/image30.png

受信任的根证书颁发机构,点确定,导入完成。

word/media/image31.png

4. 重新安装证书(Android)

删除旧证书

# 获取超级管理员权限
adb root 

adb shell 

# 挂载 / 为可读写
mount -o remount,rw /

# 删除旧证书
rm /system/etc/security/cacerts/e4473cf9.0

保存新证书到本地

word/media/image32.png

把 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

word/media/image33.png

把证书 push 到 /system/etc/security/cacerts(系统证书目录)

word/media/image34.png

重启一下设备和 Charles ,再抓包可以看到 https 数据已经成功解密

word/media/image35.png