Charles抓包教程

一、Charles简介

Charles 是一款功能强大的网络调试工具,主要用于监测、分析和调试网络请求和响应。它是一种代理工具,可以截获和查看设备与服务器之间的 HTTP 和 HTTPS 流量,支持跨平台使用(Windows、macOS、Linux)

二、安装&抓包教程

  1. 官网下载安装

    官方最新版都是英文,也可自行找Charles汉化版,以下均为汉化版的例子

  2. 开启CharlesHTTP代理

    image-20240127153654523

  3. 启用CharlesSSL代理,并开放端口

    image-20240127160012425

  4. 安装证书(https的请求才需要)

    image-20240127160732953

安卓模拟器

  1. 模拟器网络详情中设置代理地址(根据Charles中的配置)

    部分模拟器的网络详情编辑入口有所不同,需长按网络进入高级选项,Charles的代理地址在安装根证书的时候会给予提示

    image-20240127154130785

  2. 浏览至chls.pro/ssl,以下载证书并安装证书(会提示你设置图案密码)

真机

过程跟安装模拟器一样就不过多阐述了,唯一需要注意的是手机需要与Charles的代理地址在同一个网段,也就是要同一个局域网

三、常见问题

问题1:配置了SSL证书依然unknown

报错参考:

image-20240127162021046

原因:

官方回应:针对API Level 24及更高版本的应用程序不再信任用户或管理员添加的CA用于安全连接,所以就算你手机上安装了受信任的证书也没用。当然官方对于这种情况也给出了解决方案:官方信任自定义CA教程

解决方案:

以下环境均为Windows,安卓模拟器为逍遥模拟器oppenssl软件库包用的是Git(推荐)自带的,也可自行查找安装教程(很麻烦,极其不推荐):官网下载

  1. chls.pem的证书当前目录右键执行Git Bash Here

    以下是将导出的pem证书计算hash

    1
    openssl x509 -subject_hash_old -in chls.pem

    其中红色框的为所需hash值,每个证书命名规则为<Certificate_Hash>.<Number>,后缀名的数字是为了防止文件名冲突的。比如两个证书算出的Hash值是一样的话,那么一个证书的后缀名数字可以设置成0,而另一个证书的后缀名数字可以设置成1,我这边就替换成1e82f68a.0.pem

    image-20240127143050682

  2. 将重命名后的pem放入模拟器安装目录下(与adb.exe同级),并顺序执行以下命令

    逍遥模拟器MEmu路径:D:\Microvirt\MEmu\1e82f68a.0.pem,各模拟器有所差异

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    # 1.adb连接模拟器,`21503`为逍遥模拟器端口,各模拟器可能有所不同
    D:\Microvirt\MEmu>adb connect 127.0.0.1:21503
    already connected to 127.0.0.1:21503

    # 2.判断是否开启root权限
    D:\Microvirt\MEmu>adb root
    adbd is already running as root

    # 3.开启写入模式
    D:\Microvirt\MEmu>adb remount
    remount succeeded

    # 4.将该pem文件发送至模拟器的证书目录下
    D:\Microvirt\MEmu>adb push 1e82f68a.0.pem /system/etc/security/cacerts/
    1e82f68a.0.pem: 1 file pushed, 0 skipped. 0.8 MB/s (1920 bytes in 0.002s)
  3. 查看是否安装证书成功

image-20240127144941518

问题2:证书写入模拟器报错

报错参考:

1
2
3
D:\Microvirt\MEmu>adb push 1e82f68a.0.pem /system/etc/security/cacerts/
1e82f68a.0.pem: 1 file pushed, 0 skipped. 10.2 MB/s (1920 bytes in 0.000s)
adb: error: failed to copy '1e82f68a.0.pem' to '/system/etc/security/cacerts/1e82f68a.0.pem': remote couldn't create file: Read-only file system

原因:

模拟器默认为共享系统盘,但是系统盘没有写入的权限,需调整文件的可读写权限或者更改磁盘共享模式,各大模拟器雷同

解决方案:

在逍遥模拟器的系统设置中将磁盘共享模式改为独立系统盘

image-20240127145555800

问题3:部分app依旧https请求为unknown

原因&解决方案:

如果以上证书都放置系统信任证书里,但是仍然会有些app抓不到内容,则很有可能是用的以下两种证书方式:

  • 证书固定(SSL pinning)

    • 概述:一些应用使用了证书固定的技术,即预先内置了服务器的公钥,如果应用检测到与预期不符的证书,可能会拒绝连接。这样的情况下,Charles 无法拦截和解密流量

    • 解决方案:

      1. 捷径:刷机ROOT,借助工具移除APP中固定的公钥证书
      2. 正轨:你拥有这个 APP 的开发权限,那么一般你也就拥有了公钥证书和随之配套的私钥,我们可以把证书和私钥导入到 Charles 中,解决证书固定引起的困扰
  • 证书双向验证

    • 概述:在绝大部分的情况下,TLS 都是客户端认证服务端的真实性的,但是在一些非常注重安全的场景下(例如匿名社交),部分 APP 会开启 TLS 的双向验证,也就是说服务端也要验证客户端的真实性客户端内置了一套公钥证书和私钥,并藏于隐秘之处,后端对其进行比对
    • 解决方案:
      • 别问,问就是不知道,就不告诉你