天天看點

Android端Charles抓包

目錄介紹

  • 01.下載下傳安裝
  • 02.抓包代理設定
  • 03.抓包Https操作
  • 04.抓包原理介紹
  • 05.抓包資料介紹
  • 06.常見問題總結
  • 07.Android攔截抓包

  • 下載下傳位址(下載下傳對應的平台軟體即可)
  • 下載下傳破解檔案
    • https://assets.examplecode.cn/file/charles.jar
    • 打開Finder,在應用程式中選擇Charles并右鍵選擇顯示包内容
    • 顯示包内容後在Content/Java目錄下将破解檔案複制過來替換掉原檔案即可
    • 如果打開Charles時提示:程式已損壞,打不開。您應該将它移到廢紙簍。此時需要在終端中執行以下指令即可:sudo spctl --master-disable

  • charles代理設定
    • 可以設定抓包資料類型,包括http與socket資料。可以根據需要在proxies欄下勾選。這裡簡單操作進行設定,Proxy ---> Proxy Settings預設端口是8888,根據實際情況可修改。
      • Android端Charles抓包
  • Android手機代理設定
    • 首先擷取電腦ip位址
      • 第一種方式:檢視本機IP位址:Help ---> Local IP Addresses
        • Android端Charles抓包
      • 第二種方式:指令行方式,輸入ifconfig即可
        • Android端Charles抓包
    • 然後打開手機設定代理
      • 注意:手機需要和電腦使用同一個Wi-Fi網絡,這是前提!!!
      • 操作步驟:打開WiFi清單 ---> 長按連接配接的WiFi修改網絡設定代理 --- > 設定代理資訊
        • Android端Charles抓包
  • 最後抓包如下
    • 抓包資料如下所示
      • Android端Charles抓包

  • 需要做哪些操作
    • 1.電腦上需要安裝證書
    • 2.手機上需要安裝證書
    • 3.Android項目代碼設定相容
    • 第一步安裝證書:help ---> SSl Proxying ---> install charles root certificate ---> 安裝證書
    • 第二步設定SSL屬性:Proxy ---> SSL Proxy Settings ---> 然後add操作(設定port為443)。如下所示
      • Android端Charles抓包
    • 然後抓包試一下,會發現Android7.0手機之前可以抓包,但是Android7.0之後是無法抓包的
      • 報錯資訊:用戶端SSL握手失敗:處理證書時出現未知問題(certificate_unknown)
      • Android端Charles抓包
    • 如何解決在Android7.0之後也可以抓包https資訊,接着往下看。
    • 第一步下載下傳證書
      • 打開浏覽器,輸入:chls.pro/ssl,就會自己下載下傳到手機上,這裡需要記住下載下傳完成儲存到本地的路徑。
    • 第二步安裝證書
      • 設定 ---> 更多設定 ---> 系統安全 ---> 加密與憑據 ---> 從SD卡安裝,選擇之前儲存證書的路徑。
      • 注意,有的手機是直接點選下載下傳的檔案即可安裝……
    • 安裝操作如下圖所示
      • Android端Charles抓包
    • 添加安全配置檔案。如下所示:
    • java.security.cert.CertPathValidatorException: Trust anchor for certification path not found 這個異常,解決方案如下所示:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true">
            <trust-anchors>
                <certificates
                    overridePins="true"
                    src="system" />
                <certificates
                    overridePins="true"
                    src="user" />
            </trust-anchors>
        </base-config>
    </network-security-config>
    
    //清單檔案配置
    <application
        android:networkSecurityConfig="@xml/network_security_config_debug">           
    • Android 7.0及以上為何不能輕易抓取到Https請求的明文資料?
      • 在Android 7.0(API 24 ) ,有一個名為“Network Security Configuration”的新安全功能。這個新功能的目标是允許開發人員在不修改應用程式代碼的情況下自定義他們的網絡安全設定。如果應用程式運作的系統版本高于或等于24,并且targetSdkVersion>=24,則隻有系統(system)證書才會被信任。是以使用者(user)導入的Charles根證書是不被信任的。
  • 抓https最後結果如下所示
    • Android端Charles抓包
    • Android端Charles抓包

  • 1.抓包的原理:
    • 代理。用戶端請求->經過代理->到達服務端 服務端傳回->經過代理->到達用戶端
  • 2.任何Https的 app 都能抓的到嗎?
    • 7.0以下是可以的,隻要手機裡安裝對應CA憑證,比如用charles抓包,手機要安裝charles提供的證書就行。
    • Android 7.0 之後,Google 推出更加嚴格的安全機制,應用預設不信任使用者證書(手機裡自己安裝證書),自己的app可以通過配置解決,但是抓其它app的https請求就行不通。
  • 3.如何避免抓包
    • 1.基于抓包原理的基礎上,直接使用okhtttp禁止代理,就可以了 builder.proxy(Proxy.NO_PROXY);經過測試,可以避免抓包
    • 2.直接使用加密協定,全是字段亂碼, 把域名換裝IP。這樣基本别人很難抓到,像混淆一樣
  • 4.charles抓包原理圖
    • Android端Charles抓包
  • 5.大概步驟流程
    • 第一步,用戶端向伺服器發起HTTPS請求,charles截獲用戶端發送給伺服器的HTTPS請求,charles僞裝成用戶端向伺服器發送請求進行握手 。
    • 第二步,伺服器發回相應,charles擷取到伺服器的CA憑證,用根證書(這裡的根證書是CA認證中心給自己頒發的證書)公鑰進行解密,驗證伺服器資料簽名,擷取到伺服器CA憑證公鑰。然後charles僞造自己的CA憑證(這裡的CA憑證,也是根證書,隻不過是charles僞造的根證書),冒充伺服器證書傳遞給用戶端浏覽器。
    • 第三步,與普通過程中用戶端的操作相同,用戶端根據傳回的資料進行證書校驗、生成密碼Pre_master、用charles僞造的證書公鑰加密,并生成HTTPS通信用的對稱密鑰enc_key。
    • 第四步,用戶端将重要資訊傳遞給伺服器,又被charles截獲。charles将截獲的密文用自己僞造證書的私鑰解開,獲得并計算得到HTTPS通信用的對稱密鑰enc_key。charles将對稱密鑰用伺服器證書公鑰加密傳遞給伺服器。
    • 第五步,與普通過程中伺服器端的操作相同,伺服器用私鑰解開後建立信任,然後再發送加密的握手消息給用戶端。
    • 第六步,charles截獲伺服器發送的密文,用對稱密鑰解開,再用自己僞造證書的私鑰加密傳給用戶端。
    • 第七步,用戶端拿到加密資訊後,用公鑰解開,驗證HASH。握手過程正式完成,用戶端與伺服器端就這樣建立了”信任“。
    • 在之後的正常加密通信過程中,charles如何在伺服器與用戶端之間充當第三者呢?
    • 伺服器—>用戶端:charles接收到伺服器發送的密文,用對稱密鑰解開,獲得伺服器發送的明文。再次加密, 發送給用戶端。
    • 用戶端—>服務端:用戶端用對稱密鑰加密,被charles截獲後,解密獲得明文。再次加密,發送給伺服器端。由于charles一直擁有通信用對稱密鑰enc_key,是以在整個HTTPS通信過程中資訊對其透明。
  • 6.總結一下
    • HTTPS抓包的原理還是挺簡單的,簡單來說,就是Charles作為“中間人代理”,拿到了伺服器證書公鑰和HTTPS連接配接的對稱密鑰,前提是用戶端選擇信任并安裝Charles的CA憑證,否則用戶端就會“報警”并中止連接配接。這樣看來,HTTPS還是很安全的。

  • HTTP請求包的結構
    • 請求封包
      • 請求封包結構格式:
        請求行: <method> <request-URL> <version>
        頭部:   <headers>
        主體:   <entity-body>           
      • 請求封包結構示意圖:
        • Android端Charles抓包
      • 例子:
        • 請求了就會收到響應包(如果對面存在HTTP伺服器)
        POST /meme.php/home/user/login HTTP/1.1
        Host: 114.215.86.90
        Cache-Control: no-cache
        Postman-Token: bd243d6b-da03-902f-0a2c-8e9377f6f6ed
        Content-Type: application/x-www-form-urlencoded
        
        tel=13637829200&password=123456           
    • 常見的是那些
      • User-Agent

        :産生請求的浏覽器類型。
      • Accept

        :用戶端可識别的響應内容類型清單;
      • Accept-Language

        :用戶端可接受的自然語言;
      • Accept-Encoding

        :用戶端可接受的編碼壓縮格式;
      • Host

        :請求的主機名,允許多個域名同處一個IP 位址,即虛拟主機;
      • Connection

        :連接配接方式(close 或

        keep-alive

        );
      • Cookie

        :存儲于用戶端擴充字段,向同一域名的服務端發送屬于該域的cookie;
  • HTTP響應包結構
    • 響應封包
      • 響應封包結構格式:
        狀态行:  <version> <status> <reason-phrase>
        響應頭部:    <headers>
        響應主體:    <entity-body>           
      • 響應封包結構示意圖:
        • Android端Charles抓包
      • HTTP/1.1 200 OK
        Date: Sat, 02 Jan 2016 13:20:55 GMT
        Server: Apache/2.4.6 (CentOS) PHP/5.6.14
        X-Powered-By: PHP/5.6.14
        Content-Length: 78
        Keep-Alive: timeout=5, max=100    Connection: Keep-Alive
        Content-Type: application/json; charset=utf-8
        
        {"status":202,"info":"\u6b64\u7528\u6237\u4e0d\u5b58\u5728\uff01","data":null}           
    • 常見的響應頭部參數
      • Allow

        伺服器支援哪些請求方法(如GET、POST等)。
      • Content-Encoding

        文檔的編碼(Encode)方法。
      • Content-Length

        表示内容長度。隻有當浏覽器使用持久HTTP連接配接時才需要這個資料。
      • Content-Type

        表示後面的文檔屬于什麼MIME類型。
      • Server

        伺服器名字。
      • Set-Cookie

        設定和頁面關聯的Cookie。
      • ETag

        :被請求變量的實體值。ETag是一個可以與Web資源關聯的記号(MD5值)。
      • Cache-Control

        :這個字段用于指定所有緩存機制在整個請求/響應鍊中必須服從的指令。
  • 響應封包狀态碼
    • 包含了狀态碼以及原因短語,用來告知用戶端請求的結果。
    • 關于狀态碼,可以看這篇文章, http狀态碼
      | 狀态碼 | 類别 | 原因短語 |
      | :---: | :---: | :---: |
      | 1XX | Informational(資訊性狀态碼) | 接收的請求正在處理 |
      | 2XX | Success(成功狀态碼) | 請求正常處理完畢 |
      | 3XX | Redirection(重定向狀态碼) | 需要進行附加操作以完成請求 |
      | 4XX | Client Error(用戶端錯誤狀态碼) | 伺服器無法處理請求 |
      | 5XX | Server Error(伺服器錯誤狀态碼) | 伺服器處理請求出錯 |
                 

  • 1.配置好後無法打開APP
    • 在我們抓取時碰到個别APP在配置代理後無法打開,這個主要是因為該APP做了防止抓取處理,比如校驗https的證書是否合法等,這種解決方法可以通過反編譯APP,檢視源碼解決,難度較大。
  • 2.抓取到的内容為亂碼
    • 有的APP為了防止抓取,在傳回的内容上做了層加密,是以從Charles上看到的内容是亂碼。這種情況下也隻能反編譯APP,研究其加密解密算法進行解密。

Android端Charles抓包
Android端Charles抓包
Android端Charles抓包
Android端Charles抓包
  • 網絡攔截分析,主要是分析網絡流量損耗,以及request,respond過程時間。打造網絡分析工具……
  • 項目代碼位址: https://github.com/yangchong211/YCAndroidTool
  • 如果你覺得這個攔截網絡助手友善了測試,以及開發中檢視網絡資料,可以star一下……

網絡攔截庫: