最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

【整理】Mac中用Charles抓包iOS或Android手机app中包括https的数据

app crifan 4720浏览 0评论
注:已整合进教程:
复杂的https请求 · app抓包利器:Charles (crifan.com)
先说基本的,非https的抓包:
【抓取普通非https的网络请求】
1.Mac中安装破解版的Charles
注:
  • 如果是免费版,则每隔30分钟就强制重启Charles,很郁闷,无法正常使用
  • 具体的破解办法,网上可以找到很多,此处用的是注册码:
    • Registered Name: https://zhile.io
    • License Key: 48891cf209c6d32bf4
    • 详见:【已解决】Charles Error:This unlicensed copy of Charles will only run for 30 minutes. You may restart and use it again

2.Proxy-》Proxy Settings-》HTTP Proxy:
  • Port:5678
    • 默认是8888,可以改为自己想要的任意端口

  • 勾选:Enable transparent HTTP proxying
3.确保电脑和手机是同一个网络,且电脑端是有线网,手机端可以是Wifi无线网
  • 电脑是通过有线网络(LAN口)上网(而不是Wifi无线网络)
    • 比如此处Mac用有线网络(注:MacPro默认没有网口,此处用的是绿联的USB转网口的转接头)
    • 此处Mac中有线网络的IP是:10.108.129.57
    • 注:大坑:如果电脑是连接的无线的Wifi,则手机端设置Charles的代理,则会无法上网
        • 详见:
        • 【已解决】安卓手机设置了Mac中Charles的HTTP代理后无法上网

  • 手机连接的WiFi是和电脑(Mac)同一个网络
    • 此处iPhone6中Wifi的IP是 10.108.132.107
    • 注:很明显,此处有线网络是10.108.129.xxx,而无线网络是10.108.132.xxx,看起来不像,但也是同属于一个局域网的

4.手机端给Wifi设置Charles的HTTP代理
接着去给对应的Wifi网络设置Charles的HTTP代理
iOS和Android手机中设置代理的原理和方式是一样的:
核心逻辑是:设置手动代理,设置服务器的IP(即电脑的IP)和端口(Charles中设置的端口)
具体步骤是:
iOS(iPhone6):
设置-》Wifi-》点击你的Wifi-》HTTP代理-》配置代理:
  • 手动
    • 默认是关闭,此处改为手动

  • 服务器:10.108.129.57
  • 端口:5678
如图:
Android(锤子M1L):
设置-》无线网络 -》 点击你的已连接的Wifi-》高级设置:
  • 代理:手动
  • 代理服务器主机名:10.108.129.57
    • 写的是 主机名,其实当然也可以输入IP地址
  • 代理服务器端口:5678
如图:
5.Charles中点击录制
6.手机中打开和使用你的(要抓包的)app
比如用浏览器打开网页,打开和使用某个你要抓包的app(其内部会访问网络,调用服务器接口,获取数据等)
比如此处打开网易云音乐
7.Charles中,对于使用代理的APP,第一次会弹出确认允许使用代理的对话框:
A connection attempt to Charles has been made from the host 10.108.133.188. You should only allow
access to Charles to trusted users. If you deny this attempt you will not be asked again for this host
address until you restart Charles. Access controls are maintained in the Access Control Settings in the
Proxy menu.
点击Allow,允许即可。
注:
之后你可以在:
Proxy->Access Control Settings中看到你的手机的IP:
8.接着就可以用Charles愉快的抓包和分析http的请求了

从上述的普通http的抓包信息中可以看到:
对于https的请求来说,Charles中抓包显示的是<unknown>:
是无法查看https的原文,明文的信息的。
想要Charles抓包https的话,相关设置要稍微复杂一点:

接下来就来解释,相对复杂的Charles的https的抓包:
【Charles抓包app中https的请求数据】
1.首先要开启Charles中SSL代理
SSL Proxying Settings -> SSL Proxying -> Enable SSL Proxying ->Add 
  • Host: *
  • Port: *
变成:Location: *:*
  • 表示任意的主机名和端口,都用SSL去解码成明文信息
2.在电脑中安装并信任Charles根证书
通过Charles中的帮助,把Charles的根证书安装到当前电脑中
步骤是:
此处是Mac,点击:
Help-》SSL Proxying-》Install Charles Root Certificate
会弹出 (调用Mac的)钥匙串KeyChain Access,去其中设置信任Charles的根证书:
即可看到证书从红色变蓝色➕加号的:
此证书已标记为受此账户信任
2.移动端(iOS或Android端)要去安装对应的证书,并且确保安装成功和添加了信任
下面的步骤就是:
手机端下载并安装Charles的证书
而证书的下载,可以有多种办法
最常用的是:
借助于Charles的提示:
Help-》SSL Proxying-》Install Charles Root Certificate of Mobile Device or Remote Browser-》
Configure your device to use Charles as its HTTP proxy on 10.108.129.57:5678, then browse to 
chls.pro/ssl to download and install the certificate.
-》其实就是让你的手机端去用浏览器去打开:
这个网址,去下载证书文件:
接下来分别介绍Android端和iOS端的操作:
Android端:
下载得到:
charles-proxy-ssl-proxying-certificate.pem
对于一般Android手机,找到设置中的 安全与隐私 中的 从存储设备安装,去安装此证书即可。
注:
此处我的是特殊的Android手机:锤子M1L
具体步骤是:
设置-》解锁与安全-》输入锁屏密码(手势)-》才进入 解锁与安全 -》 高级设置 -》才有:从存储设备安装
然后通过此处手机中QQ浏览器,自带文件移动功能,把证书移动到系统根目录,结果去安装,还是出错。
最后是借助于第三方APPAirDroid,才能找到并点击pem证书,开始安装证书。
Android中安装证书的步骤是:
点击pem证书文件-》弹出要安装证书的界面 -》 输入:
  • 证书名称:比如Charles
  • 凭据用途:VPN和应用
    • 大坑:之前参考很多教程,选择了 WLAN,结果最后证书安装失败,导致无法https抓包
