1. 程式人生 > >Android中Xposed框架篇---利用Xposed框架實現攔截系統方法

Android中Xposed框架篇---利用Xposed框架實現攔截系統方法

一、前言

關於Xposed框架相信大家應該不陌生了,他是Android中Hook技術的一個著名的框架,還有一個框架是CydiaSubstrate,但是這個框架是收費的,而且個人覺得不怎麼好用,而Xposed框架是免費的而且還是開源的,網上也有很多文章介紹了Xposed框架的原理實現,不瞭解的同學可以自行查閱即可,本文主要介紹如何通過這個框架來進行系統方法的攔截功能,比如我們開發過程中,對於一些測試環境很難模擬,特別是測試同學有時候像隨機改變裝置的imei,mcc等資訊用來模擬不同測試場景,這時候如果可以去修改系統的這個值的話對於測試來說就非常方便了,其實這些在網上已經有很多類似的小工具了,下面就來詳細的講解如何使用這個框架。

二、需要解決的前提問題

在介紹如何使用這個框架之前,咋們得先解決這幾個問題:

第一個問題:首先我們知道這個框架的核心點就是系統程序注入技術,那麼如果要注入系統程序,就必須要root許可權,所以你如果想用這個框架的話就必須得現有一個root的裝置。

第二個問題:還有一個問題就是這個框架的適配問題,不是所有的裝置所有的系統都支援這個框架的使用的,本人在實驗的過程中就遇到了小米3+MIUI7就操作失敗了,結果重新刷了一個Android原生4.4系統才成功的。

第三個問題:最後一個問題就是Xposed框架本身的版本問題,他針對不同系統也釋出了多個版本,所以你得針對於自己的裝置系統安裝正確的Xposed版本。

解決了這三個問題咋們才能成功的安裝Xposed框架的,而在這個過程中我們會發現遇到這兩個問題是最多的:

第一個問題是不相容問題


第二個問題是提示安裝框架問題


這兩個問題都是比較普遍和蛋疼的,因為底下的安裝按鈕點選不了,後續沒辦法操作了,所以很無助的,我也是遇到了這兩個問題,最後也是沒有找到合適的答案,所以一激動就刷了一個原生的Android4.4系統,

三、環境搭建

上面就提到了現階段這個框架使用會遇到的一些問題,下面在來看一下具體的環境搭建,如果上面的問題都解決了,咋們在開啟應用點選安裝框架:


這裡還是提示未啟用,點選進入:


這時候看到了正常了,可以點選安裝了,直接點選安裝即可:


這裡是需要root授權的,點選允許,安裝成功之後也會提示你重啟生效的,因為要注入系統程序,必須重啟才有效果的。

到這裡我們就成功的安裝了Xposed框架了,在這個過程中肯定有同學會遇到問題,而最多的問題就是上面提到的那兩個問題,關於解決辦法我也沒有找到。我解決的最根本辦法就是刷機了,所以本文我操作的環境是:

小米3移動版+Android原生4.4系統+Xposed_v33版本

四、編寫模組功能

環境搭建好了,下面就開始操作了,上面安裝的那個工具其實是一個模組管理器,我們如果想做一些hook操作還得自己編寫模組也就是應用程式,然後把這個模組安裝到裝置中,這個工具就可以檢測出來了,會提示你載入這模組然後在重啟裝置,模組功能就有效果了。那麼下面來看一下如何編寫一個Xposed模組呢?

第一步:新建一個Android專案,匯入Xposed工具包


這裡一定要注意,不能使用libs資料夾而是lib資料夾,如果這裡使用了libs資料夾的話,在安裝成功模組之後重啟會發現Hook是失敗的,通過列印tag為xposed的日誌資訊會發現這樣的錯誤:

java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation

這個錯誤我們在以前開發外掛的時候遇到過,主要是因為把介面包含到了外掛工程中了,那麼這裡我們可以猜想錯誤問題也是這個xposed工具導致的。那麼我們只需要把libs資料夾改成lib,然後在add buildpath一下即可。

注意:

在Eclipse中,如果把工具包放到libs檔案中,預設是加入到編譯路徑中的,同時在編譯出來的程式中也是包含了這個工具包中的所有類,而對於其他非libs資料夾,我們新增工具包之後在add buildpath之後只是做到了工程引用工具包的功能,而最終並不會把這個工具包包含到程式中的。

第二步:編寫模組程式碼

模組程式碼編寫還是比較簡單的,我們只要新建一個實現IXposedHookLoadPackage介面的類,然後在handleLoadPackage回撥方法中進行攔截操作即可,而具體的攔截操作是藉助XposedHelpers.findAndHookMethod方法和XposedBridge.hookMethod方法實現的,這兩個方法也是比較簡單的,從引數含義可以看到,主要是Hook的類名和方法名,然後還有一個就是攔截的回撥方法,一般是攔截之前做什麼的一個beforeHookedMethod方法和攔截之後做什麼的一個afterHookedMethod方法。


對於IXposedHookLoadPackage這個介面和回撥方法,我們可以知道,應該是攔截系統中所有應用的執行資訊,這裡傳遞回來的一個LoadPackageParam引數型別就是包括了Hook應用的具體資訊,我們可以列印應用的包名就可以看到效果了。

