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.pswp.cn/news/271315.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271315.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271315.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分珠(dfs+并查集)

1140 分珠 時間限制:500MS 內存限制:65536K提交次數:24 通過次數:18 題型: 編程題 語言: G;GCC Description 如下圖所示,有若干珠子,每顆珠子重量不同,珠子之間有一些細線將它們連在一起。現要求切斷一些細線,將它們分成兩部分…

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

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[] …

mysql分區列要包含主鍵嗎_MYSQL的分區字段,必須包含在主鍵字段內

在對表進行分區時&#xff0c;如果分區字段沒有包含在主鍵字段內&#xff0c;如表A的主鍵為ID,分區字段為createtime &#xff0c;按時間范圍分區&#xff0c;代碼如下&#xff1a; www.2cto.comCREATE TABLE T1 (id int(8) NOT NULL AUTO_INCREMENT,createtime datetime NOT …

python爬蟲怎么下載圖片到手機_Python爬蟲獲取圖片并下載保存至本地

1、抓取煎蛋網上的圖片。 2、代碼如下&#xff1a; import urllib.request import os #to open the url def url_open(url): requrllib.request.Request(url) req.add_header(User-Agent,Mozilla/5.0 (Windows NT 6.3; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0) responseu…

數據庫技術基礎:常見基本模型介紹筆記

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);}

核心動畫與UIView的區別

核心動畫與UIView的區別 1、核心動畫只作用于layer&#xff0c;使用核心動畫之前&#xff0c;必須有layer 2、核心動畫只是假象&#xff0c;并沒有移動實際位置 什么時候使用核心動畫&#xff0c;什么時候使用UIView動畫 1、當不需要與用戶進行交互時&#xff0c;使用核心動畫或…

python convert函數_Python內置函數

英文文檔&#xff1a;hex(x)Convert an integer number to a lowercase hexadecimal string prefixed with “0x”, for exampleIf x is not a Python int object, it has to define an __index__() method that returns an integer.說明&#xff1a;1. 函數功能將10進制整數轉…

數據庫技術:數據存儲和查詢知識筆記

1、存儲管理器存儲管理器作用&#xff1a;負責數據庫中數據的存查詢和更新。存儲管理器負責和文件系統交互&#xff0c;將不同的DML語句翻譯成底層文件系統命令&#xff0c;通過這種方式原始數據就通過文件系統存儲在磁盤上。存儲管理器是存儲底層數據和應用程序、以及向數據庫…