# 一鍵抓包

中間人一鍵抓包功能，可以全自動地在裝置上開啟全域中間人，它與您**常用的工具不同之處**在於，您無需顧及**憑證安裝**和**設定代理**等問題，也無需擔心不同系統版本，抓包方法有所區別這些問題。它可以無縫應用於 Android 6.0 - 14，我們已經為您處理好了一切，您只需要專注於具體業務。
並且支援即時的改包和攔截，相較於常用的 GUI 介面程式，它更適合您作為實際業務使用，而不僅僅是「抓個包看看」。

除此之外，我們可以向您保證**沒有抓不到的包**（憑證綁定除外），抓包成功率也比常規軟體的方法高。您可以攔截應用程式的 http/s 流量。它可以自動應用及撤銷中間人，退出腳本後，裝置及網路也將恢復原狀，您不必做任何其他設定，腳本同時支援**國際**中間人抓包（透過上游代理實現），讓您可以輕鬆抓取國外軟體。

```{attention}
不論您是哪種系統的使用者，開始抓包前，為確保準確無誤一次完成，請暫時徹底關閉您的**網路防火牆**。
```

## 前期準備

首先確保當前電腦與裝置在同一個網段，或者具備 USB 連接，我們後面假設 192.168.0.2 為執行了 FIRERPA 的手機裝置 IP。其次，確保您已正常克隆專案工具程式碼以及安裝了相關依賴，在命令列驗證 mitmproxy 已安裝成功（可在命令列輸入 `mitmdump` 進行驗證）。

如果您沒有 Python 也不熟悉什麼是克隆和依賴，您可以在我們的發布頁面下載到 `startmitm.exe`，它是 startmitm.py 的打包檔，您可以在不安裝 Python 的情況下執行抓包，這是一個主控台應用程式，指令參數與 `startmitm.py` 相同（該檔案可能會被防毒軟體報毒，請自行決定是否使用）。

## 基礎抓包

```{hint}
您抓包的應用程式可能存在 SSL PINNING（憑證綁定）或是 QUIC 協定，這兩種情況都可能影響抓包效果。我們會自動強制 QUIC 降級，但是由於可能存在 FallBack 時間，應用程式的網路可能會表現得非常卡頓，請稍等一會。存在憑證綁定的應用程式則無法直接抓包，您需要配合逆向編寫 frida 腳本來繞過 SSL PINNING 邏輯。
```

您可以透過如下指令快速進行抓包，這是最簡單的使用方法。

```bash
python3 -u startmitm.py 192.168.0.2
```

```{important}
**務必牢記執行完 startmitm 指令之後，請徹底關掉需要抓包的 APP 並重新開啟，從工作列關閉應用程式不是可靠的做法。請使用 API 關閉或自行使用指令 kill -9 所有與應用程式相關的 PID，否則無法正常抓取。**
```

按下一次組合鍵 `CONTROL` + `C` 即可退出抓包，請不要多次連續按下。

## 共享抓包

如果您想和區域網路的夥伴一起分析，執行如下指令，隨後讓您的夥伴用瀏覽器開啟 `http://您的IP位址:7890` 即可和您看到一樣的抓包頁面，你們可以一起愉快地分析。

```bash
python3 -u startmitm.py 192.168.0.2 --web-port 7890 --web-host 0.0.0.0
```

## 特定應用程式

如果您需要攔截特定應用程式的流量，而不是系統全域的流量包，您可以透過下面這種方法在 IP 後面加入 `:套件名稱` 來抓取特定應用程式的流量資料，以下範例將會只攔截 `com.some.package` 的流量。

```bash
python3 -u startmitm.py 192.168.0.2:com.some.package
```

## 即時修改

您可以即時修改應用程式的請求資料和回應資料，此功能基於 mitmproxy 的事件掛鉤。您需要自行根據 mitmproxy 相關 API 編寫掛鉤腳本。關於如何編寫掛鉤腳本，請參考 mitmproxy 的官方文件 [docs.mitmproxy.org/stable/addons-examples](https://docs.mitmproxy.org/stable/addons-examples/) 以及範例程式碼 [mitmproxy/examples/contrib](https://github.com/mitmproxy/mitmproxy/tree/9.0.0/examples/contrib)。

假設您編寫的掛鉤腳本為 `http_flow_hook.py`，使用以下方式應用掛鉤腳本。

```bash
python3 -u startmitm.py 192.168.0.2 -s http_flow_hook.py
```

## 不同網路

如果您的手機和當前電腦不在同一個網路，但是可以實體接觸裝置，您也可以透過 USB ADB 的方式進行抓包。需要確保當前裝置已透過 USB ADB 接入電腦且已正確授權。


如果電腦只連接了一個 ADB 裝置，使用如下指令進行抓包，`localhost` 代表使用 ADB 裝置。

```bash
python3 -u startmitm.py localhost
```

如果電腦連接了多個 ADB 裝置，您需要指定 adb 序號，請從指令 `adb devices` 的輸出中尋找。

```bash
python3 -u startmitm.py localhost --serial bfde362
```

如果您的環境更嚴苛，例如手機與當前電腦既不在同一網路下，也無法實體接觸裝置，但是只要您可以存取 FIRERPA 的連接埠，也可以進行中間人。這種情況通常為：您使用了內建 frp 服務將 FIRERPA 轉發到遠端伺服器，或者您自行透過某種方式將 FIRERPA 的 65000 連接埠轉發到某個地方。在這種情況下，您和 FIRERPA 之間僅有這一個連接埠可以直接通訊，其他連接埠是無法互相存取的。在這種情況下，手機無法存取到本機的任何連接埠，本機也只能存取到手機的 FIRERPA 連接埠（或者手機有公用 IP，但本機在內網），這樣就需要透過以下方式來進行。（OpenVPN 網路互通，不屬於以上情況）

這時，需要透過下面這種組合方式來進行。首先，使用 `adb_pubkey.py` 或自行呼叫介面將自身的 ADB 公鑰安裝到裝置上，安裝完畢後繼續執行以下過程，其中 `x.x.x.x` 為可以連接到 65000 連接埠的 IP 或 `127.0.0.1`，請依實際情況修改。

```bash
adb connect x.x.x.x:65000
```

最後，按照和上文一樣的方法，透過 USB 抓包來操作。

```bash
python3 -u startmitm.py localhost
```

或者像下面這樣，這裡的 serial 是 adb connect 的位址而不是十六進位序號了。

```bash
python3 -u startmitm.py localhost --serial x.x.x.x:65000
```

## 上游代理/國際抓包

startmitm 本身會啟動 mitmproxy 作為代理服務，預設情況下，流量都是 mitmproxy 從本機網卡發出的，如果您需要流量透過一個上游代理發出而不是本機，可以使用如下方式指定上游代理，僅支援 **HTTP** 協定的代理作為上游代理。同時您需要指定一個支援 TCP 查詢的上游 DNS 來避免污染。

```{tip}
上游代理模式需要確保 mitmproxy 的版本 >= 9.0.0（且 Python>=3.9)。
```

```bash
python3 -u startmitm.py 192.168.0.2 --upstream http://127.0.0.1:7890 --proxy-dns 8.8.8.8
```

如果上游 HTTP 代理需要登入認證，請按以下指令並替換 `USER:PASSWORD`。

```bash
python3 -u startmitm.py 192.168.0.2 --upstream http://USER:PASSWORD@x.x.x.x:8080 --proxy-dns 8.8.8.8
```

以上所有指令將會把裝置流量從 upstream 代理發出，並且將本機所有 DNS 查詢透過代理傳送到 8.8.8.8。