您現在的位置是:首頁 > 單機遊戲首頁單機遊戲

Android 7.0+使用VirtualXposed+Charles進行抓包

簡介VirtualXposed+TrustMeAlready實現原理簡單的說,VXP相當於手機上的虛擬機器,在手機原有的系統上建立一塊虛擬空間,類似沙盒般的效果,而透過TrustMeAlready外掛,便可HOOK到 APK 中所有用於校驗 S

怎麼用charles抓包

前言

最近在對一個app進行測試的時候,嘗試抓取資料包,發現以前的使用方法失效了,原因是隨著安卓版本的提高,對證書的限制越發嚴格,而我身邊的老機子放在學,不在身邊,沒得辦法,只好研究一下怎麼繞過這種限制。

經過一方查詢,終於發現了一個相對比較簡單的辦法,這裡就開一篇文章,記錄一下。

過程

首先下載所需要的工具:

● Charles——

https://www。charlesproxy。com/download/

● Charles-Crack(有能力的同學請支援正版)——

https://github。com/8enet/Charles-Crack

● VirtualXposed——

https://github。com/android-hacker/VirtualXposed/releases

● TrustMeAlready——

https://github。com/ViRb3/TrustMeAlready/releases

PC端

PC端下載並安裝好之後,執行Charles。

依次點選選單欄的:Proxy→Proxy Settings,並按如下進行勾選。

Android 7.0+使用VirtualXposed+Charles進行抓包

接著點選選單欄:Proxy→SSL Proxying Settings

按照下圖進行配置:

Android 7.0+使用VirtualXposed+Charles進行抓包

若事先確定要抓取的Host和Port資訊,可自行進行更改。

接著點選Proxy→Windows Proxy (注:不同版本名稱不同),將不再抓取本地流量。

然後點選Help→SSL Proxying→Install Charles Root Certificate on a Mobile Device or Remote Browser,將證書掛載到chls。pro/ssl這個地址上。

手機端用瀏覽器開啟上述地址,將證書下載到本地。這步也可以選擇點選選單欄:Help→SSL Proxying→Save Charles Root Certificate。。。,來將證書下載到PC,透過資料線、QQ等方法傳到手機。

手機端

首先需要把手機與電腦連線到同一個網路內。

開啟WLAN,選擇對應的WIFI,進行代理配置。如下圖所示:

Android 7.0+使用VirtualXposed+Charles進行抓包

主機名為PC端的內網IP,埠為配置Charles時Proxy Settings配置中的Http Proxy裡的Port內容。

PC端內容不清楚的同學可以開啟終端執行如下命令:

● Windows: ipconfig

● Linux: ifconfig

● Mac: ifconfig

成功代理上之後,手機端的流量都會經過PC端的Charles。如果是第一次配置,則Charles會彈出一個視窗,提示有新的連線,點選Allow按鈕。

其次需要將電腦端Charles的證書給安裝上。

若在PC端選擇的是Install Charles Root Certificate on a Mobile Device or Remote Browse,則先需要透過手機瀏覽器訪問chls。pro/ssl這個網址獲得證書檔案。

這裡我使用的手機為小米8 Lite,不同的手機品牌/型號安裝證書的方法可能有所不同,具體可透過搜尋引擎來獲得安裝的方法。

依次點選:設定→更多設定→系統安全→加密與憑據→從SD卡安裝,接著在檔案瀏覽器中選擇你下載好的證書。

然後給證書憑據起個名字,可隨意填寫,憑據用途選擇VPN和應用。

安裝完畢後依次點選:信任的憑證→使用者,即可檢視到剛剛新增進來的Charles證書——XK72 Ltd。

以往我們只需要執行到這裡,便可以成功抓取到資料包。不過由於Android的版本更新,對使用者自身新增的證書進行了限制,導致我們直接地無法抓取的HTTPS資料包,在Charles裡會發現HTTPS的流量都顯示Unknown。

Android 7.0+使用VirtualXposed+Charles進行抓包

這裡我選擇的辦法是用VirtualXposed工具進行繞過,如果你不想使用這個方法,也可以考慮透過將手機進行Root處理,並將Charles的證書新增到系統級的證書中,不過這並不在本文討論的範疇。

