charles乱码_基于iOS的Charles抓包实践

奇技指南

在应用开发过程中,通过抓包调试服务端接口的场景时常出现。Charles和Wireshark是开发过程中最常用的两款软件。那么今天,让我们以iOS为例,聊一聊Charles抓包。

本文来自360奇舞团QiShare团队投稿。


在日常开发中,我们无法看到应用程序与服务器之间发送和接收的内容,没有这种可见性,我们在确定故障的确切位置时会非常困难且耗时。而Charles是一个运行在PC上的Web代理,我们将应用程序配置为通过Charles访问网络,便可以在Charles上记录并显示发送和接收的所有数据,进而可以大大提高调试程序的效率。

从下图可以看出Charles的角色:

05006a5eb9f61366449167405a3ff7dd.png

Charles有以下几个常用功能:

  • 请求预览:通过分组或序列视图预览和过滤请求数据;

  • 请求抓包:抓取HTTP和HTTPS的请求数据和响应数据;

  • 请求断点:拦截指定的请求或响应,预览中间的数据;

  • 数据修改:修改请求数据和响应数据以配合数据测试;

  • 请求重发:指定请求重复发送,以测试后端功能和性能;

  • 网速模拟:设置网速延迟,模拟手机上2G/3G/4G网络;

由于Charles的功能很多,很难在文章中详尽介绍,所以作者以在项目中对Charles的使用为切入点,对最常用、最有用的几个功能进行介绍。

   一、安装Charles

Charles是收费软件,有30天的免费试用期限,

之后每使用30分钟会被强退一次,重启后可继续使用。

从Charles官网可以获取Charles安装包。

二、请求预览

Charles启动后,就运行在抓包模式。由于Charles会自动配置PC浏览器的代理,所以,随意打开一个网页(只要有网络请求即可)即可预览到请求信息。

PS:如果使用插件为浏览器设置了独立代理,请关闭插件或者设置成系统代理。

Charles提供了Structure和Sequence两种预览模式。Structure以域名对请求进行分组,可以很方便地预览同一域名下的请求数据,也方便于日常开发中对某一服务接口的分析和处理。图示如下:

34cafd8245f6cdd0ad625e145caf57fe.png

Sequence以时间顺序显示请求信息,可以最直接的预览请求信息。在此模式下,可以使用Filter过滤请求,针对性分析。图示如下:

4e73440250f4024d681f4b25031dc3a7.png

在两种模式下,都可以通过切换标签(Overview、Request、Response等)预览不同类型的请求信息。在最常用的Request和Response标签下,还可以通过切换子标签(Headers、Cookies、Text等)预览对应标签详细内容。图示如下:

4a985d796840897f0011f3cd8b5f8205.png

三、请求抓包

使用工具栏的白圆红点按钮(快捷键是“Command+R”)可以使Charles在抓包(Start Recording)和不抓包(Stop Recording)之间切换。使用此按钮,在需要调试时再打开抓包功能可以有效减少干扰信息,而快速抓取到需要调试的请求。

对从手机(以iPhone示例)发出的请求进行抓包,需要保证iPhone和PC工作在同一局域网内。

第1步

获取PC的IP地址

在Charles菜单栏 -> Help -> Local IP Address中可以查看PC的IP地址。图示如下:

ab4b176534c27468e9f106bd5e4d973c.png

也可以在Mac终端使用命令ifconfig en1查看PC的IP地址。图示如下:

b8d4950fbbb3161c2bade70e0937ebe3.png

第2步

配置iPhone代理

在iPhone的 设置 -> 无线局域网 -> 局域网信息(i) -> 配置代理 -> 手动中配置代理,服务器输入框中填写PC的IP地址,端口输入框中填写Charles的代理端口(一般是8888)。图示如下:

0b38c000c49a5b54f22631abbb254d78.png

具体的端口可以从Charles菜单栏 -> Proxy -> Proxy Settings中查看。图示如下:

b6568db9bcdf1e84eb8fcf2af8fc2272.png

iPhone代理配置完成后,Charles会弹出连接提示框,点击Allow之后即可使用Charles对从该iPhone发出的请求进行抓包了。图示如下:

bb6192299d344d78b262bac4721d4558.png

第3步

 抓包HTTPS请求

