今日授课安排
- 上午课前练习+上周postman知识回顾
- 上午学习charles的安装和使用
- 下午练习charles工具 mock的使用,抓取并改写Web请求和App请求
charles的安装和使用
charles 工具安装使用教程
安装
在上述网页中,点击DOWNLOAD
->然后选择对应的系统(win,mac,linux
)进行下载即可。
下载后安装程序后,不停点击next,该accept
的accept
,没有什么坑,注意更改一下安装路径即可。
激活(此处不方便公开展示)
劳烦各位自己努努力,找到激活法子。然后打开安装好的Charles,点击HELP->Registered to bobo->将激活密钥输入即可
配置charles(代理所需)
- 安装证书且信任
HELP->SSL Proxying->Install Charles Root Certificate
- 点击后会自动下载证书文件,找到证书文件,双击进行安装,并且在安装过程中,注意将证书存储在
所有的证书都放入下列存储->选择受信任的根证书颁发机构
然后就完全导入了。 - 验证:重新打开Charles,然后
Help->SSL Proxying->Install Charles Root Certificate
查看证书结果,成功则在证书状态中显示:该证书没有问题 - 配置SSL,保证可以抓取
https
协议请求 -
Proxy->SSL Proxying Settings
选中后会出现一个框 - 选择
SSL Proxying
,勾选Enable SSL Proxying
,在Include
部分下方选中Add
添加*:*
即点击add后会出现一个框,填写HOST:*
然后PORT:*
,然后就点击OK
,出现的效果就是*:*
- 配置代理端口:
Proxy->Proxy Settings->选择Proxies
里面内容填写:Port:8889
,可以勾选下面的Support HTTP/2和eNable transparent HTTP proxying
- 自此,
Win
端的charles
的配置都没问题了,应该是可以正常抓取https
请求了
配置charles(mac系统)
- 安装证书:
Proxy->macOS Proxy
,然后后续操作和win
类似,需要注意一下证书的安装和导入
Charles的使用
各功能按钮的介绍
工具栏:
- 类似扫把:清空请求
- 第二个:类似一个开关:record:开始抓包
- 第三个:类似一个锁:开始或停止SSL代理
- 第四个:类似一朵黑云:模拟弱网环境
- 第五个:类似一个多边形:debug,允许打断点的开关
- 第六个:类似一支笔:修改请求
- 第七个:类似一个刷新图标:重新请求
- 第八个:一个:看名称像是检验响应response
- 第九个:工具:tool
- 第十个:类似齿轮:setting
Charles 下设置SSL代理
位置: Proxy->Proxy Settings
作用: 设置监听的端口,端口号可随意设置,尽量选择无冲突端口
位置: Proxy->SSL Proxying Settings
作用: 启用SSL代理,添加监听规则,其中[.]代表监听所有IP地址的所有端口
位置: Help->SSL Proxying->install Charles Root Certificate
作用: 本地charles下载证书,这里注意导入的时候选择受信任的证书机构
位置: Help->SSL Proxying->install Charles Root Certificate on a Mobile Device or Remote Browser
作用: 配置手机的charles证书,首先将手机的网络设置,添加手工代理,IP和端口号分别指向下图箭头。
web页面请求抓取
百度首页:https://www.baidu.com
状况
-
点击工具栏第二个按钮和第三个按钮(开启抓包,开启代理,前者获取请求,后者进行中间人攻击)
-
没有出现乱码(CA证书无误)
-
Filter
里输入baidu.com
用以筛选请求
Overview
层:
- 展示请求的服务器地址:
host
:https://www.baidu.com
- 路由路径:
path
:/
- Notes:
SSL Proxying enabled for this host
笔记 - 协议:
Protocols
:HTTP/1.1
-
Requests
:请求数量:4 下面是请求状态数量:Completed:4 ,Incomplete:0 - Timing:时间 :Start:
2024-9-11 14:34:26
,End:2024-09-11 14:34:28
,Duration:408ms
- Size:请求大小:
Requests:7.52KB
总结
总览请求的一些基本信息,有用的信息不多,比如host,path。
Summary层
- 可以看到往这个地址访问时,触发了4个请求
- 有路由
/
,有请求资源的,也有请求文档的。 - 他们的mime Type分别是
text/html text/plain image/gif application/xml
总结: 简述这个地址请求时触发的行动
Chart层
-
下方出现筛选框:
Timeline,Sizes,Duration,Type,Flow
-
Timeline
:展示这个地址访问时触发的各个动作,并且展示动作的发生先后,时间占比 -
Sizes:
展示大小占比 -
Duration
:持续时间 -
Types
:展示的也是大小,只是不展示名称,而是以类型区分 -
Flow
:一个奇怪的柱状图,展示各个请求,响应的耗时
选择Sequence板块
- 筛选
Filter:baidu.com
- 勾选一个code200,host为
www.baidu.com path为/
的请求 - 下面出现两重视图框:
- 上层:
overview
- 可抓到
url,status,response code 状态码,协议protocol,请求方式method
- 可抓到:
媒体类型:
Content-Type:text/html;chaset=utf-8`` - Contents
- Host
- Connection
- Cache-Control
- sec-ch-ua-platform:
Windows
- User-Agent:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0
- Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
- Cookie:
xxxxx
- 上述是请求的
Headers
数据,还能看请求的cookies模块,Raw模块 - 然后下面视图是响应体的视图,针对响应体也划分了几个模块:
Headers,Set Cookie ,Text,Hex,Compressed,HTML,Raw
抓包京东商城,并且进行替换
- 打开京东商城:百度搜索京东
- 进入京东首页后,在搜索框中搜索
电竞椅
- 进入搜索页面后,在charles中过滤:search,找到对应的请求
- 右键复制url
- 点击
tool->Rewrite
- 勾选
Enable Rewrite
- 点击下方的
Add
- 填写Name,
location 点击add
- 将刚刚复制到的url粘贴在Host里,然后点击一下空白处,就会将信息填写到其他地方。
- 注意这里的匹配规则估计不是全匹配,即有些url后缀是带有一些随机字符的查询参数,比如vd_source=123919n9a98e9128j9nziua,这种就不方便匹配,所以手动删除这部分的查询参数
- 查询参数中有中文,在框里会自动转为Unicode编码,这个无所谓的。
- 然后填写好location的匹配规则后,点击ok,下面的改写规则视图中,点击
Add
- 选择
Type
改写的范围:Body,Host,Path,URL,Add Query Param ,Modify Query Param,Response Status - 选择where:来源范围:请求,响应都勾上吧
- Match:规则匹配区域:
Regex
是正则开关,勾上则可以写正则表达式,一般也用不上正则,因为这个匹配虽然是全匹配,但好像是局部全匹配,即规则为 你好 ->我好 那么内容里的 你好丫丫 就会变为 我好丫丫 - 然后一般来说如果配置了替换规则,但是不生效,肯定是location没有匹配到,就要研究一下了。
- 如果设置好规则后,刷新页面,页面没有变化,但是抓取的请求中的内容却变了,那么表示你抓取的这个请求并非影响页面内容的关键请求,可能是中间件请求。
maplocal用法
-
百度搜索京东商城
-
搜索框输入电竞椅
-
然后charles过滤 jd.com
-
找到和search有关的请求
-
确定影响页面的请求:一般而言,如果返回的是html,一般都是影响页面的请求。
-
当然也有些请求是返回json数据,也可以试试。
-
具体操作,确定好请求后右键,save response 然后存储,注意添加后缀
-
然后编辑这个文件,比如将ctrl+h 将所有电竞 ->静电
-
然后再次右键这个请求,选择maplocal->其他信息会自动填好,选择下方的替换文件
-
注意这里的自动填充的url定位是完整的,所以要看看查询参数有没有时间参数之类的,要手动砍掉
-
然后确定,刷新页面
-
先看看页面有没有变化成功
-
如果没有,则先清空charles请求,然后再刷新页面,找一下那个请求,看看charles抓到的请求是否有变更,如果有变更,证明修改成功了,但是修改的请求是中间请求,并没有影响到页面,再继续找就行。就拿这个搜索为例,总共出现了三个jd.com/search=xxxx 有两个返回的json,有一个返回的是html,肯定是这三影响了页面,究竟是哪个,慢慢尝试就好。
抓取app-mumu模拟器请求
因为现在Android系统都是7+,而Android6以后,对于CA证书的录入,变得非常严格。所以我们要想抓包到Android12系统的数据,就必须搞定这个证书导入
参考帖子:[MuMu模拟器12如何安装证书?_MuMu模拟器_安卓模拟器 (163.com)](MuMu模拟器12如何安装证书?_MuMu模拟器_安卓模拟器 之后默认不信任用户添加到系统的CA证书),遇到这类问题的用户可参考以下方法步骤进行操作导入证书。 第一步,用Charles(点击下载Charles>>)导出证书,命名为 charles.pem 第二步,安装open,ssl (点击下载>>),安装默认安装, 最后的捐款取消勾选。 之后配置环境变量,将openssl安装路径bin的路径 (例如 C%3AOpenSSL-Win64bin)加入到操作系统的系统环境变量Path中)
这是官方的帖子
第一步:抓取到模拟器的请求
因为模拟器实际上可以当成手机,所以即使是使用真机,也参考一下这个操作
- 打开模拟器mumu12
- 点击模拟器内的手机设置-
setting
(注意不是模拟器外围边框的模拟器设置) - 找到网络->
wifi
设置(这里一般来说的场景是,点进来后,连着一个wifi
,然后点击这个正在使用的WiFi
,长按,或者看看有没有齿轮图标:设置,目的是找到修改WiFi信息的地方,选择代理->手动代理->然后输入本地的IP(win+r->cmd->ipconfig->然后找到当前网络配置的ipv4信息:一般如果是WiFi连接就找无线局域网适配器WLAN
),端口填写你charles中Proxy->Proxy Setting 中的端口信息) - 当填好代理时,你的Charles会弹出有未知设备连接的提醒,选allow,让模拟器连接,不然到时会很麻烦:拒绝后再想连接就要手动指定设备来连接。(代理设置后,可能要等一会,你的
charles
就会弹出一个弹窗,一定要选allow
) - 这时,设置网络,就让你的charles可以拦截到模拟器的请求,但是这时你打开模拟器的任一应用,能看到charles抓到的请求虽然状态码是200,但是图标却是爆红,报错的样子,这是因为没有在模拟器或者说手机端配置charles的CA证书,导致模拟器或手机端不信任,无法解密请求。
- 注意这个修改代理网络的IP,如果发现抓不到请求了,就查一下本地电脑的IP有没有发生变化,发生变化了就改一下模拟器上的代理IP地址
模拟器配置证书
我们上一步已经成功抓取到请求了,因为网络?但是还是无法解密请求,根据charles的工作原理,应该是中间人攻击失败了,那我们就将charles的CA证书添加到模拟器上(android7.0后无法正常安装导入证书,因为Android7.0后默认不信任用户添加到系统的CA证书),对于使用低版本安卓系统的模拟器比如mumu6而言,下载证书就不用那么复杂:https://www.charlesproxy.com/assets/legacy-ssl/charles.crt
打开模拟器/手机里的浏览器:输入上述网址,回车,应该会弹出证书下载提示框,然后正常下载,然后在 设置->通用->VPN与设备管理,点击Charles证书,安装即可。然后低版本的模拟器的请求就能被Charles正常抓取了
-
从charles中下载CA证书:
打开charles->Help->SSL Proxying->Save Charles Root Certificate
然后会弹出一个下载路径,随便选一个地方就行,然后注意默认不会给这个文件命名,所以需要手动命名:charles.pem
-
下载工具open ssl 用于签发证书: openssl下载,进入下载地址,选择对应的系统,
win,linux,mac
,该工具的安装没有啥坑,注意更改一下安装地址就好,走到最后一步会让你勾选捐款选项,全部不勾选,然后点击确定,就能完成安装,此外需要将该工具的bin目录添加到path环境变量里,即将xxx/bin 这个层级丢到path中 -
使用openSSL 签发证书: 打开终端:
win+r->cmd->输入 openssl x509 -subject_hash_old -in <Certificate_File> 其中<Certificate_File>是你之前保存charles证书的绝对路径:D://xxx/charles.pem
-
**可能出现的阻塞报错:Can’t open config file: /etc/ssl/openssl.cnf **执行以下命令:
-
set OPENSSL_CONF=c:\[PATH TO YOUR OPENSSL DIRECTORY]\bin\openssl.cfg
-
至此上一步操作结束,无论是正常执行成功,还是出现报错后,执行解决方案后成功,都应该显示出一个结果:首先是生成一串字符串,然后下面是 xxxstart 一堆数据 xxxxend 之类的。复制这个字符串(比如:012x2asd8a) ,将本地刚刚下载的
charles.pem
,改名为生成的字符串,然后后缀改为.0
(数字0) 即(012x2asd8a.0
) -
然后到最关键的一步,将证书导入:使用前端根证书导入的方法导入:
-
首先打开mumu12模拟器:点击外围边框的模拟器设置:->其他->找到Root权限开启(一般模拟器都是默认开启的)
-
继续在设置中找到磁盘->从只读改为可写
-
保存完毕后,应该会让你重启模拟器
-
重新打开一个终端:
win+r->cmd
,终端输入: -
adb connect 127.0.0.1:16384 adb shell adb root mount -o remount,rw /system exit adb push <Certificate_File> /etc/security/cacerts/ 这时,这里的<Certificate_File>绝对路径的文件名改为前面改名后的名字即 D://xxx/012x2asd.0
-
可能遇到的问题
- 官方教程里是没有
adb root
这步的,会在执行mount -0 xxx
操作时报错:Permission Denied
:解决:adb shell 然后输入 adb root 开启管理员模式
- 在执行后面的
adb push
时,报错系统read only
,没有将mumu12模拟器的磁盘可写权限打开。
- 官方教程里是没有
-
验证证书:
win_r->cmd->adb shell ->cd /etc/security/cacerts/ -> ls ->就能看到列表中找到自己刚刚生成的字符串xxxx.0 在其中
。便说明添加成功。 -
检验charles解密App数据: 这时清空charles旧请求,模拟器上点击雪球App,可以看到charles上已经能正常显示雪球App的请求,并且内容无误。
-
adb push E:\charles-certificate-root\charles.pem /etc/security/cacerts
E:\charles-certificate-root\charles.pem: 1 file pushed, 0 skipped. 1.9 MB/s (1912 bytes in 0.001s)
adb: error: failed to copy 'E:\charles-certificate-root\charles.pem' to '/etc/security/cacerts/charles.pem': remote couldn't create file: Permission denied
解决:
这个错误提示表明您尝试将 `charles.pem` 文件推送到Android设备的 `/etc/security/cacerts` 目录时出现了权限被拒绝的问题。这是因为很多Android设备的 `/etc/security/cacerts` 目录属于系统级目录,需要系统权限才能写入文件。
为了解决这个问题,您可以尝试以下几种方法:
1. **使用 adb root 权限**:在 adb 命令前加上 `su` 或者 `adb root`,以获取Root权限。例如:`adb root`,然后再进行文件传输操作。
2. **使用 adb remount 命令**:使用 `adb remount` 命令先将设备的 `/etc` 分区设置为可写,然后再进行文件传输操作。例如:`adb remount`
3. **通过其他路径传输文件**:尝试将文件保存到其他可写入的路径,例如 `/sdcard` 目录,然后再将文件移动到所需位置。例如:`adb push E:\charles-certificate-root\charles.pem /sdcard/charles.pem`
4. **使用 Android Debug Bridge (ADB) Shell**:通过 adb shell 命令连接到设备的 shell 终端,然后使用 root 权限手动复制文件到目标目录。例如:
adb shell
su
cp /sdcard/charles.pem /etc/security/cacerts/
请注意,在执行这些操作时,确保您对设备具有足够的权限,并且操作文件谨慎,以免对系统造成不必要的影响。
adb root
charles抓取模拟器App请求,并且使用Rewrite修改
- filter是用来筛选url之类的
- 点击空白处,ctrl+F 是用来搜索内容里的text的
- 正则表达式的使用:可以用于url匹配时的正则表达式,也可以是内容替换时的正则表达式
- 举例:内容中存在
"timeBefore":"41分钟前"
要想替换掉后面“”
中的时间,就需要使用正则表达式:"timeBefore":"([^"]+)"
- 解析正则:
[]
在正则表达式中代表字符类,表示匹配方括号中列举的任意一个字符,方括号中使用^
表示取反,即匹配除了方括号中指定字符外的任意字符,^'
这个表示不取'
,+号表示前面匹配至少1个活多个前面指定的字符或范围 - 并非所有数据都能修改,即使请求里修改了,但是页面上还是修改不了。不清楚这方面的数据是如何进行的,比如雪球App首页有xx已收盘的信息,然后下面的框框是实时显示上证指数,深证指数,创业版指的数值,我直接全局搜索上证字样,只抓到十余个json请求,这些都是随着实时更新而逐渐累积的请求。我抓取其中一个url去除特殊部分,替换其中的字样,发现页面上没有变化,但是charles抓取的请求已经发生了变化,然后还是在这个请求中,我替换已收盘为已盘收,倒是替换成功,貌似有些数据可以替换,有些数据替换了也不生效,而有些数据替换了会报错。。
- 实际上,charles能抓到的内容是服务器和客户端的交互,是否存在一些数据是charles抓不到的?