手機下載好VirtualXposed和TrustMeAlready兩個apk檔案,安裝VirtualXposed。apk之後執行。

在VirtualXposed中,先進入設定頁面,點選新增應用,選擇你想抓取流量的應用,以及TrustMeAlready。apk檔案進行安裝。注意:由於TrustMeAlready。apk未安裝,需要點選+號按鈕,在對應的目錄選擇apk檔案即可。

然後再回到設定頁面,點選模組管理,可以看到我們剛剛新增的TrustMeAlready便在其中,點選右邊的框框進行勾選,接著回到設定頁面,在最下方點選重啟、確定。

到這裡我們便已經完成了全部的操作,之後你可以在VirtualXposed框架內開啟任意的app都可以成功取到HTTPS流量。

Android 7.0+使用VirtualXposed+Charles進行抓包

關於Charles的使用方法,本文不再贅述,網路上已有許多教程,稍微花點時間搜尋即可。

分析

Android7.0+為何無法直接擷取HTTPS流量

在Android開發者平臺文件,我們可以查到這麼一段話:

預設情況下,來自所有應用的安全連線(使用 TLS 和 HTTPS 之類的協議)均信任預裝的系統 CA,而面向 Android 6。0(API 級別 23)及更低版本的應用預設情況下還會信任使用者新增的 CA 儲存區。應用可以使用 base-config(應用範圍的自定義)或 domain-config(網域範圍的自定義)自定義自己的連線。

自定義可信 CA|Android Developer

以上說明了安卓6。0以上的版本,在預設情況下應用是不會相信使用者新增的CA證書,導致我們使用老方法無法完整地獲取到應用發出的HTTPS資料。

VirtualXposed+TrustMeAlready實現原理

簡單的說,VXP相當於手機上的虛擬機器,在手機原有的系統上建立一塊虛擬空間,類似沙盒般的效果,而透過TrustMeAlready外掛,便可HOOK到 APK 中所有用於校驗 SSL 證書的 API (詳情可以點選參考裡的《JustTrustMe原理分析》),從而繞過證書校驗,故此達到https抓包的效果。

一、什麼是Virtual Xposed?

Xposed

眾所周知Xposed是來自國外XDA論壇的rovo89開發的一款開源的安卓系統框架。

它是一款特殊的安卓App,其主要功能是提供一個新的應用平臺,玩家們安裝Xposed框架後,就能夠透過Xposed框架搭建起的平臺安裝更多系統級的應用,實現諸多神奇的功能。

Xposed框架的原理是修改系統檔案,替換了/system/bin/app_process可執行檔案,在啟動Zygote時載入額外的jar檔案(/data/data/de。robv。android。xposed。installer/bin/XposedBridge。jar),並執行一些初始化操作(執行XposedBridge的main方法)。然後我們就可以在這個Zygote上下文中進行某些hook操作。

Xposed真正強大的是它可以hook呼叫的方法。當你反編譯修改apk時,你可以在裡面插入xposed的命令,於是你就可以在方法呼叫前後注入自己的程式碼。

Github開源地址:

https://github。com/rovo89/Xposed

由於Xposed最大的弊端在於裝置需要root,並且編寫外掛模組後需要重啟手機(當然也有辦法可以不用重啟),所以有了VirtualApp。

VirtualApp

VirtualApp是一個App虛擬化引擎(簡稱VA)。

VirtualApp在你的App內建立一個虛擬空間(構造了一個虛擬的systemserver),你可以在虛擬空間內任意的安裝、啟動和解除安裝APK,這一切都與外部隔離,如同一個沙盒。

執行在VA中的APK無需在外部安裝,即VA支援免安裝執行APK。

熟悉android系統開機流程的應該知道各services是由system server啟動一系列的系統核心服務(AMS,WMS,PMS等等)ViratualApp就是構建了一個虛擬system_process程序,這裡面也有一系列的核心服務。

VirtualApp主要技術用到了反射和動態代理來實現的

Github開源地址:

https://github。com/asLody/VirtualApp

VirtualXposed

VirtualXposed就是基於VirtualApp和epic 在非ROOT環境下執行Xposed模組的實現(支援5。0~8。1)。

Github開源地址:

https://github。com/android-hacker/VirtualXposed

HTTPS抓包為何需要安裝抓包工具的CA證書

為了弄清楚這個問題,我們首先得清楚SSL/TLS加密的原理。

通常來說,SSL與TLS都是非對稱加密的,有一個公鑰與私鑰。公鑰是公開的,私鑰是私密的,存在於服務端。伺服器返回的內容會被私鑰加密,客戶端需要使用公鑰進行解密。同樣的,使用者端的資料便有公鑰加密,私鑰來解密。

而我們都知道,使用了SSL之後我們便可以保護我們的站點免受中間人攻擊。那又何為中間人攻擊呢?

舉個例子,使用者A要使用電腦訪問網站http://example。com,而這臺電腦已被攻擊者B攻陷,那麼攻擊者B可透過修改A電腦上的hosts檔案,將example。com的解析指向B自己的伺服器,這樣A使用者就在”不知情“的情況下中了招。而如果該網站使用了SSL/TLS加密時,使用者A在訪問https://example。com的時候,需要向伺服器請求公鑰的內容,又因為公鑰是放在CA證書裡的,且CA證書通常是由相關的權威CA機構(權威性由微軟等作業系統巨頭決定)才能釋出,類似我們的民政局才能釋出身份證。這使得攻擊者無法偽造CA證書,因為客戶端在收到CA證書之後會根據不同的權威CA機構進行相應的驗證,而若頒發該證書的機構不夠權威(這使得權威機構也不會隨意頒發CA證書,以免自身的權威性被取消),是不會被系統所信任的。這一連串的操作,使得使用了SSL/TLS的網站可以不受中間人攻擊的影響。

OK迴歸正題,那這HTTPS抓包與中間人攻擊有何關係呢?其實這兩者的原理都是一樣的,只不過攻擊者的角色變成了抓包工具。

So,這次的問題就變成了中間人攻擊如何在HTTPS通訊中生效?

我們注意到,中間人攻擊的最大難點就在於CA證書的權威性,而我們在沒有域名解析權的情況下是不能去向權威CA機構申請證書的。那麼既然如此,為何我們不考慮自己“開”一家權威機構呢,這樣我們生成的證書不就會被信任了嘛。

這時候,就得需要安裝我們抓包工具的CA證書了,這個證書與域名所有者向權威機構申請的證書不同,他是根證書。

因為域名的CA證書的驗證過程也是非對稱加密驗證,也就說,CA證書的驗證是由根證書裡的公鑰來解密驗證的。通常作業系統裡已經預設信任了一批權威機構的根證書。

所以,當我們把我們自己的根證書新增到作業系統中時,相當於我們自己“開”了一家權威CA機構,這樣便可以解決了之前的難題。

借一張網圖:

Android 7.0+使用VirtualXposed+Charles進行抓包

源自:圖解 HTTPS:Charles 捕獲 HTTPS 的原理

結語

別看上邊方法好像挺簡單的,實際操作起來卻挺繁瑣,網路上的方法大多抄來吵去且時效性很差,導致在操作過程中也走了許多彎路,許多東西還是自己實驗之後才知道。看似簡單的東西,其實寫起來可學習的東西還是很多的,以前自己在學習的時候沒有注意的點,現在看起來也是可以細細研究的。不驕不躁,Stay Hungry, Stay Foolish。

參考

● 透過 HTTPS 和 SSL 確保安全|Android開發者文件

https://developer。android。com/training/articles/security-ssl

● VirtualXposed外掛開發-Xposed hook 之入門案例

http://jackzhang。info/2018/04/09/VirtualXposed/

● JustTrustMe原理分析

https://bbs。pediy。com/thread-214012。htm

● 圖解 HTTPS:Charles 捕獲 HTTPS 的原理

https://github。com/youngwind/blog/issues/108

Android 7.0+使用VirtualXposed+Charles進行抓包

Top