然后会(出现Android的toast)提示安装成功了。
虽然 受信任的凭据-》系统 中还是没有Charles证书:
但是
受信任的凭据-》用户
可以看到了Charles证书:
XK72 Ltd
Charles Proxy CA
之后,即可正常https抓包。
详见:
【已解决】给Android手机锤子M1L中安装Charles的pem证书文件
【已解决】锤子M1L的安卓手机中点击从存储设备安装却报错:从存储设备上找不到证书文件
小坑:
此处要确保证书安装成功才行:
成功安装后,在
受信任的凭据-》系统
受信任的凭据-》用户
中可以找到Charles Proxy CA字样的根证书
注:
我此的Android手机是锤子M1L,Android系统版本是6.0.1,上述操作即可。
如果是Android 7.0之后的手机,可能需要如下操作:
Android 7.0 之后抓包 unknown 和证书无效的解决方案(无需改代码) – CSDN博客
去用:
charles_cer_file openssl x509 -subject_hash_old -in charles-ssl-proxying-certificate_saved.pem
算出数值,比如3a1074b3,然后改名为 3a1074b3.0 后,放到
/system/etc/security/cacerts/
中,估计就可以了。
但是呢,此处锤子M1L手机特殊,无法root,导致无法正常安装证书。
而锤子的其他一些型号的Android手机,其他大部分品牌的Android手机,都是可以root,都是可以用上述版本,解决证书安装的问题的。
此外:
对于Android 7.0之后,Android系统本身的改动,使得无法直接抓包https,办法有3种:
(1)前面所述的,把Charles证书安装到Android中,确保已安装到 受信任的凭据-》系统 中
(2)给自己的app的增加配置,允许https抓包
(2.1)通过app的源码去增加配置
(2.2)借助于第三方工具
对于不是app开发者(而是我们这种用Charles想要去抓包别人的app,想要破解该app的人,那么也有好心人提供了工具,可以把apk处理后,加上允许https抓包
详见:
ssl – How to get charles proxy work with Android 7 nougat? – Stack Overflow
-》
levyitay/AddSecurityExceptionAndroid
的AddSecurityExceptionAndroid
具体步骤是:
下载到你要破解的Android的app的安装文件:xxx.apk
然后去下载源码:
git clone 
https://github.com/levyitay/AddSecurityExceptionAndroid.git
然后去处理:
cd 
AddSecurityExceptionAndroid
./addSecurityExceptions.sh ../xxx.apk
即可得到一个处理后的,允许你https抓包的apk。
安装新apk,然后就可以用Charles抓包了。
iOS端:
小坑:
对于iOS来说,一定要先给手机(比如iPhone)中Wifi设置好了Charles的代理后,用Safari打开后,才会自动识别出要下载证书,否则只是打开了普通网页,无法下载证书
(其实后来也注意到了,人家Charles弹框中提示你了:
要先:Configure your device to use Charles as its HTTP proxy on 10.108.129.57:5678
然后才能去:then browse to chls.pro/ssl to download and install the certificate.)
后续一直点击安装:
直到安装成功,签名者 会显示绿色的 已验证✔️:
说明:
安装好的证书,可以去(iOS 11):
设置-》通用-》描述文件与设备管理-》Charles Proxy CA-》描述文件
中确认是已经信任该证书了:
签名者是绿色的已验证
-》和上面的图是一样的
小坑:
iOS >10.3中,还要去信任根证书:
设置→通用→关于本机→证书信任设置:
勾选:Charles Proxy CA
详见:
【已解决】iPhone中安装Charles证书使得可以抓包https和CONNECT
至此,理论上,Charles就可以正常抓包你的https的请求了
测试/举例:
你手机中用浏览器去打开百度:
https://www.baidu.com
比如Android中用浏览器打开的效果是:
然后PC端Charles即可抓包百度的https的请求了:
而对于此处的某个app的https的请求来说,却会问题:
(1)当没有开启SSL时,是可以抓取https的包,但是看不到解密后的明文,且显示绿色的<unknown>,手机端可以正常上网,正常使用app,加载数据和显示页面
(2)当开了SSL时:
  • 部分https包:可以正常抓取和被解析,可以显示解密后的明文
    • Status Complete
    • Response Code 200
  • 部分https包:无法抓取,显示红色出错的<unknown>
    • Status Failed
    • Failure EOF: EOF reading HTTP headers
    • Notes You may need to configure your browser or application to trust the Charles Root Certificate. See SSL Proxying in the Help menu.
  • 并且无法继续使用app:
对于此问题,经过大量的折腾和尝试,都无果。几乎要放弃,包括:
  • 设置了过滤规则
    •  *.xxx.*:443
    •  *.xxx.*:*
  • 希望可以支持该类的https的url,都还是不行
大坑:
后来是,无意间通过参考:
Charles安装和抓包及报错 – 简书
https://www.jianshu.com/p/498d1d0720e5
而去试了试那个:
右键想要抓包的https请求:
  • 先试了试:Disable SSL Proxying
  • 后续又试了试:Enable  SSL Proxying
试了多次,无意间发现, 想要抓包的https的请求,终于可以正常被解析,看到明文了。
经过研究才(基本)搞懂此处的具体的逻辑:
右键任何一个https请求-》Disable SSL Proxying
-》都会全局的去禁用SSL Proxying
->但是不是取消勾选了Enable SSL Proxying,而是:Location的过滤参数都清空了:
而右键某个https请求-》Enable SSL Proxying
-》则会单独给当前https的请求的过滤参数加到Location中
-》
此处的总体的过程是:
由于之前的,右键任一https的Disable SSL Proxying,清空之前最初的:
*:*
的本意是针对所有https都生效的Location的过滤参数,
而又右键任一https的Enable SSL Proxying,而给特定的https加上了对应Location的过滤参数,比如对于:
https://childapi.xxx.com
childapi.xxx.com:443
结果就是:
想要抓包的https请求,就可以从之前红色的<unknown>,变成被正常解析的明文了:
-》
后来发现也不全是
然后又去试了半天,大概的复现的逻辑是:
  • 在多次开启或关闭 Enable SSL Proxying 的选项,
  • 接着对于你要抓包的https包,右键Disable SSL Proxying和Enable SSL Proxying,
  • 如此多次之后
  • 最后确保:开启了 Enable SSL Proxying,过滤参数对了,最后才可以。
大概过程如下:
Disable SSL Proxying
Enable SSL Proxying
多次,形成:
  • 最早是没有开启Enable SSL Proxying的情况,是绿色(或蓝色)的<unknown>,但是看不到解密的https的明文:
  • 期间是:开启了 Enable SSL Proxying,(但是Location没有过滤参数,或者参数是错误的*:*),现象是红色unknown失败的情况
  • 最终是:开启了 Enable SSL Proxying,但是Location过滤参数是你要的https链接的过滤参数
但是话说回来:
对于为何之前:
*:*
无法匹配到所有的https的请求,使得全部的https的包都能正常解析成明文,具体原因未知,感觉像是Charles的bug?
总之:
经过上述的一番折腾,算是大概率可以复现,能够针对特定的https的包,正常解析出明文了,可以抓取到自己想要的request和response,和对应的数据了。
【后记 20180907】
后来对于特殊的额外加密的ssl pinning的https,最终通过用插件破解倒开了ssl限制,可以抓包明文了:
【已解决】Charles无法抓包部分加了SSL Certificate Pinning的https包
https://www.crifan.com/charles_cannot_crawl_parital_https_request_package_which_using_ssl_cerificate_pinning

转载请注明:在路上 » 【整理】Mac中用Charles抓包iOS或Android手机app中包括https的数据

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
83 queries in 0.199 seconds, using 22.20MB memory