在配置iPhone代理完毕后,就可以通过Structure或者Sequence窗口预览HTTP请求的数据了。但由于HTTPS请求被加密过,预览请求时只能预览到乱码数据。要预览到HTTPS请求的数据明文,需要PC和iPhone安装证书授权。

1)PC安装证书

在Charles菜单栏 -> Help -> SSL Proxying -> Install Charles Root Certificate中可以为PC安装证书,证书可以在Mac的钥匙串中查看。图示如下:

9d91c0cfc66e514d68cb06d398dd0139.png

证书可以在Mac的钥匙串中查看,双击证书,将信任权限设定为始终信任。图示如下:

cacf50c728e8f27996e31ebd07954ef8.png

2)iPhone安装证书

在iPhone浏览器中访问 http://charlesproxy.com/getssl 可以下载证书并安装。此地址一般不会变化,可以在Charles 菜单栏 -> Help -> SSL Proxying -> Install Charles Root Certificate on a Mobile Device or Remote Browser中查看最新的官方证书下载地址。图示如下:

e1ede98618e1158a52a42afe5abfbbb0.png

基于iOS的证书信任机制,在安装完成并信任证书后,需要到iPhone设置 -> 关于本机 -> 证书信任设置 中启用根证书。图示如下:

752e93daba185b3394c7a0bf8dfd7b9c.png

这样,就可以使用Charles中抓包iPhone发出的HTTPS请求并预览明文数据了。

抓包模拟器上的HTTPS请求需要点击Install Charles Root Certificate in iOS Simulators安装证书。

3)启动抓包SSL权限

在Charles菜单栏 -> Proxy -> SSL Proxying Settings中勾选Enable SSL Proxying,然后在Locations中添加需要抓包的Host和Port即可。图示如下:

3e6db5035be6650633c06073bd14bcb2.png

也可以在抓包界面,右键点击某条/组请求,在弹出的选项列表中点击Enable SSL Proxying启用权限。图示如下:

3822e87243a5865d59831c935457ba33.png

四、请求断点

在Charles的请求预览界面中,右键点击某条/组请求,在弹出的选项列表中有Breakpoints选项。图示如下:

29d9e0eeaac467ca235b148786d92d02.png

点击Breakpoints后即为该请求设定了断点。默认情况下,在该请求的Request / Response过程都会受断点控制,即在Request数据发送到的服务端之前会被暂停,在Response数据发送到客户端之前也会被暂停。可以从Charles菜单栏 -> Proxy -> Breakpoint Settings中编辑断点的参数。比如,只需要对Response过程加断点,可以将Request的勾选状态取消。图示如下:

0183f8eb5681b386edfff431db1cd074.png

在断点状态下,可以预览和修改请求的中间数据,之后点解Execute按钮即可继续执行请求。

五、数据修改

Rewrite和Breakpoint Editing都可以起到修改请求数据的作用。

1)Rewrite

在Charles菜单栏 -> Tools -> Rewrite中可以开启Rewrite功能,点击Add按钮可以添加一条设置,并可以在右侧的Locations和Rules中分别添加要Rewrite的请求路径和Rewrite规则。图示如下:

9ca1458b580e649f693a791c12101201.png

Rewrite适合应用于对请求的批量和长期修改,对请求数据影响较大(测试结束后经常忘记去掉规则)。所以,在一些轻量级的数据修改场景中,我经常结合Breakpoint功能修改数据。

2)Breakpoint Editing

结合断点功能,可以很好的实现临时修改请求的Request / Response数据的需求。为某条请求设置断点后,当该请求发生时,会自动跳到断点窗口。点开Edit Request / Response界面,可以看到中间信息,选择合适的数据格式(HTML、Json等)进行修改。修改完成后,点击Execute按钮即可在终端上看到修改后的的效果。图示如下:

2e091b7426fbcbfab2633cee4583aa34.png

aaf23bdfdb4c6cf277c49798c5d239be.png

六、请求重发

在Charles的请求预览界面中,右键点击某条/组请求,在弹出的选项列表中有Repeat和Advanced Repeat两个选项。图示如下:

77cf558db26e236a45168114f4a391fa.png

单击Repeat会重发该请求一次,常用于测试服务接口能否正常访问,客户端能否正常收到返回数据等。单击Advanced Repeat会弹出重发参数编辑页面,图示如下:

c0d7ed80f309ea5ff555d81ee9bf1bac.png

在此编辑界面上,可以自定义Iterations(重发次数)、 Concurrency(并发数)和 Repeat(重发延时),常用于对服务接口进行压力测试。

七、网速模拟

在Charles菜单栏 -> Proxy -> Throttle Settings中可以启用Throttling(节流)功能,并自定义Locations(受限服务接口)和Throttle Configuration(节流配置)。支持对Throttle preset(预置的数据传输方式)、Bandwidth(带宽) Utilisation(利用比率)、 Round-trip latency(往返延迟)、MTU(最大传输单元) Reliability(可靠性) Stability(稳定性)等参数进行编辑。其中,在Throttle preset支持模拟3G/4G网络环境。图示如下:

78c41795d23d56233cb6993ca749ae7c.png

使用Throttle功能,可以方便地排插因为若网而导致的bug,而这类bug在线上很容易出现,而且很难排查复现。

界世的你当不

只作你的肩膀

13f78f42886d49ee23d03c978b2c9ffa.png7a3377d9cfb6db069ef2c1b81c8af16d.png

 360官方技术公众号 

技术干货|一手资讯|精彩活动

空·

更多iOS及周边技术文章可点击阅读原文

关注QiShare

c36e0452a0bb796d8816eaf7cee1ddd7.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271315.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

那些程序员爆笑段子,扎心了…

1、特殊“2020是属于程序员的一年。”“怎么说?”“2020-1024996。”2、真相“你们程序员是不是没见过下班时候的太阳?”“也不是啦,夏天的时候还是能看到的。”“哦哦,夏天黑得比较晚。”“不是,是天亮得比较早。”3、…

lambda中sorted排序

准备工作&#xff0c;新建一个User类 使用stream排序操作&#xff08;默认ASC排序) stream倒序排序操作 sorted(Comparator.reverseOrder()) 代码例子&#xff1a; /*** lambda* sorted排序*/Testpublic void test19() {List<Integer> list new ArrayList<>();…

python中的括号不是西文吗_二级Python---python语言的基本语法元素(Day1)

一、基本输入输出函数Python中有三个重要的基本输入、输出函数&#xff0c;用于输入、转换和输出&#xff0c;分别是input()、eval()、print()。1.print()作用&#xff1a;输出运算结果&#xff1b;根据输出内容的不同&#xff0c;有三种用法。①、仅用于输出字符串&#xff0c…

chart.js 饼图显示百分比_实战PyQt5: 135-数据可视化之QChart绘制饼图

饼图是数据可视图表的基本类型&#xff0c;在QChart中&#xff0c;QPieSeries, QPieSlice处理饼图的绘制。QPieSeriesQPieSeries类以饼图形式显示数据。饼图系列由定义为QPieSlice对象的切片组成。切片可以具有任何值&#xff0c;因为QPieSeries对象计算切片的百分比与系列中所…

lambda中使用filter过滤

