欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

頂象技術發表於2022-09-21

矛盾的同一性與鬥爭性原理幾乎適用於所有攻防對抗。

上期,我們在《論裝置指紋的唯一性:始於硬體ID,終於雲端互動》一文中曾介紹了硬體ID 作為裝置指紋的基礎屬性的發展演變——即當硬體屬性不再作為裝置指紋的唯一屬性時,為了保證裝置指紋的唯一性需要在硬體ID的基礎上增加更多識別標準以及動態可變的演算法,事實上這就是攻防對抗的典型例子。

再舉個例子。例如在裝置指紋的攻防對抗中,黑灰產要想繞過裝置指紋進行攻擊,就必須“偽裝”自己。此時,黑灰產的繞過思路主要有以下兩種:

1、如何把一個裝置變成多個裝置:

比如,在刷單場景下,讓App 反覆認為這是一個新手機,從而重複領取新人紅包;

2、如何把一個裝置變成另一個裝置:

比如,在身份認證的場景下,把攻擊者的手機偽造受害者的手機,讓App登入受害者的賬戶,竊取資金、使用者資訊等。

但有矛就有盾,黑灰產的繞過思路自然也逃不過安全研究者的“法眼”。

今天,我們就以Hook的攻防對抗為主題,講講攻防對抗的思路。

初識Hook 技術

首先,簡單認識下Hook 技術。

Hook技術是一門廣泛用於計算機攻防對抗的技術。它可以監視系統或者程式中的各種事件訊息,截獲發往目標視窗的訊息進行處理。

我們可以簡單的把使用Hook技術的人比作釣魚人,而Hook技術就像他的漁具,系統中不斷傳遞的事件就像一條條游魚,釣魚人透過Hook技術將他想要的目標事件釣上(Hook技術一般是有指向性的),然後就可以對事件進行修改,再讓其正常執行,達到技術人員的目的。Hook技術常用於熱補丁上線、API劫持、軟體破解等技術操作。

比如我們常見的滑鼠和鍵盤,如果你的電腦被Hook,那麼也就意味著你的任何操作都在對方的掌握中。

Hook技術不但適用於x86系統,也適用於基於簡單指令集的移動平臺系統,比如手機等裝置。其中,針對移動裝置的Hook技術主要以手機為主。

對於Android的Hook框架,主要分為三類,一類是針對Native層,即系統層的Hook框架,使用PLT/GOT Hook或inline-Hook的框架,如bhook、xhook、yahfa等,一類是針對Java層的Hook框架,如Xposed,還有一類是比較特殊的Hook框架——Frida,它是針對全平臺Hook而設計的框架,適用於x86\x86_64\arm\arm64架構的系統,在iOS端上的Hook主要透過Frida框架進行技術實現,而Frida在Android上的Hook技術實現也有不少的受眾,但主要仍以Xposed類框架為主,主要原因就是Xposed在Andorid上的穩定性更好,並且特徵更容易隱藏。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

接下來,我們就以Xposed以及以Xposed為核心迭代的另外兩種Hook框架(Edxposed、Lsposed)展開來講講如何利用Hook進行攻防對抗。

未知其攻,焉知何守——利用Hook 技術怎樣做攻擊?

隨著安卓版本的迭代更新,Xposed框架也隨之迭代出了新的Hook 框架。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

目前安卓平臺的主要Hook框架以Lsposed為主,我們就以Lsposed對Android應用進行Hook,看下如何利用Hook 進行攻擊。

首先,正常情況下使用Lsposed需要幾個前置條件:

  1. 一臺能夠解除BootLoaderLock的手機;
  2. 準備好自己手機系統的boot.img;
  3. 準備好Lsposed模組安裝包與Magisk安裝包;
  4. 一臺裝好ADB工具的電腦。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

上述條件準備完成後,準備安裝和使用Lsposed。

安裝完成後,我們就可以利用 Hook 進行攻擊。

具體過程如下:

1、對目標App 進行反編譯分析。

要想讓魚上鉤就必須知道魚的屬性。所以成功安裝Hook 的第一步就是對目標App進行反編譯分析。這裡我們使用jadx-gui對App 進行反編譯分析。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗actf反編譯

利用jadx-gui可以看到反編譯出的原始碼。如下圖所示,透過對該App反編譯我們得出了其想要傳遞Flag 的動作,但要注意的是,這個資訊是一個不確定的值,我們需要進一步驗證。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗actf執行結果

