From 708b251719f02c80982761599c17596d9181f277 Mon Sep 17 00:00:00 2001 From: ZMediumToMarkdown Date: Tue, 14 May 2024 17:02:57 +0000 Subject: [PATCH] Update fetched posts. --- .../2024-04-14-f6713ba3fee3.md | 4 +- .../2024-05-14-b04f4fba3cf2.md | 498 ++++++++++++++++++ .../b04f4fba3cf2/1*-aRzC2HWRCvGok-L9jbjHA.png | Bin 0 -> 192826 bytes .../b04f4fba3cf2/1*0Cjy_5RZRq3tvE1Pc0lQ9A.png | Bin 0 -> 91917 bytes .../b04f4fba3cf2/1*6miYYw5QL6iqLQqrtHOi2A.png | Bin 0 -> 86060 bytes .../b04f4fba3cf2/1*7a_25rE2eDpMFZqBC3sP6g.png | Bin 0 -> 131766 bytes .../1*8RN-xVJROfLwtovgkvHDwA.jpeg | Bin 0 -> 60167 bytes .../b04f4fba3cf2/1*9f54be4lixn4ezKhwRJrtg.png | Bin 0 -> 57018 bytes .../b04f4fba3cf2/1*AcGEAuowmvvGRb-E22wu2g.png | Bin 0 -> 38825 bytes .../b04f4fba3cf2/1*EiSQmOkDCW73kYhJWbTipQ.png | Bin 0 -> 278793 bytes .../b04f4fba3cf2/1*HvIg0jtUQ5ops519YUA52A.png | Bin 0 -> 120454 bytes .../b04f4fba3cf2/1*IyO00OEpAadapGKNtOV_Mg.png | Bin 0 -> 86152 bytes .../b04f4fba3cf2/1*JKorlo3EBeSWXhB9Exw4ZA.png | Bin 0 -> 97282 bytes .../b04f4fba3cf2/1*JgXWca5hKROuoOgLThkQnw.png | Bin 0 -> 53422 bytes .../b04f4fba3cf2/1*JzX7U1jCtda915mGz5CPjw.png | Bin 0 -> 160002 bytes .../b04f4fba3cf2/1*Ks5IHpi2AoPj4wXu5ZH9VA.png | Bin 0 -> 235883 bytes .../b04f4fba3cf2/1*LAoe10TplFdfWXEHMRAvWw.png | Bin 0 -> 163587 bytes .../b04f4fba3cf2/1*MSuecaACmg3ZNMnGpDkRFQ.png | Bin 0 -> 51520 bytes .../b04f4fba3cf2/1*QD9M4uM9eyKSixzu8AdKbw.png | Bin 0 -> 85495 bytes .../b04f4fba3cf2/1*QV6reSNc0AJg7sQa2qiCjQ.png | Bin 0 -> 131754 bytes .../b04f4fba3cf2/1*SMnr82MEIo4YaYOvTpILeQ.png | Bin 0 -> 116973 bytes .../b04f4fba3cf2/1*SN0XL8Zt0UlBizXiIqZiyA.png | Bin 0 -> 62358 bytes .../b04f4fba3cf2/1*SeivG1XaRcd5uq2uMkyrSA.png | Bin 0 -> 59939 bytes .../b04f4fba3cf2/1*T-v1CNrmc7T4MpeyAX0c7A.png | Bin 0 -> 38564 bytes .../b04f4fba3cf2/1*UOcYlpOolfWithLb517__g.png | Bin 0 -> 128883 bytes .../b04f4fba3cf2/1*UVkfiLbcYU8YuZEPdbJaOg.png | Bin 0 -> 25257 bytes .../b04f4fba3cf2/1*VcRN0FExy-CA7sExHtMT6w.png | Bin 0 -> 47773 bytes .../b04f4fba3cf2/1*VxWQNHF_PX5CZAkjJEXPbQ.png | Bin 0 -> 411911 bytes .../b04f4fba3cf2/1*X_y5uGhRRIq7VQuW4PkYBg.png | Bin 0 -> 104325 bytes .../b04f4fba3cf2/1*_RzuFIVGV9T_-xJ53H8fGA.png | Bin 0 -> 284558 bytes .../b04f4fba3cf2/1*bxL9Dq1IWgbrlSfKO6skLQ.png | Bin 0 -> 10161 bytes .../b04f4fba3cf2/1*mWmVPZ-au302NGHXgCxAow.png | Bin 0 -> 128472 bytes .../b04f4fba3cf2/1*tU3gi3PBvrbUc-tqKjUD9w.png | Bin 0 -> 266422 bytes .../b04f4fba3cf2/1*uAyjPD75-MGokHCbDoC_4g.png | Bin 0 -> 69314 bytes .../b04f4fba3cf2/1*xruNW5ZUPNuxVJvKOyPQTA.png | Bin 0 -> 13637 bytes .../b04f4fba3cf2/1*zV5yWozKqXtwekI33NWwVg.png | Bin 0 -> 106396 bytes .../b04f4fba3cf2/1*zXVilpUXnXakpWib007BPA.png | Bin 0 -> 184522 bytes 37 files changed, 500 insertions(+), 2 deletions(-) create mode 100644 _posts/zmediumtomarkdown/2024-05-14-b04f4fba3cf2.md create mode 100644 assets/b04f4fba3cf2/1*-aRzC2HWRCvGok-L9jbjHA.png create mode 100644 assets/b04f4fba3cf2/1*0Cjy_5RZRq3tvE1Pc0lQ9A.png create mode 100644 assets/b04f4fba3cf2/1*6miYYw5QL6iqLQqrtHOi2A.png create mode 100644 assets/b04f4fba3cf2/1*7a_25rE2eDpMFZqBC3sP6g.png create mode 100644 assets/b04f4fba3cf2/1*8RN-xVJROfLwtovgkvHDwA.jpeg create mode 100644 assets/b04f4fba3cf2/1*9f54be4lixn4ezKhwRJrtg.png create mode 100644 assets/b04f4fba3cf2/1*AcGEAuowmvvGRb-E22wu2g.png create mode 100644 assets/b04f4fba3cf2/1*EiSQmOkDCW73kYhJWbTipQ.png create mode 100644 assets/b04f4fba3cf2/1*HvIg0jtUQ5ops519YUA52A.png create mode 100644 assets/b04f4fba3cf2/1*IyO00OEpAadapGKNtOV_Mg.png create mode 100644 assets/b04f4fba3cf2/1*JKorlo3EBeSWXhB9Exw4ZA.png create mode 100644 assets/b04f4fba3cf2/1*JgXWca5hKROuoOgLThkQnw.png create mode 100644 assets/b04f4fba3cf2/1*JzX7U1jCtda915mGz5CPjw.png create mode 100644 assets/b04f4fba3cf2/1*Ks5IHpi2AoPj4wXu5ZH9VA.png create mode 100644 assets/b04f4fba3cf2/1*LAoe10TplFdfWXEHMRAvWw.png create mode 100644 assets/b04f4fba3cf2/1*MSuecaACmg3ZNMnGpDkRFQ.png create mode 100644 assets/b04f4fba3cf2/1*QD9M4uM9eyKSixzu8AdKbw.png create mode 100644 assets/b04f4fba3cf2/1*QV6reSNc0AJg7sQa2qiCjQ.png create mode 100644 assets/b04f4fba3cf2/1*SMnr82MEIo4YaYOvTpILeQ.png create mode 100644 assets/b04f4fba3cf2/1*SN0XL8Zt0UlBizXiIqZiyA.png create mode 100644 assets/b04f4fba3cf2/1*SeivG1XaRcd5uq2uMkyrSA.png create mode 100644 assets/b04f4fba3cf2/1*T-v1CNrmc7T4MpeyAX0c7A.png create mode 100644 assets/b04f4fba3cf2/1*UOcYlpOolfWithLb517__g.png create mode 100644 assets/b04f4fba3cf2/1*UVkfiLbcYU8YuZEPdbJaOg.png create mode 100644 assets/b04f4fba3cf2/1*VcRN0FExy-CA7sExHtMT6w.png create mode 100644 assets/b04f4fba3cf2/1*VxWQNHF_PX5CZAkjJEXPbQ.png create mode 100644 assets/b04f4fba3cf2/1*X_y5uGhRRIq7VQuW4PkYBg.png create mode 100644 assets/b04f4fba3cf2/1*_RzuFIVGV9T_-xJ53H8fGA.png create mode 100644 assets/b04f4fba3cf2/1*bxL9Dq1IWgbrlSfKO6skLQ.png create mode 100644 assets/b04f4fba3cf2/1*mWmVPZ-au302NGHXgCxAow.png create mode 100644 assets/b04f4fba3cf2/1*tU3gi3PBvrbUc-tqKjUD9w.png create mode 100644 assets/b04f4fba3cf2/1*uAyjPD75-MGokHCbDoC_4g.png create mode 100644 assets/b04f4fba3cf2/1*xruNW5ZUPNuxVJvKOyPQTA.png create mode 100644 assets/b04f4fba3cf2/1*zV5yWozKqXtwekI33NWwVg.png create mode 100644 assets/b04f4fba3cf2/1*zXVilpUXnXakpWib007BPA.png diff --git a/_posts/zmediumtomarkdown/2024-04-14-f6713ba3fee3.md b/_posts/zmediumtomarkdown/2024-04-14-f6713ba3fee3.md index 78016b24e..8dc60eb16 100644 --- a/_posts/zmediumtomarkdown/2024-04-14-f6713ba3fee3.md +++ b/_posts/zmediumtomarkdown/2024-04-14-f6713ba3fee3.md @@ -2,7 +2,7 @@ title: "使用 Google Apps Script 實現 Google 服務 RPA 自動化" author: "ZhgChgLi" date: 2024-04-14T15:16:45.469+0000 -last_modified_at: 2024-04-15T01:44:28.846+0000 +last_modified_at: 2024-04-16T07:46:35.956+0000 categories: "ZRealm Dev." tags: ["ios-app-development","roboticprocessautomation","rpa-solutions","google-apps-script","google-sheets"] description: "使用 Google Apps Script 進行 Google Workspace 相關服務之 Robotic Process Automation 自動化" @@ -28,7 +28,7 @@ RPA \(Robotic Process Automation\) 中文翻譯為「流程自動化機器人」 **之前所做的 RPA 更多只關注在「動手寫程式實現自動化工作解決單一問題」上** ,少了前期的完整評估與分析、No/Low Code 工具使用、法規、運行監控、實際數據統計、持續改進、企業文化推廣…等等,這都是完整的 RPA 需要做的事;不過如同前面所說,我也是最近才知道這個專業領域,就容我還是先以實作方面水一篇文章吧! -提供 RPA 服務的平台有很多,例如 Automation Anywhere,UiPath, Microsoft Power Automate, Blue Prism 或是 Zapier, Automate\.io … +提供 RPA 服務的平台有很多,例如 Automation Anywhere,UiPath, Microsoft Power Automate, Blue Prism 或是 Zapier, IFTTT, Automate\.io … 要依照實際想解決的問題與平台挑選適合的服務。 推薦一套免費開源基於瀏覽器的 RPA Tool: [Automa](https://chromewebstore.google.com/detail/automa/infppggnoaenmfagbfknfkancpbljcca){:target="_blank"} 。 diff --git a/_posts/zmediumtomarkdown/2024-05-14-b04f4fba3cf2.md b/_posts/zmediumtomarkdown/2024-05-14-b04f4fba3cf2.md new file mode 100644 index 000000000..42d30ab1b --- /dev/null +++ b/_posts/zmediumtomarkdown/2024-05-14-b04f4fba3cf2.md @@ -0,0 +1,498 @@ +--- +title: "App 產品進入終點站,能做什麼事緬懷?" +author: "ZhgChgLi" +date: 2024-05-14T16:20:45.012+0000 +last_modified_at: 2024-05-14T16:20:45.012+0000 +categories: "ZRealm Dev." +tags: ["ios-app-development","man-in-the-middle-attack","mitmproxy","python","app-development"] +description: "使用 mitmproxy + apple configurator 讓 App 永遠停留在下架前的狀態" +image: + path: /assets/b04f4fba3cf2/1*8RN-xVJROfLwtovgkvHDwA.jpeg +render_with_liquid: false +--- + +### App 產品進入終點站,能做什麼事緬懷? + +使用 mitmproxy \+ apple configurator 讓 App 永遠停留在下架前的狀態 + +### 前言 + + +![咒術迴戰](/assets/b04f4fba3cf2/1*8RN-xVJROfLwtovgkvHDwA.jpeg) + +咒術迴戰 + +工作時間久、經手過的產品多,也開始遇到有曾經參與過的產品要進入終點站\(下架\);從零到有開發一個產品如同孕育一個新生命,團隊一起努力了 3–4 個月將孩子生下來;雖然後期已交由其他保母\(工程師\)繼續培養,最近聽到它即將進入產品生命週期的終點還是有些許遺憾。 + + +> **_人生也是如此,我們永遠都不知道明天是太陽先升起還是意外先來臨;唯一能做的就是珍惜當下,把事情做好。_** + + + + +#### 緬懷 + +凡走過必留下痕跡,我們希望能在產品進入終點站之前做些什麼,讓大家還有機會回憶也讓它至少留下存在過的證明;以下方式都需要 App 還在線上,如果已經下架就真的只剩回憶了。 +### 非技術方式 — 錄影 + +除了直接用 [iPhone 內建的螢幕錄影功能](https://support.apple.com/zh-tw/102653){:target="_blank"} 之外,我們也可以使用 QuickTime Player 將手機接上 Mac 使用電腦進行錄影、匯出影片。 +1. 在 Mac 上打開 QuickTime Player App + + + +![](/assets/b04f4fba3cf2/1*UVkfiLbcYU8YuZEPdbJaOg.png) + + +2\. 左上角工具列選擇「檔案」\->「新增影片錄製」 + + +![](/assets/b04f4fba3cf2/1*VcRN0FExy-CA7sExHtMT6w.png) + + +3\. 跳出錄影介面後點擊 🔴 旁的「v」,螢幕與揚聲器選擇您接上的手機 + + +![](/assets/b04f4fba3cf2/1*SN0XL8Zt0UlBizXiIqZiyA.png) + + +4\. 此時錄影介面就會出現手機畫面 + + +![](/assets/b04f4fba3cf2/1*MSuecaACmg3ZNMnGpDkRFQ.png) + + +點擊「🔴」開始錄影,回到手機上操作要錄影的內容。 + + +![](/assets/b04f4fba3cf2/1*bxL9Dq1IWgbrlSfKO6skLQ.png) + + +錄影中會顯示當前影片大小,欲結束錄影再按一次「🔴」即可停止。 + + +![](/assets/b04f4fba3cf2/1*VxWQNHF_PX5CZAkjJEXPbQ.png) + + +可以透過 QuickTime Player 工具列簡單的裁剪影片,最後按下「Command」\+「s」匯出儲存影片到指定位置,即完成錄影留念。 + +影片留念的好處是未來回憶比圖片更容易串連起來,錄的越深就紀錄的越仔細,若要將更別畫面轉成圖片也可以直接截圖,很方便。 +### 技術方式 + +App 技術備份可分為兩個方向;「骨」App 本身其實只是個骨架、「肉」由 API Response Data 組成才是 App 內容資料的核心。 +- 骨會隨著 App 從 App Store 商城下架而消失。 +- 肉會隨著 API 主機、伺服器關閉而消失。 + + +因此我們也分成備份骨跟肉兩個技術方式。 +#### 聲明 + + +> _本文僅為技術研究分享,不鼓勵利用任何技術進行非法、侵權行為。_ + + + + +#### \[骨\] 備份 \.ipa App 安裝檔 + +App 在商城下架後已下載 App 的手機只要不主動刪除 App,就會一直存在在該手機上,換手機用轉移的方式也會一併轉移過去。 + +但如果我們不小心刪除該 App 或是換手機沒轉移,那就真的永遠跟他說再見了;此時如果有手動備份商城的 \.ipa 檔案就能再次續命。 + +很久以前 [逆向工程的文章](../7498e1ff93ce/) 有提到過,但這次只需單純備份 \.ipa 檔案不需敲殼,全部都是使用 Apple 官方提供的工具完成。 + +**1\.安裝 [Apple Configurator 2](https://apps.apple.com/tw/app/apple-configurator/id1037126344?mt=12){:target="_blank"}** + + +![](/assets/b04f4fba3cf2/1*_RzuFIVGV9T_-xJ53H8fGA.png) + + +首先去 Mac App Store 下載安裝「 [Apple Configurator 2](https://apps.apple.com/tw/app/apple-configurator/id1037126344?mt=12){:target="_blank"} 」 + +**2\. 將 iPhone 接上 Mac 並點擊信任電腦** + + +![](/assets/b04f4fba3cf2/1*EiSQmOkDCW73kYhJWbTipQ.png) + + +接上成功後就會出現 iPhone 的主畫面。 + +**3\. 確認你的手機已安裝欲備份 \.ipa 檔案的 App** + + +![](/assets/b04f4fba3cf2/1*QD9M4uM9eyKSixzu8AdKbw.png) + + +我們需要在 Apple Configurator 2 卡出取代畫面,才能取得下載到暫存中的 \.ipa 檔案,因此我們要先確保手機上有安裝目標 App。 + +**4\. 回到 Mac 上的 Apple Configurator 2** + +點兩下上面顯示的 iPhone 主畫面進入資訊頁。 + + +![](/assets/b04f4fba3cf2/1*X_y5uGhRRIq7VQuW4PkYBg.png) + + +切換到「App」\-> 右上角「\+ 加入」\->「App」 + +完成 App Store 帳號登入後可以取得您曾經購買過的 App 列表。 + + +![](/assets/b04f4fba3cf2/1*uAyjPD75-MGokHCbDoC_4g.png) + + +搜尋找到欲備份的目標 App,選擇後點「加入」。 + + +![](/assets/b04f4fba3cf2/1*T-v1CNrmc7T4MpeyAX0c7A.png) + + +此時會出現等待視窗,正在 XXX 上加入 App、正在下載「XXX」。 + +**5\. 提取 \.ipa 檔案** + + +> **_放著等他下載完成後,會跳出詢問是否要取代現有已安裝 App 視窗。_** + + + + + + +![](/assets/b04f4fba3cf2/1*9f54be4lixn4ezKhwRJrtg.png) + + + +> **_此時不要按任何動作。此時不要按任何動作。此時不要按任何動作。_** + + + + + +我們打開一個 Finder: + +左上角工具列選擇「前往」\-> 「前往檔案夾」 + + +![](/assets/b04f4fba3cf2/1*JgXWca5hKROuoOgLThkQnw.png) + + +貼上以下路徑: +```bash +~/Library/Group Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps +``` + +就可以找到下載下來正準備要安裝的目標 App \.ipa 檔案: + + +![](/assets/b04f4fba3cf2/1*zV5yWozKqXtwekI33NWwVg.png) + + +將其複製出來即可完成 App \.ipa 檔案備份。 + +完成檔案複製後再回去 Apple Configurator 2 點擊停止,終止操作。 +#### \[骨\] 還原 \.ipa App 安裝檔 + +一樣是將欲還原 App 的手機接上 Mac 並打開 Apple Configurator 2,進入 App 加入介面。 + + +![](/assets/b04f4fba3cf2/1*6miYYw5QL6iqLQqrtHOi2A.png) + + +還原的話要選擇左下角「從我的 Mac 選擇…」 + + +![](/assets/b04f4fba3cf2/1*7a_25rE2eDpMFZqBC3sP6g.png) + + +選擇備份的 App \.ipa 檔案,按「加入」。 + + +![](/assets/b04f4fba3cf2/1*AcGEAuowmvvGRb-E22wu2g.png) + + +等待傳送、安裝完成,回到手機上就能重新打開 App,復活成功! +#### \[肉\] 備份最後的 API Response Data + +這邊會運用到之前在 [**App End\-to\-End Testing Local Snapshot API Mock Server**](../5a5c4b25a83d/) **文章\(細節原理可參考\)** 中所使用到的方式跟當時弄的開源專案: + + +[![](https://repository-images.githubusercontent.com/686628812/44cf2ec7-4de1-4a10-b213-bf7dd30748a4)](https://github.com/ZhgChgLi/mitmproxy-rodo/tree/main){:target="_blank"} + + +同之前用錄製 API Request & Response 來跑 E2E Testing 的技術,我們也可以用它來紀錄 App 下架、停機前最後的 API Request & Response Data。 + +**1\. 安裝 [mitmproxy](https://mitmproxy.org/){:target="_blank"}** +```typescript +brew install mitmproxy +``` + +mitmproxy 是一套開源的中間人攻擊,網路請求嗅探工具。 + +如果你不熟悉 Mitmproxy 中間人攻擊的工作原理可先參考我之前的文章:「 [APP有用HTTPS傳輸,但資料還是被偷了。](../46410aaada00/) 」或 [Mimproxy 官方文件](https://docs.mitmproxy.org/stable/overview-getting-started/){:target="_blank"} 。 + +如果是用在純網路請求嗅探,用不習慣 mimproxy 介面也可以改用「 [Proxyman](https://proxyman.io/){:target="_blank"} 」可參考之前 [另一篇文章](../70a1409b149a/) 的用法。 + +**2\. 完成 mitmproxy 憑證設定** + + +> _針對 HTTPS 加密連線我們需要使用根憑證抽換進行中間人攻擊,因此第一次使用須先完成手機端根憑證下載與啟用。_ + + + + + +> _\*如果您的 App & API Server 有實作 SSL Pinning 也需要將 Pinning 憑證加入到 mitmproxy。_ + + + + +- 首先確保 iPhone 手機與 Mac 電腦是連接在相同的網路環境 +- 若無 WiFi 電腦連接實體網路,也可以 [打開 Mac 的 WiFi 分享功能](https://applealmond.com/posts/92291){:target="_blank"} 讓手機連到 Mac 的網路 + + +在 Terminal 啟動 `mitmproxy` or `mitmweb` \(Web GUI 版\)。 +```typescript +mitmproxy +``` + + +![](/assets/b04f4fba3cf2/1*xruNW5ZUPNuxVJvKOyPQTA.png) + + +看到這畫面代表 mitmproxy 服務已啟動,目前沒有流量進來所以是空的,掛在這個畫面不要關閉 Terminal。 +- 到 Mac 網路設定查看 Mac 的 IP 位址 + + +回到手機 WiFi 設定點擊「i」進入詳細設定,找到最下方「設定代理伺服器」: + + +![](/assets/b04f4fba3cf2/1*zXVilpUXnXakpWib007BPA.png) + + + +![](/assets/b04f4fba3cf2/1*QV6reSNc0AJg7sQa2qiCjQ.png) + +- 伺服器輸入 Mac 電腦的 IP 位址 +- 連接埠輸入 8080 +- 儲存 + + +**在手機上打開 Safari 輸入: [http://mitm\.it/](http://mitm.it/){:target="_blank"}** + +如果出現: +```kotlin +If you can see this, traffic is not passing through mitmproxy. +``` + +代表手機的網路代理伺服器沒有設定成功或是 Mac 上沒啟動 `mitmproxy` 。 + +正常情況會出現: + + +![](/assets/b04f4fba3cf2/1*Ks5IHpi2AoPj4wXu5ZH9VA.png) + + + +> _此時只有 HTTP 流量能被嗅探,HTTPS 流量會報錯,我們繼續往下設定。_ + + + + + +代表連接成功,我們找到 iOS 區塊點擊「Get mimproxy\-ca\-cert\.pem」 + + +![](/assets/b04f4fba3cf2/1*HvIg0jtUQ5ops519YUA52A.png) + + + +![](/assets/b04f4fba3cf2/1*tU3gi3PBvrbUc-tqKjUD9w.png) + +- 點擊「允許」 + + +下載完成後進入到手機的設定,會出現「已下載描述檔」點擊進入。 + + +![](/assets/b04f4fba3cf2/1*JzX7U1jCtda915mGz5CPjw.png) + + + +![](/assets/b04f4fba3cf2/1*mWmVPZ-au302NGHXgCxAow.png) + + + +![](/assets/b04f4fba3cf2/1*SMnr82MEIo4YaYOvTpILeQ.png) + +- 點擊進入,右上角「安裝」,輸入手機密碼完成安裝。 + + +回到設定 \-> 「一般」\->「關於本機」\-> 最下方「憑證信任設定」\-> 啟用「mitmproxy」。 + + +![](/assets/b04f4fba3cf2/1*UOcYlpOolfWithLb517__g.png) + + + +![](/assets/b04f4fba3cf2/1*LAoe10TplFdfWXEHMRAvWw.png) + +- 「繼續」完成啟用。 + + +至此我們就完成中間人攻擊所有的前置準備工作。 + + +> _要記得當前你手機所有的流量都會經過代理從你的 Mac 電腦出去, **操作完畢記得回到手機上的網路設定把代理伺服器設定關掉** ,否則手機網路 WiFi 會全部連不上對外網路。_ + + + + + +回到 Terminal mitmproxy,一邊操做手機上的 App 就能看到所有被捕捉的 API 請求紀錄。 + + +![](/assets/b04f4fba3cf2/1*-aRzC2HWRCvGok-L9jbjHA.png) + + +每個請求都能進入查看詳細 Request & Response 內容: + + +![](/assets/b04f4fba3cf2/1*IyO00OEpAadapGKNtOV_Mg.png) + + +以上是 mitmproxy 基礎設定與實際工作。 + +**3\. 嗅探、了解 API 架構** + +再來就要透過 mitmproxy 的 `mitmdump` 服務結合我之前開發的 [**mitmproxy\-rodo**](https://github.com/ZhgChgLi/mitmproxy-rodo/tree/main){:target="_blank"} [addons](https://docs.mitmproxy.org/stable/addons-overview/){:target="_blank"} 錄製請求和回放請求。 + + +> [_我的實現原理_](../5a5c4b25a83d/) _是將 Request 請求參數計算成 Hash 值,在回放時再次將請求拿去計算 Hash 如果在本地有找到相同 Hash 值的備份 Response 則返回,如果有多個相同 Hash 值的請求會按照順序儲存&回放。_ + + + + + +我們可以先透過以上方法嗅探 App 的 API \(或使用 [Proxyman](https://proxyman.io/){:target="_blank"} \),觀察有哪些欄位跟哪些欄位可能會影響 Hash Mapping,可以將其記錄下來,在後續設定排除, **例如有的 API 固定會帶 `?ts` 這參數不影響回傳內容,但會影響 Hash 值計算導致無法找到本地的備份,我們就需要挑出來在後面的設定中排除掉** 。 + +**4\.設定 [mitmproxy\-rodo](https://github.com/ZhgChgLi/mitmproxy-rodo/tree/main){:target="_blank"} :** + +使用我寫好的錄製、回放開源 Script。 + + +> **_細節參數設定請參考該開源專案的說明。_** + + + + +```bash +git clone git@github.com:ZhgChgLi/mitmproxy-rodo.git +cd mitmproxy-rodo +``` + +將上一步驟 3\. 挑出來的參數填入到 config\.json 設定檔案中: +```json +{ + "ignored": { + "*": { + "*": { + "*": { + "iterable": false, + "enables": [ + "query", + "formData" + ], + "rules": { + "query": { + "parameters": [ + "ts", + "connect_id", + "device_id", + "device_name", + ] + }, + "formData": { + "parameters": [ + "aidck", + "device_id", + "ver_name", + ] + } + } + } + } + } + } +} +``` + +以上參數在計算 Hash 值時都會被排除,也能針對個別 Endpoint 路徑設定特定排除規則。 + +**5\. 啟用錄製,在 Terminal 下改執行:** +```bash +mitmdump -s rodo.py --set dumper_folder=zhgchgli --set config_file=config.json --set record=true "~d zhgchg.li" +``` +- 結尾的 `"~d zhgchg.li"` 意思是只截取 \* \.zhgchg\.li 的流量。 +- `dumper_folder` : 輸出目的目錄名稱 + + +**6\. 回到手機上操作目標 App 執行欲錄製的流程路徑** +- 建議重啟、重安裝 App 用最乾淨的方式開始操作 +- 建議可以搭配錄影,以利記得復現步驟 + + + +![](/assets/b04f4fba3cf2/1*SeivG1XaRcd5uq2uMkyrSA.png) + + +邊操作的同時,就能看到輸出目錄會有很多擷取下來的 API Response Data,會照著 Domain \-> API 路徑 \-> HTTP 方法 \-> Hash 值 \-> Header\-X / Content\-X 存放\(若相同 Hash 請求兩次,會按照順序儲存下來\)。 +- 重新錄製可以直接刪出輸出目錄,讓他重新擷取。 +- **如果回傳的資料包含個資,請記得調整擷取內容去識別化。** + +#### \[肉\] 回放擷取到的 API Response Data + +錄製完畢後請務必要嘗試回放一次,測試資料是否正常,若 Hash Hit 很低\(回放時幾乎都沒找到對應的 Response\),可以重複嗅探步驟找到那個每次執行 App 都不確定影響 Hash 值的變數並將其排除。 + +**執行回放:** +```bash +mitmdump -s rodo.py --set dumper_folder=zhgchgli --set config_file=config.json +``` +- `dumper_folder` : 輸出目的目錄名稱 +- 預設本地沒有 Hash Mapping 到的 Response Data 會直接回傳 404 讓 App 空白,這樣才能知道擷取的資料有沒有效。 + + + +![](/assets/b04f4fba3cf2/1*0Cjy_5RZRq3tvE1Pc0lQ9A.png) + + + +![](/assets/b04f4fba3cf2/1*JKorlo3EBeSWXhB9Exw4ZA.png) + +- 錄製擷取時有經過過的路徑頁面,回放時能重新顯示:OK\! +- 錄製擷取時沒經過過的路徑頁面,回放時顯示網路錯誤:OK\! + +### 緬懷 + +至此,我們已經可以自行透過還原骨與最後的肉,來復現當年 App 走進終點站前的最後時光,以此緬懷那個大家一起同心協力生產出來的時光。 + +以此篇文章紀念第一份工作的團隊與當年從網頁後端開發邊做邊學轉職 iOS App 開發,獨立從無到有在 3–4 個月的短暫時間,與 Android、設計、PM 主管、後端同事一同順利生產出的產品,雖然它即將進入生命週期的終點站,但我永遠都會記得當年的酸甜苦辣與第一次看到他上線、有人使用的那個感動。 + + +> 「謝謝」 + + + +#### 歡迎協助貢獻 + +如果你也有相同的遺憾,希望本篇文章也能幫助到你,因為 [mitmproxy\-rodo](https://github.com/ZhgChgLi/mitmproxy-rodo/tree/main){:target="_blank"} 當初只是 POC 概念驗證下開發出的工具,歡迎協助貢獻、提出遇到的 Bug 或開 PR 修改 Bug。 + + +[![](https://repository-images.githubusercontent.com/686628812/44cf2ec7-4de1-4a10-b213-bf7dd30748a4)](https://github.com/ZhgChgLi/mitmproxy-rodo/tree/main?source=post_page-----5a5c4b25a83d--------------------------------){:target="_blank"} + + + +有任何問題及指教歡迎 [與我聯絡](https://www.zhgchg.li/contact){:target="_blank"} 。 + + + +_[Post](https://medium.com/zrealm-ios-dev/app-%E7%94%A2%E5%93%81%E9%80%B2%E5%85%A5%E7%B5%82%E9%BB%9E%E7%AB%99-%E8%83%BD%E5%81%9A%E4%BB%80%E9%BA%BC%E4%BA%8B%E7%B7%AC%E6%87%B7-b04f4fba3cf2){:target="_blank"} converted from Medium by [ZMediumToMarkdown](https://github.com/ZhgChgLi/ZMediumToMarkdown){:target="_blank"}._ diff --git a/assets/b04f4fba3cf2/1*-aRzC2HWRCvGok-L9jbjHA.png b/assets/b04f4fba3cf2/1*-aRzC2HWRCvGok-L9jbjHA.png new file mode 100644 index 0000000000000000000000000000000000000000..ec1470a83ea14f7a32e6483ebc5ba60b37e2694f GIT binary patch literal 192826 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