# Charles應用

Charles 是在電腦上運行的 Web Proxy (HTTP Proxy / HTTP Monitor)，很多時候我們會需要去監控有關Network的相關資訊 如果是透過瀏覽器去使用的那還比較好處理,但是透過非瀏覽器就會需要透過代理服務器,來協助我們去做監控.\
\
通過將自己設置為系統的網絡訪問代理服務器，這樣所有的 network請求都會通過它，從而實現截獲和分析。

### Charles 主要的功能包括

* 截取 Http 和 Https 網絡封包
* 支持重發網絡請求，方便後端調試
* 支持修改網絡請求參數
* 支持網絡請求的截獲並動態修改
* 支持模擬慢速網絡

### 結果

<figure><img src="/files/kHPVn7mzMkkleizb4lvI" alt=""><figcaption><p>太神啦~</p></figcaption></figure>

就連https 也都可以正常看到Network資訊

## 開始建置監控機制

預計會有10個步驟,跟著步驟走,Bug遠離我.

### 1.下載並安裝Charles

Charles 官網: <https://www.charlesproxy.com/>

### 2.下載並安裝夜神模擬器

下載夜神模擬器 or genymotion(下載你可以安裝apk的模擬器,並且有修改proxy功能的既可)\
我是使用夜神模擬器作為本次文章的範例

### 3.確認你要安裝的apk 是否需要超過Android 7+版本(後續操作會不同)

是不是很快,馬上就被我水了3個步驟,接下來的步驟絕對會更輕鬆的.

### 4.啟動Charles & proxy setting & install CA

<figure><img src="/files/yMq7sBA3LIOABnGmDr4x" alt=""><figcaption><p>基礎設定Port default 8888</p></figcaption></figure>

Port 基本上不需要修改，除非你有衝突。

<figure><img src="/files/FYopDxX9J5qn1Ecl8Xlc" alt=""><figcaption><p>設定Https 過濾條件</p></figcaption></figure>

這樣設定基本上就可以滿足需求，後續可再透過incloud & exclouded 來做篩選\
Host : \*\
Port: \*

<figure><img src="/files/F8iyxc0vbv2JXYpWMrB9" alt=""><figcaption></figcaption></figure>

#### 牽涉到Https 就會扯到證書，開始設定吧

路由 >>> HELP > SSL Proxying

<figure><img src="/files/yqH9yPZQZZ5hHgKKHCOU" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/ZMkpZOwLw916TLctLW6i" alt=""><figcaption><p>兩個Install &#x26; save charles root cret 都要使用</p></figcaption></figure>

<div><figure><img src="/files/lfBuUycrnQldD0rjLrgi" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ysBPawgF8vOrOzipfZIT" alt=""><figcaption></figcaption></figure> <figure><img src="/files/cafH1KOD9jkoQFVcKFhE" alt=""><figcaption></figcaption></figure> <figure><img src="/files/zWtKCjuEOyb0tU5mqFHY" alt=""><figcaption></figcaption></figure> <figure><img src="/files/HNw5ECkGUdU7X7uxTQbG" alt=""><figcaption></figcaption></figure> <figure><img src="/files/rFIMxMdNTZ1RWL3TXg8f" alt=""><figcaption></figcaption></figure> <figure><img src="/files/DiorH3gYoEbe0T6rILvu" alt=""><figcaption></figcaption></figure> <figure><img src="/files/54Ll9Qw26KADyUtUVKKY" alt=""><figcaption></figcaption></figure> <figure><img src="/files/ZMkpZOwLw916TLctLW6i" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Y9Cz64hCv0HlMohGYAiG" alt=""><figcaption></figcaption></figure> <figure><img src="/files/j7jXGok8tFbrS7uYeVvQ" alt=""><figcaption></figcaption></figure> <figure><img src="/files/GvAw6vMa09MhZ6Bo6iDe" alt=""><figcaption></figcaption></figure></div>

大約經過這些一系列的安裝證書後, 就可以進行攔截封包的主要工作了。

### 夜神模擬器相關設定

<div><figure><img src="/files/YnwugZHtNNKqlpm2vfKJ" alt=""><figcaption></figcaption></figure> <figure><img src="/files/VeNhq7Pdzk8q5MhogWWl" alt=""><figcaption></figcaption></figure> <figure><img src="/files/CCRp1SSiFfynjLKGkUqs" alt=""><figcaption></figcaption></figure> <figure><img src="/files/BeFfWvelQ6II8jj08Frh" alt=""><figcaption></figcaption></figure> <figure><img src="/files/E0rGlHCX9DO9qhReaZ5c" alt=""><figcaption></figcaption></figure> <figure><img src="/files/msvojUH2pvAeNZhq1E8e" alt=""><figcaption></figcaption></figure> <figure><img src="/files/9Cl8yWkteRfH8A5AiTpA" alt=""><figcaption></figcaption></figure> <figure><img src="/files/egXnLRorcOaEOi33M6dF" alt="" width="416"><figcaption></figcaption></figure> <figure><img src="/files/63GpWfe0jAeWKvpazL19" alt=""><figcaption></figcaption></figure> <figure><img src="/files/GCl17J6U4VeTewoHOs9e" alt=""><figcaption></figcaption></figure> <figure><img src="/files/VkcdpZrAKxdhvxpp82ay" alt=""><figcaption></figcaption></figure> <figure><img src="/files/Ka4vTOYeQVEbvUwUUCll" alt=""><figcaption></figcaption></figure> <figure><img src="/files/y0YN53udJrUnDeDom0us" alt=""><figcaption></figcaption></figure> <figure><img src="/files/LceUS10p5CqgVxlgtF5s" alt=""><figcaption></figcaption></figure></div>

Android 因為安全性的關係, 以前只要到上一個步驟就可以完成封包攔截，但現在沒辦法，還需要將證書安裝模擬器裡面，Https才有辦法正常攔截及分析封包內容。

#### 附上之前調整的筆記

```
nox 模擬器 & charles 通關紀錄

1.下載Charles程式
2.下載夜神模擬器 or genymotion(下載你可以安裝apk的模擬器,並且有修改proxy功能的既可)
3.確認你的android 版本(7+ 會有不一樣的操作)
4.Charles proxy & SSL proxy setting(install CA 證書, 並下載下來)
	1.三個install CA 都做
	2.APP 端 開啟網址觸發下載>> (http://chls.pro/ssl) 本機開啟網址也會觸發下載證書.(記得把proxy開啟 SSL功能才有作用)
	3.APP 安裝證書.想辦法通過系統就可以, 照著按.
	4.APP可到路徑>> 設定 > 安全性與位置資訊 > 加密和憑證 > 信任的憑證 使用者Tab 找到 charles 的證書
5.模擬器開啟Root權限(夜神為範例)
6.使用openssl指令查看 hash值(指令>> openssl x509 -subject_hash_old -in <Certificate_File> )
	本機沒安裝openssl 可以利用在線工具 >> openssl 線上工具: https://www.cryptool.org/en/cto/openssl
7.備份一份下載下來的證書, 修改檔名 android檔案格式>> [hash值].0

準備將改名後的證書上傳至android系統裡面 快結束了~

8.找到 夜神模擬器檔案目錄 /bin 開啟cmd 
9.準備執行adb 指令 (詳細指令可自行餵關鍵字查詳細說明)
	將證書導入android system 指令以下四個指令:
		9-1. adb devices
		9-2. adb root
		9-3. adb remount
		9-4. adb push C:\Users\caster.hsu\Downloads\(你的hash檔案)  /system/etc/security/cacerts/
			會出現success 訊息, 沒有則將錯誤訊息餵谷歌大神或chatGPT 都會找到答案.

	指令簡單說明:
		1.取得目前連線裝置清單>> adb devices 
		2.取得root權限(前提要線將模擬器開啟root模式)>> adb root
		3.將 '/system' 部分置於可寫入的模式，默認情況下 '/system' 部分是只讀模式的>> adb remount
		4.將檔案丟到手機裡>> adb push C:\Users\caster.hsu\Downloads\(你的hash檔案)  /system/etc/security/cacerts/
10.進模擬器查詢證書是否上傳成功
	路徑>> 設定 > 安全性與位置資訊 > 加密和憑證 > 信任的憑證 > (查看系統及使用者是否已添加成功CA證書)

排查參考網站:
	https://blog.csdn.net/qq_29022265/article/details/124453836
	https://zhuanlan.zhihu.com/p/565327085
	IOS >> https://ithelp.ithome.com.tw/articles/10307882?sc=iThelpR
	亂碼設定 >> https://blog.csdn.net/u014722022/article/details/103701480

openssl 線上工具: https://www.cryptool.org/en/cto/openssl
device info app: https://play.google.com/store/apps/details?id=com.ytheekshana.deviceinfo&hl=en_US&pli=1
可以去找現成的APK 直接丟到模擬器
```

### 結果

完成安裝證書及模擬器相關證書安裝設定後，你就可以開心的抓取封包了。

<figure><img src="/files/kHPVn7mzMkkleizb4lvI" alt=""><figcaption></figcaption></figure>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xu-min-chang.gitbook.io/caster-develop-note/java/util-gong-ju/charles-ying-yong.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
