之前做爬虫一直用fiddler抓包,但最近一个项目需要抓取手机app里的https的内容,用fiddler试了一下感觉不大友好,遂尝试使用Charles工具,但这个工具主要用于macOS平台,网上许多关于windows版本的配置教程都不能实际解决问题,几经折腾才找到靠谱的教程解决了自己的问题,所以记录一下.
首先是安装及使用的教程:
https://www.axihe.com/charles/charles/windows-install.html
这个网站有非常详细的关于Charles的安装使用的教程,但是关于配置抓取手机app内容的部分不是很直观详细,于是我又找到了另一个详细的教程.
以下为详细步骤:
1.下载charles(下载链接)
有条件的朋友尽量支持正版,要**的则可以参照:Charles**
下载后安装,安装完成后打开,出现如下界面;
2、开始对 PC 端 的charles进行配置,点击proxy(代理),找到代理设置:
对代理端口进行进行配置,端口号默认8888,你可以自己修改,选中 enable transparent http prxying,代表启用http代理;
点击OK,完后配置。
如果你只想对pc端的数据交互进行抓取,那么到这一步就行了
3、对移动端,手机app上面的数据进行抓取。
注意事项:手机与pc是否处于同一网络。
3.1、开始配置移
打开手机的WIFI功能区,进入链接WIFI设置界面,点击高级设置,进入以下界面,or 点击代理设置,进入代理设置界面。
代理服务器主机名称 填写你PC的IP地址,如果你不知道你PC的ip地址,可以在charles上查看到
本地IP地址,点击local IP Address 后直接就能看到你的PC网络的IP地址。
端口填写你在charles上设置的端口,如果你没有修改端口,依然是8888,那么直接填入8888;
点击完成or保存,charles会给你一个提示框,是否允许链接手机网络请求;
如下:
点击允许,ALLOW.
如果把你点击了否认 Deny,那么你关闭charles,再重新走一遍吧(哈哈哈哈O(∩_∩)O哈哈哈~);
Warning:如果没有弹出提示框,那么请检查charles是否处于防火墙信任软件序列里,这个你可以在防火墙设置连看到.
将应用添加进入允许序列里,在不关闭防火墙的情况下,可以抓到数据,如果依然没有,那么久关闭防火墙,再试一次;
现在,charles就可以抓取手机上的数据了,包括网页、APP、及其他网络请求;甚至某些App网络安全做得不好,你都可以将你的账户和密码在charles*问到。
Warning:这只能对http协议的数据进行抓取.
4、对https的解析,之前我们抓取http协议数据的时候,会发现一个问题,就是只要是https协议,那么全部是上锁了,并不能查看到数据。
现在,我们来对https解锁,因为https对证书加深了认证,所以我们要解锁,就必须安装charles的变色龙证书,依靠它,我们可以抓取到很多https裹挟的数据。
4.1、下载证书;点击charles上的help,
安装PC端的证书,首先点击install charles root certificate ,会对你进行提示安装证书,点击确定安装
--------
一定要加入 “ 受信任的根证书颁发机构”,不然后续https解析不了;点击确定,完成PC的安装;
因为要抓取手机上的https网络请求数据,手机上也必须安装证书;
首先点击 :
会出现获取手机端认证证书网址
IOS手机(以iOS12.3.1为例):
1.在 Safari 中访问 chls.pro/ssl 就直接会下载该证书,但是自iOS10 以后的版本,下载的证书是默认不信任的,没法使用,所以下载后,还需要配置
2.进入设置==>通用==>描述文件与设备管理==>安装(需要输入锁屏密码)
3.进入设置 ==>通用 ==>关于本机 ==> 证书信任设置 ==>启用Charles Proxy CA 证书
4.在电脑上点击允许,至此,即可抓包iOS平台的https链接了
参考资料:
https://blog.****.net/qq_40407699/article/details/80453803
Android手机:
进入该网址,会提示你下载证书,下载完成后自动安装,名称随你自己定;这里需要注意一下,很多手机必须要使用自带的浏览器才能成功安装该证书,至少华为和小米的是这样.
如果不行,可以参考这篇文章:
https://blog.****.net/qq_28831197/article/details/81196571
完成安装后
因为是https,我们还需要在charles上添加ssl proxy服务
完成 ssl proxy 设置,五部曲;
Host:填写你要抓取API网址
如:
prot:一般填了host就填写443,手机上不用修改。点击添加,就会对单独的host进行数据解析;
如果host和port设置为*,则会解析抓取到的所有https请求;
配置后:
至此:关于charles的抓包和用于app代理的教程写完了;
waning:如果你在数据抓取活动完成后,关闭了charles,不再进行数据测试,打开浏览器,发现不能连接到网络,
那么,首先你检查你是否处于联网状态,
处于:进入网络设置:
关闭你的代理:
因为存在一种可能,就是你的charles已经关闭,但是你的代理行为没有关闭,那么就会造成链接不到远程主机,也就是charles的端口;
安卓7.0以上的手机将Charles的证书默认设置为不信任,所以会导致部分app的数据抓取不到
解决方法:
1.我是开发者,我要抓自己app的包
官网解决方案:
https://www.charlesproxy.com/documentation/using-charles/ssl-certificates/
实际就是修改项目里的配置文件,使其默认信任,可以参考以下文章:
https://blog.****.net/xiexiangyu92/article/details/78458676
但上面的方法,对项目的开发者来说可用,对搞爬虫的来说,基本用不了,除非懂得Android开发,还会反编译啥的,总之,很麻烦
2.研究别人的app
一. 反编译
反编译后用官方的方法绕过,至于反编译的难度,这个不好说,有的app反**做得好,会很难。方法还是说一下,使用apktool反编译应用程序,完成该过程后,在resources目录中建好网络安全配置文件,设置成信任用户证书。完成后,使用apktool重新编译应用程序,并使用Java JDK提供的jarsigner工具对生成的APK文件进行签名。
二. 运行时hook
利用动态二进制插桩技术,在程序运行时动态插入额外代码,改变安卓的网络安全配置行为。类似的hook软件比如frida,在参考资料中有其使用方法, 可以自行查阅
三. 把charles证书装成系统证书
该方法要先root手机,然后直接把证书添加为根证书
这大概是最一劳永逸的方法了,你不是只信任系统证书,不信任用户证书吗?那我就把charles证书装成系统证书,就这么简单粗暴!然而虽然简单粗暴,但方法依然很复杂,你是不是以为root完,把证书往系统证书目录一拷贝就行了?行是行,但是不妥,因为系统证书在system目录,这表示你得将system目录设为可写的,但这个方法实在太粗暴了,以至于安卓的反root算法很容易就检测出来,然后你的手机从此以后就各种幺蛾子了,什么app启动不了啊七七八八的事。
这里还有一种不需要root的方法:
解锁手机 Bootloader
刷入第三方 Recovery(例如 TWRP)
下载官方 Magisk 包,然后通过第三方 Recovery 刷入
下载AlwaysTrustUserCerts.zip (这是一个Magisk模块)
通过Magisk安装上面这个模块
正常途径安装好charles证书(这时候安装,charles证书还在用户证书下)
重启
你会发现charles证书已经自动变成了系统证书
可以看到,抓Android7.0以上手机的https包是比较复杂的,最简便的方法还是使用iphone
以上就是所有配置Charles抓包的相关内容,希望能够对大家有所帮助
即使按照以上方法配置了证书信息,有些app还是不能抓包,这是因为部分app使用了SSL Pinning技术,这种情况的解决方式在我的另一篇博客里记录:
手机app抓包https请求信息,解决SSL Pinning验证
参考资料:
https://www.jianshu.com/p/393f5e51716e
https://github.com/NVISO-BE/MagiskTrustUserCerts
http://www.oneplusbbs.com/thread-4077732-1-1.html
http://www.oneplusbbs.com/thread-3903166-1-1.html
https://www.imooc.com/article/49265
https://www.jianshu.com/p/310d930dd62f
其他抓包工具:
Wireshark,fiddler