前言
Fiddler 是一個用於 HTTP 調試的代理伺服器應用程式,透過成為電腦的代理伺服器,獲取應用程式送出的Request和Response,來獲取封包內容,常做為開發人員的 debug 工具。類似的工具有 Charles,Wireshark…,不過 Fiddler 有提供免費版本,基本上沒有什麼限制,一般來說免費就夠用了。
本教學以 Fiddler 來演示,如何抓取 android 手機封包,並以實際例子(麥當勞報報)做示範。
所需工具/條件
- 一台電腦
- 一支Android 手機
- 一台 WIFI AP
- 並確保電腦及手機連載同一台AP,也就是同一個區網。
電腦端的設定
Step 1. 安裝 Fiddler

Step2. 進入設定HTTPS菜單,安裝信任憑證(Trust root certificate),將擷取HTTPS流量的選項(Capture HTTPS traffic)打勾,並將憑證匯出到桌面(Export root certificate to Desktop)。



Step 3. 到 Connections 選單,記下 port 這組數字,預設是8866,待會會使用到,並且確定Allow remote computers to connect allow remote computers to connect 選項是打勾的,如此一來才能確保可以擷取到手機的資料。

Step 4. 到這裡,Fiddler 的設定就差不多了,但還缺一樣東西,打開Windows 的命令提示字元(CMD),輸入 ipconfig 來查詢電腦的IP。由下圖所示電腦IP為192.168.8.100,一樣將這組數字記下來。

做到這裡,我們來確認一下剛剛得到的三樣東西,(1)桌面上的憑證(2)電腦的IP(Fiddler監聽的PORT值)。
手機端的設定
接著換到手機這邊,先確認一下手機跟電腦是否連接在同一個局域網
Step 1. 進入手機的 WIFI 設定,選擇當前連接的WIFI(跟電腦處於同區網)長按進入設定或修改網路(每支手機可能方式不同),此時會看到 PROXY設定 ,預設是無,我們要改為手動,並在主機名稱填入之前記下的電腦IP,通訊埠則填入之前記下的PORT值

Step 2. 將電腦桌面匯出的憑證放進手機任何一個位置,自己記住即可。
Step 3. 進入手機的安全性設定,選擇從SD卡中安裝,安裝過程會叫你輸入憑證名稱,名稱隨意取方便辨認即可。(註* Android 7 版本之後,已經無法讓使用者自行安裝憑證了)


此時手機端跟電腦端都設定好囉。
擷取 HTTPS 封包
回到電腦上的 Fiddler ,即可看到列表上密密麻麻的封包,因為在安裝設定的過程,Fiddler 已經默默的紀錄所有電腦與手機進出的封包,可以在此查看到底有那些封包傳入傳出。

首先我們先將之前的紀錄刪掉,避免被一堆不必要的紀錄干擾,按下列表的”Remove All”,來做刪除的動作,清空後還是會有零星封包出現,不用太過擔心,至少畫面乾淨多了。
此時我們打開 “麥當勞報報的 APP”,不難發現,Fiddler中多出了許多封包紀錄,眼尖的你們,應該會發現 api1.mcddailyapp.com這筆資料,經過反覆的清空與重開APP,幾乎可以確認 api1.mcddailyapp.com 跟 APP 有著極大的關係。

要更仔細觀察,可以在URL中加入篩選條件,如此一來能較容易聚焦在我們所想看到的東西。


在手機切換APP的各功能,即能歸類出各功能對應的API,例如查看優惠券的API就是 ->https://api1.mcddailyapp.com/coupon/get_list ,以此類推……
有趣的是,當你一如往常,設定鬧鐘並”點選點我拿驚喜”…

畫面跳出了知之前沒有出現的封包: /lottery/get_item,並可以在右邊視窗查看到,請求的資訊以及回傳回來的優惠券內容,可以確定這是一支麥當勞報報的抽券API。

以下是發出請求(request)的參數,其中”access_token”就是代表你目前登入帳號的唯一token,作為抽取優惠券的歸戶依據。
{"access_token": "XXXXXXX"
,
"source_info":{
"app_version": "APP版本"
,
"device_time": "2020/08/06 17:05:02"
,
"device_uuid": "裝置ID"
,
"model_id": "手機ID"
,
"os_version": "Android 版本"
,
"platform": "Android",
}
}
Fiddler 也提供了類似 Postman 的 API 測試工具,只要切到 Composer 分頁,參考剛剛擷取到的抽獎封包,將Method改為 POST,URL 填入 https://api1.mcddailyapp.com/lottery/get_item, 在request Body 部分填入剛剛的 https 請求參數,接著點選 Execute 按鈕,接著下面的Response回應視窗,也會接收到送出請求收到的結果,沒有意外會顯示 “今日已領過”。

token 沒有碼到~
謝謝 已修正XD