注意:

如果你想Hook一個類的具體方法,那麼就必須要清楚的瞭解到這個方法的相信資訊,比如引數型別和個數,返回型別等。因為在攔截的過程中必須要對這個方法進行分析,比如得到方法引數來進行具體引數修改,返回值資訊來進行返回值修改,這裡看到了獲取imei值的方法是一個無引數的返回字串型別的方法,那麼如果要攔截他的返回值,就需要修改他的返回值使用setResult方法即可。所以從這裡可以看到不管是你hook系統的方法,還是日後去hook第三方應用的具體類方法,第一步都得了解到你hook物件的具體資訊,關於系統方法咋們可以通過檢視原始碼來得到資訊,而對於第三方應用的話那麼只能藉助反編譯技術了,比如修改遊戲金幣功能,你必須先反編譯遊戲知道修改金幣的類和具體方法才可行。

這裡我不僅Hook了系統的imei資訊,也簡單的Hook了系統的地理位置資訊,在Android中獲取經緯度資訊有三種方式,這裡為了演示簡單,用了GPS定位功能,一般獲取經緯度資訊的程式碼主要是兩處:

一處是初始化的時候呼叫getLastKnowLocation方法獲取最後一次系統中的地理位置資訊


還有一處就是監聽地理位置變化的回撥介面中的onLocationChanged回撥方法:


所以如果想Hook系統的地理位置資訊進行攔截,那麼就需要操作這兩處程式碼了,而他們有一個區別就是,第一處是通過返回值得到的,第二處是通過回撥方法中的引數得到的。下面來看一下具體的Hook程式碼:

Hook第一處程式碼比較簡單,直接構造一個假的Location物件然後設定返回值即可。


Hook第二處程式碼有點複雜,需要先找到新增位置監聽的方法requestLocationUpdates,然後通過反射得到這個回撥物件,找到具體的回撥方法,然後在進行操作,因為回撥方法是通過引數把Location物件傳遞回來的,所以這裡需要修改引數值。


好了,到這裡我們就編寫好了Hook系統的imei值和地理位置資訊的模組了。

第三步:新增模組入口

這一步是非常重要的,也是最容易忘記的,就是要告訴Xposed框架一個模組中Hook的入口,這裡可以看到模組的入口是Main類,所以需要在模組的assets中新增一個xposed_init檔案:


這裡的內容很簡單,就是模組入口類的全稱名稱即可:


第四步:新增模組的額外資訊

最後一步就是需要在模組的AndroidManifest.xml檔案新增額外資訊,具體包括模組的描述資訊,版本號等:


xposedmodule:代表的是Android程式作為Xposed中的一個模組,所以值為true;
xposeddescription:代表的是對本模組的功能的描述,可以自己簡單敘述下就可以了;
xposedminversion:代表的是本模組開發時用到的xposed的jar包的最低版本號,這裡是30,而我所用的xposed的jar包版本是54;

經過上面四步之後咋們就完成了模組的定義了,最後咋們為了驗證我們Hook的結果,在新建一個Activity類,在內部呼叫一下系統的獲取imei方法以及位置資訊方法,並且顯示在螢幕中:


六、執行模組

下面咋們就來執行一下模組程式,安裝到裝置之後,Xposed會提示模組未啟用:


這個XposedInstaller程式應該是通過安裝廣播,然後得到這個應用資訊分析他是否包含了Xposed模組的特殊屬性來判斷的。我們點選進行啟用:


這時候看到,啟用成功之後,會提示你再次重啟裝置才能生效,所以這裡可以看到每次如果有新的模組或者是模組程式碼有更新了,比如這樣:


都是需要重啟裝置,模組才能生效的,這一點還是有點蛋疼的和麻煩的。然後咋們重啟裝置之後,在執行我們的模組程式碼看看效果:


從這顯示結果看到了,Hook成功了,在沒有Hook之前的效果是:


這時候咋們在來看一下列印的日誌資訊:


看到了,百度地圖在獲取我們裝置的imei和位置資訊,當然這是符合正常情況的,從這裡可以看到,我們還可以利用這個技術來觀察裝置中有哪些應用在獲取裝置的一些隱私資料。

七、實際用途

本文主要是介紹了Xposed框架的基本使用以及一個簡單作用,但是在實際過程中,這個框架是非常有用的,比如在文章開頭就說到了,我們可以通過修改系統的一些資訊來幫助測試模擬複雜的測試環境,但是這個框架現在用的最廣泛的當屬破解了,這個也是我們後續講解的重點,用這個框架咋們可以進行應用的脫殼,遊戲的外掛等。

八、總結

本文是介紹Xposed的基礎篇,主要介紹了Xposed的具體使用,XposedInstaller.apk其實是一個模組載體和管理器,如果想實現具體的Hook操作,就必須自己在編寫模組程式,然後在啟用載入方可生效。後續會繼續介紹用這個框架咋們來進行其他一些操作,比如應用的脫殼,遊戲外掛編寫,系統資訊篡改等知識,期待大家多多期盼和點贊啦啦!!

《Android應用安全防護和逆向分析》

點選立即購買:京東  天貓

更多內容:點選這裡

關注微信公眾號,最新技術乾貨實時推送