透過驗證可知,無論你點選按鈕多少次,這裡都會只顯示“你還真信點選就有flag啊?”這條資訊。那麼,接下來,就是我們要自己掌握自己“抓魚”的過程。

2、編寫程式碼外掛,攻擊目標App 的“弱點”

此時,我們需要編寫一個Hook外掛,修改其中的一些引數,然後可以直接獲取其已經算好的MD5值(MD5是一種加密演算法。又名:不可逆加密演算法。由於加密演算法太強大,專門用來加密密碼。MD5的值就是對任何一個檔案的明文密碼進行加密後的密碼,又稱“數字指紋”,任何人對檔案做了任何改動,其MD5值也就是對應的“數字指紋”都會發生變化。)是什麼。

首先我們可以使用Android Studio或者已經裝有Android外掛的Idea,開啟一個新的專案,選擇一個沒有介面的工程:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗新建hook工程

需要注意的是,在寫Xposed Hook模組時,為了讓Xposed框架識別,需要在專案的assets目錄下(如果沒有,可以直接新建assets目錄)建立一個叫做xposed_init的檔案,並且裡面的內容為你的包名+你的主類名:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗包名與主類名

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗xposed_init配置

其次,開啟AndroidManifest.XML檔案,在其中填入如下內容:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗AndroidManifest.xml專案位置

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗AndroidManifest.xml配置

配置完AndroidManifest.xml後,我們就可以開始編寫Xposed Hook模組了。具體如圖:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗build.gradle在專案中的位置

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗build.gradle的配置

在Xposed中,Hook的方法有兩種,一種是before,另一種是after,其實現的原理是透過art的slot實現的,可以在原先被呼叫的方法前後加入兩個插槽,然後去執行我們的hook,可以形象的理解為下圖:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

Hook前後方法呼叫的變化

由圖可知,目標App主要是有兩部分組成,第一個是MainActivity主類,還有兩個類中的方法,一個是onCreate方法,這是MainActivity初始化的一個方法,第二個就是getFlag方法,這個方法也就是我們的目標,透過Hook這個方法,我們可以得知代表flag的MD5值是什麼。

我們的思路就是要先Hook住getFlag這個方法,假設我們Hook住了getFlag這個方法,我們最關心的自然是傳入的字串值,具體的Xposed模組程式碼如下:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗Hook模組程式碼

透過這種方式我們就可以得到我們想要的MD5值,進而修改引數,實現對該App的控制。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗

如何對抗Hook攻擊?

正所謂有矛就有盾。針對Hook攻擊,也衍生出了防禦的方式。

由於Xposed在Hook的時會呼叫特定的ClassLoader,那麼就可以透過再次載入ClassLoader的方式來檢測Xposed框架,例子如下:

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗查詢ClassLoader

1、利用系統的API getInstancesOfClassesMethod去獲得ClassLoader,透過這種方式只能獲得一次CL,我們就可以遍歷App內所使用的Classloader。

2、將所有的CL遍歷後,我們就可以透過它的成員快取(目標Hook方法快取)來檢測它的Hook。

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗獲得Hook的成員

欲知己之所防,先知彼之所攻——論Hook 技術的攻防對抗Hook成員

這種檢測方式依賴Android系統提供的VMDebug.getInstancesOfClassesMethod()函式,而這個函式只在Android 9-11上存在,限制方案的應用範圍。並且,作為一種反檢測方法,這個關鍵函式也可以被Xposed進行hook,只需控制此函式的返回即可完成反檢測。

除了ClassLoader方式對Xposed Hook的對抗,也還有其他各類較傳統的對抗方式,但也都有相應的反對抗方案,而頂象產品具備獨有的對抗方式,並且追加了反檢測、反對抗技術,可以更準確地識別Hook風險。

當然,在更深層面,我們也可以利用Hook技術將傳統的Web攻擊技術帶入到移動端中,在移動端中進行攻防演練,補全作為紅隊的技能樹,也可以針對Hook技術與攻擊者進行對抗,保障自身的App安全。

整體來看,攻防對抗是一個持久戰,需要安全廠商們持續不斷的努力。

在攻防對抗方面,頂象基於多年來的技術積累,目前已實現對安卓、iOS、H5、小程式等全方位的安全保護,有效防禦除錯、注入、多開、記憶體Dump、模擬器、二次打包和日誌洩露等攻擊威脅。獨有“蜜罐”功能、保護Android 16種資料和檔案,提供7種加密形式,率先支援對iOS免原始碼加固。


相關文章