摘自:http://www.51ste.com/share/det-402.html
一、前言
我們經(jīng)常在工作中使用到各種工具去對網(wǎng)絡(luò)請求進行攔截。抓包的工具有很多,適用于不同的平臺和場景,例如:Charles、Fiddler、Wireshark等等,在windows下,使用Fiddler就非常的方便,但是它的缺陷在于沒有Mac的版本,這讓使用mac的人員就十分苦惱。那么今天就其中一款抓包工具, Charles 進行講解,Charles 是一款全平臺的抓包工具,所以可以在 Mac 下使用。
二、Charles
1、什么是Charles
Charles 是一款比較常用的全平臺的網(wǎng)絡(luò)封包截取工具,而我們在做移動開發(fā)的時候,我們?yōu)榱苏{(diào)試、測試、分析等目的,經(jīng)常需要與服務(wù)端的網(wǎng)絡(luò)通訊協(xié)議打交道。Charles 可以幫我們截取網(wǎng)絡(luò)數(shù)據(jù)包來進行分析。
Charles 通過將軟件本身設(shè)置成系統(tǒng)的網(wǎng)絡(luò)訪問代理服務(wù)器,使得所有的網(wǎng)絡(luò)請求都會走一遍 Charles 代理,從而 Charles 可以截取經(jīng)過它的請求,然后我們就可以對其進行網(wǎng)絡(luò)包的分析。
Charles 是一款收費的軟件,可以提供 30 天的免費試用體驗。試用期過后,為付費的用戶,仍然可以繼續(xù)使用,但是每次使用時間不能超過 30 分鐘,并且啟動時將會有 10s 的延遲。所以如果只是偶爾使用一下,可以考慮一直使用免費版本,如果長期依賴抓包的話,可以選擇付費或者其他你能想到的辦法來解決 Charles License 的問題。
Charles 的功能非常強大,具體的還是以官方文檔為準,這里只是介紹一下開發(fā)和測試在工作中會用到的功能:
截取Http和Https網(wǎng)絡(luò)包。
支持重發(fā)網(wǎng)絡(luò)請求,方便后端調(diào)試。
支持修改網(wǎng)絡(luò)請求參數(shù)。
支持網(wǎng)絡(luò)請求的截取以及動態(tài)修改請求響應(yīng)結(jié)果。
支持模擬限流網(wǎng)絡(luò)。
官網(wǎng):https://www.charlesproxy.com
這里使用的次新版,v4.2.5 進行講解,和舊版本相比,有一些界面的修改和增加了一下新的功能,整體來說都差不多。
2、Charles的基本界面
打開Charles之后,在主頁面中,提供了兩種查看網(wǎng)絡(luò)包的視圖方式,分別是『Structure』和『Sequence』。
1、Structure 視圖
Structure 視圖將網(wǎng)絡(luò)請求按請求的域名進行分類,將同域名的請求進行分類。

可以看到,Structure 視圖模式下,所有的請求是以域名進行分類顯示的,可以讓我們更關(guān)注同域名下的請求,當然這里都被折疊起來了,當此域名下有接口鏈接被請求了,會閃一下,這樣就可以讓我們發(fā)現(xiàn)哪些域名下的數(shù)據(jù)正在被請求。

2、Sequence 視圖
Sequence 視圖模式下,會將所有的網(wǎng)絡(luò)請求都按照訪問的時間從上到下進行排序。

和 Structure 一樣,該有的區(qū)域都有,很直觀的顯示了當前的請求鏈接、請求數(shù)據(jù)、響應(yīng)數(shù)據(jù)等情況。因為這里是按請求的先后順序進行有序的排列,Charles 同時也提供了一個過濾請求的地方,可以通過它來簡單的過濾我們需要的請求再進行查看。
在實際使用過程中,通常根據(jù)具體的需要在這兩種視圖之間來回切換。而對于某一個具體的網(wǎng)絡(luò)請求,Charles 也提供了詳細的請求內(nèi)容和響應(yīng)內(nèi)容,將發(fā)送的數(shù)據(jù)和顯示的數(shù)據(jù)均顯示出來,對于一些常見的數(shù)據(jù)格式, Charles 還提供了一些格式化的操作,例如 JSON 內(nèi)容,可以切換到 JSON 標簽下,它會按照 JSON 的格式進行格式化,方便我們閱讀和查看,而圖片的請求也會在 Charles 中顯示縮略圖的預(yù)覽。
三、截取移動設(shè)備的網(wǎng)絡(luò)封包
Charles 通常本身是可以直接截取本機上的網(wǎng)絡(luò)封包的,但是在現(xiàn)在互聯(lián)網(wǎng)公司來說,大部分使用到抓包的場景都是需要去抓一些移動設(shè)備上的網(wǎng)絡(luò)請求,例如:iPhone、Android 設(shè)備等,下面就以 iPhone 為例子,講解如何通過 Charles 抓取移動設(shè)備上的網(wǎng)絡(luò)封包。
1、Charles對應(yīng)設(shè)置
既然 Charles 是做了一個本地代理,所以需要將代理功能打開,并設(shè)置一個固定的端口。默認情況下,端口號為:8888 。
可以通過菜單欄:proxy → Proxy Settings ,進行查看當前或者修改當前代理端口,并且保證 Enable transparent HTTP proxying 被勾選。

2、iPhone上的設(shè)置
如果像在移動設(shè)備上指向 Charles 配置的代理,還需要知道本機的 IP 地址。一般來說,我們都知道在 Ternimal 中使用 ifconfig 命令,也可查到當前的 IP 地址。而 Charles 也提供了可視化的方式來查看當前本機的 IP 地址。

通過頂部菜單:Help → Local IP Address ,即可查看到當前設(shè)備的 IP 地址。
知道當前代理設(shè)備的 IP 地址之后,還需要在 iPhone 上設(shè)置 WIFI 的 HTTP 代理。注意這里的前提是,iPhone 和 Charles 代理設(shè)備鏈接的是同一網(wǎng)絡(luò)。
在iPhone中,通過 設(shè)置 → 無線局域網(wǎng) ,查看當前鏈接的 WIFI 點擊最右邊的感嘆號,進入當前 WIFI 的細節(jié)配置頁面,在最下面的 HTTP 代理中,選擇「手動」,然后填寫 Charles 代理機器的 IP 和 端口。
設(shè)置好之后,在 iPhone 上打開任意需要聯(lián)網(wǎng)的 App ,就可以看到 Charles 中彈出iPhone 請求鏈接的確認菜單,點擊“Allow”即可完成設(shè)置。

3、截取Https的網(wǎng)絡(luò)封包
在現(xiàn)在這個全網(wǎng)皆Https的環(huán)境下,一個App使用Https 是非常常見的。而正常情況下,Charles 是不能截取Https的網(wǎng)絡(luò)包的,這涉及到 Https 的證書問題。
但是可以在 Charles 中,通過一些簡單的配置,使其安裝 Charles 的 CA 證書。
具體步驟如下:
①在 Mac 上安裝 CA 證書。通過頂部菜單選擇:Help → SSL Proxying →? ? ?Install Charles Root Certificate,來安裝 CA 證書。
②iPhone 中,通過訪問 http://charesproxy.com/getssl來下載安裝 Charlse 的 CA 證書。
③在需要截取Https的請求上,選擇 Enable SSL Proxying。
完成上面的步驟之后,就可以在 Charles 中,截取到 iPhone 設(shè)備上的 Https 請求了。
在這個配置的過程中,可能會出現(xiàn)一些問題,可能按照步驟依然抓取不了 Https 的網(wǎng)絡(luò)包。主要的原因在于: CA 證書需要被 MacOS 信任。

Charles 的 CA 證書,需要被 MaxOS 信任,安裝好證書之后,通常會彈出『鑰匙串訪問』的窗口等待確認,當發(fā)現(xiàn)剛才安裝的 Charles 證書右下角有各 x 號,表示當前證書并不被 MacOS 信任。
需要選中這個 CA 證書,并指定為信任即可,在這個過程中,需要輸入密碼進行授權(quán)。
這樣,我們就可以抓取iPhone手機上的請求了,當然該工具還有著很多強大的功能,大家可以根據(jù)需要前去查找。