单一条件过滤 /*** 测试filter*/Testpublic void testFilter() {List<User> user new ArrayList<>();user.add(new User(1L, 18, "小明"));user.add(new User(2L, 20, "小王"));user.add(new User(3L, 28, "小刚"));user.add(new U…

Silverlight 打印

摘自&#xff1a;http://www.cnblogs.com/jiajiayuan/archive/2012/04/13/2444246.html Silverlight中的打印只有一个类&#xff0c;那就是PrintDocment这个对象来实现。下面我用两种方法来实现Silverlight的打印&#xff1a;第一种&#xff1a; private void btnPrint_Click(o…

数据库系统的体系结构知识笔记

1、集中式数据库系统分时系统环境下的集中式数据库系统结构诞生于20世纪60年代中期。当时的硬件和操作系统决定了分时系统环境下的集中式数据库系统构成早期的数据库技术的首选结构。数据和数据管理都是集中的&#xff0c;数据库系统的所有系统&#xff0c;从形式的用户到DBMS核…

mysql2014授权设置_mysql权限管理(2014-09-15)

本文比较碎片化&#xff0c;不过以问答的形式比较容易理解。如何查看mysql的当前登录的用户&#xff1f;select user();mysql -hlocalhost -uroot 与root192.168.11.100 区别&#xff1f;mysql -hlocalhost -uroot只能在本地进行登录&#xff0c;而root192.168.11.100不能在本…

python网站后台_Python 网站后台扫描脚本

Python 网站后台扫描脚本1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #!/usr/bin/python #codingutf-8 import sys import urllib import time url "http://123.207.123.228/" txt open(r"C:\Users\ww\Desk…

数据库系统的三级模式结构知识笔记

1、数据抽象的三个层次数据库系统利用三个层次划分来抽象来对用户屏蔽系统的复杂性、简化用户与系统的交互。1.1 物理层物理层属于最低级层次的抽象&#xff0c;描述数据在存储器上如何进行存储的。物理层会详细描述复杂的底层结构。1.2 逻辑层逻辑层属于中间层&#xff0c;用来…

Arrays.sort()排序

/*** Arrays.sort()排序* 默认升序*/Testpublic void test(){Integer[] result {1,4,7,9};Arrays.sort(result);for (int i 0;i<result.length;i)System.out.println(i);}

import package的问题

在新建class的时候除了名字还可以选择包名&#xff1a; 新建2个包名&#xff0c;然后在不同的包里写2个同名的类&#xff0c; 程序中导入另外一个包 package com.hs;import com.hy.Father; 当直接使用Father的时候提示是引用的com.hy.Father public static void main(String[] …

数据库技术基础:常见基本模型介绍笔记

1、层次模型层次模型采用树型结构表示数据与数据间的联系。层次模型中每个节点表示一个实体&#xff0c;实体之间的联系用节点之间的连线表示&#xff0c;并且除了根节点以外&#xff0c;其他节点有且仅有一个双亲节点。层次模型特点&#xff1a;记录之间的联系通过指针实现&am…

升序

/*** 升序*/Testpublic void test25() {List<Integer> array Stream.of(1, 8, 5, 3).collect(toList());// 升序排序array.sort(Integer::compareTo);System.out.println(array);}

数据库技术:数据存储和查询知识笔记

1、存储管理器存储管理器作用&#xff1a;负责数据库中数据的存查询和更新。存储管理器负责和文件系统交互&#xff0c;将不同的DML语句翻译成底层文件系统命令&#xff0c;通过这种方式原始数据就通过文件系统存储在磁盘上。存储管理器是存储底层数据和应用程序、以及向数据库…

lambda中orElse(null)使用

如果取得第一个元素&#xff0c;则用findFirst() 最后提取元素的时候&#xff0c;可以用&#xff1a;get或者orElse(null) 这里要注意的是&#xff0c;规范用法是orElse(null) 用get方法&#xff0c;如果filter中获取的是null&#xff0c;那么用get方法会抛出异常&#xff1…

数据挖掘:数据仓库相关知识笔记

1、数据仓库介绍数据仓库&#xff08;DW&#xff09;&#xff1a;可以满足管理人员的决策分析需要&#xff0c;在数据库基础上产生了满足决策分析需要的数据环境。传统数据库和数据仓库比较比较内容传统数据库数据仓库数据内容当前数据历史的、存档的、归纳的、计算的数据目标面…

python200行代码_如何用200行Python代码“换脸”

本文将介绍如何编写一个只有200行的Python脚本&#xff0c;为两张肖像照上人物的“换脸”。 这个过程可分为四步&#xff1a; 检测面部标记。 旋转、缩放和转换第二张图像&#xff0c;使之与第一张图像相适应。 调整第二张图像的色彩平衡&#xff0c;使之与第一个相匹配。 把第…

git的smart Checkout跟force checkout的区别

1:在切换分支的时候,常常会遇到下图的问题 是因为我在test分支上修改了代码&#xff0c;但是没有commit&#xff0c;切换到其他分支上就弹出了这个窗口 我们需要怎么处理呢 2:可以看到弹框底部有Force Checkout Dont checkout Smart Checkout,表示什么意思呢 Smart …

数据挖掘相关知识介绍

1、数据挖掘定义把数据库中大量数据背后隐藏的重要信息抽取出来&#xff0c;然后为公司创造很多潜在的利润&#xff0c;针对这种海量数据库中挖掘数据信息的技术称为数据挖掘&#xff08;DM&#xff09;。2、数据挖掘的分类按照数据库种类&#xff1a;关系型数据库的数据挖掘、…