Android中利用Xposed框架實現(xiàn)攔截系統(tǒng)方法
一、前言
關于Xposed框架相信大家應該不陌生了,他是Android中Hook技術的一個著名的框架,還有一個框架是CydiaSubstrate,但是這個框架是收費的,而且個人覺得不怎么好用,而Xposed框架是免費的而且還是開源的,網(wǎng)上也有很多文章介紹了Xposed框架的原理實現(xiàn),不了解的同學可以自行查閱即可,本文主要介紹如何通過這個框架來進行系統(tǒng)方法的攔截功能,比如我們開發(fā)過程中,對于一些測試環(huán)境很難模擬,特別是測試同學有時候像隨機改變設備的imei,mcc等信息用來模擬不同測試場景,這時候如果可以去修改系統(tǒng)的這個值的話對于測試來說就非常方便了,其實這些在網(wǎng)上已經(jīng)有很多類似的小工具了,下面就來詳細的講解如何使用這個框架。
二、需要解決的前提問題
在介紹如何使用這個框架之前,咋們得先解決這幾個問題:
第一個問題:首先我們知道這個框架的核心點就是系統(tǒng)進程注入技術,那么如果要注入系統(tǒng)進程,就必須要root權限,所以你如果想用這個框架的話就必須得現(xiàn)有一個root的設備。
第二個問題:還有一個問題就是這個框架的適配問題,不是所有的設備所有的系統(tǒng)都支持這個框架的使用的,本人在實驗的過程中就遇到了小米3+MIUI7就操作失敗了,結(jié)果重新刷了一個Android原生4.4系統(tǒng)才成功的。
第三個問題:最后一個問題就是Xposed框架本身的版本問題,他針對不同系統(tǒng)也發(fā)布了多個版本,所以你得針對于自己的設備系統(tǒng)安裝正確的Xposed版本。
解決了這三個問題咋們才能成功的安裝Xposed框架的,而在這個過程中我們會發(fā)現(xiàn)遇到這兩個問題是最多的:
第一個問題是不兼容問題:
第二個問題是提示安裝框架問題:
這兩個問題都是比較普遍和蛋疼的,因為底下的安裝按鈕點擊不了,后續(xù)沒辦法操作了,所以很無助的,我也是遇到了這兩個問題,最后也是沒有找到合適的答案,所以一激動就刷了一個原生的Android4.4系統(tǒng),
三、環(huán)境搭建
上面就提到了現(xiàn)階段這個框架使用會遇到的一些問題,下面在來看一下具體的環(huán)境搭建,如果上面的問題都解決了,咋們在打開應用點擊安裝框架:
這里還是提示未激活,點擊進入:
這時候看到了正常了,可以點擊安裝了,直接點擊安裝即可:
這里是需要root授權的,點擊允許,安裝成功之后也會提示你重啟生效的,因為要注入系統(tǒng)進程,必須重啟才有效果的。
到這里我們就成功的安裝了Xposed框架了,在這個過程中肯定有同學會遇到問題,而最多的問題就是上面提到的那兩個問題,關于解決辦法我也沒有找到。我解決的最根本辦法就是刷機了,所以本文我操作的環(huán)境是:
小米3移動版+Android原生4.4系統(tǒng)+Xposed_v33版本
四、編寫模塊功能
環(huán)境搭建好了,下面就開始操作了,上面安裝的那個工具其實是一個模塊管理器,我們?nèi)绻胱鲆恍﹉ook操作還得自己編寫模塊也就是應用程序,然后把這個模塊安裝到設備中,這個工具就可以檢測出來了,會提示你加載這模塊然后在重啟設備,模塊功能就有效果了。那么下面來看一下如何編寫一個Xposed模塊呢?
第一步:新建一個Android項目,導入Xposed工具包
這里一定要注意,不能使用libs文件夾而是lib文件夾,如果這里使用了libs文件夾的話,在安裝成功模塊之后重啟會發(fā)現(xiàn)Hook是失敗的,通過打印tag為xposed的日志信息會發(fā)現(xiàn)這樣的錯誤:
Java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
這個錯誤我們在以前開發(fā)插件的時候遇到過,主要是因為把接口包含到了插件工程中了,那么這里我們可以猜想錯誤問題也是這個xposed工具導致的。那么我們只需要把libs文件夾改成lib,然后在add buildpath一下即可。
注意:在Eclipse中,如果把工具包放到libs文件中,默認是加入到編譯路徑中的,同時在編譯出來的程序中也是包含了這個工具包中的所有類,而對于其他非libs文件夾,我們添加工具包之后在add buildpath之后只是做到了工程引用工具包的功能,而最終并不會把這個工具包包含到程序中的。
第二步:編寫模塊代碼
模塊代碼編寫還是比較簡單的,我們只要新建一個實現(xiàn)IXposedHookLoadPackage接口的類,然后在handleLoadPackage回調(diào)方法中進行攔截操作即可,而具體的攔截操作是借助XposedHelpers.findAndHookMethod方法和XposedBridge.hookMethod方法實現(xiàn)的,這兩個方法也是比較簡單的,從參數(shù)含義可以看到,主要是Hook的類名和方法名,然后還有一個就是攔截的回調(diào)方法,一般是攔截之前做什么的一個beforeHookedMethod方法和攔截之后做什么的一個afterHookedMethod方法。
對于IXposedHookLoadPackage這個接口和回調(diào)方法,我們可以知道,應該是攔截系統(tǒng)中所有應用的運行信息,這里傳遞回來的一個LoadPackageParam參數(shù)類型就是包括了Hook應用的具體信息,我們可以打印應用的包名就可以看到效果了。
注意:
如果你想Hook一個類的具體方法,那么就必須要清楚的了解到這個方法的相信信息,比如參數(shù)類型和個數(shù),返回類型等。因為在攔截的過程中必須要對這個方法進行分析,比如得到方法參數(shù)來進行具體參數(shù)修改,返回值信息來進行返回值修改,這里看到了獲取imei值的方法是一個無參數(shù)的返回字符串類型的方法,那么如果要攔截他的返回值,就需要修改他的返回值使用setResult方法即可。所以從這里可以看到不管是你hook系統(tǒng)的方法,還是日后去hook第三方應用的具體類方法,第一步都得了解到你hook對象的具體信息,關于系統(tǒng)方法咋們可以通過查看源碼來得到信息,而對于第三方應用的話那么只能借助反編譯技術了,比如修改游戲金幣功能,你必須先反編譯游戲知道修改金幣的類和具體方法才可行。
這里我不僅Hook了系統(tǒng)的imei信息,也簡單的Hook了系統(tǒng)的地理位置信息,在Android中獲取經(jīng)緯度信息有三種方式,這里為了演示簡單,用了GPS定位功能,一般獲取經(jīng)緯度信息的代碼主要是兩處:一處是初始化的時候調(diào)用getLastKnowLocation方法獲取最后一次系統(tǒng)中的地理位置信息
還有一處就是監(jiān)聽地理位置變化的回調(diào)接口中的onLocationChanged回調(diào)方法:
所以如果想Hook系統(tǒng)的地理位置信息進行攔截,那么就需要操作這兩處代碼了,而他們有一個區(qū)別就是,第一處是通過返回值得到的,第二處是通過回調(diào)方法中的參數(shù)得到的。下面來看一下具體的Hook代碼:Hook第一處代碼比較簡單,直接構造一個假的Location對象然后設置返回值即可。
Hook第二處代碼有點復雜,需要先找到添加位置監(jiān)聽的方法requestLocationUpdates,然后通過反射得到這個回調(diào)對象,找到具體的回調(diào)方法,然后在進行操作,因為回調(diào)方法是通過參數(shù)把Location對象傳遞回來的,所以這里需要修改參數(shù)值。
好了,到這里我們就編寫好了Hook系統(tǒng)的imei值和地理位置信息的模塊了。
第三步:添加模塊入口
這一步是非常重要的,也是最容易忘記的,就是要告訴Xposed框架一個模塊中Hook的入口,這里可以看到模塊的入口是Main類,所以需要在模塊的assets中添加一個xposed_init文件:
這里的內(nèi)容很簡單,就是模塊入口類的全稱名稱即可:
第四步:添加模塊的額外信息
最后一步就是需要在模塊的AndroidManifest.xml文件添加額外信息,具體包括模塊的描述信息,版本號等:
xposedmodule:代表的是Android程序作為Xposed中的一個模塊,所以值為true;xposeddescription:代表的是對本模塊的功能的描述,可以自己簡單敘述下就可以了;xposedminversion:代表的是本模塊開發(fā)時用到的xposed的jar包的最低版本號,這里是30,而我所用的xposed的jar包版本是54;
經(jīng)過上面四步之后咋們就完成了模塊的定義了,最后咋們?yōu)榱蓑炞C我們Hook的結(jié)果,在新建一個Activity類,在內(nèi)部調(diào)用一下系統(tǒng)的獲取imei方法以及位置信息方法,并且顯示在屏幕中:
六、運行模塊
下面咋們就來運行一下模塊程序,安裝到設備之后,Xposed會提示模塊未激活:
這個XposedInstaller程序應該是通過安裝廣播,然后得到這個應用信息分析他是否包含了Xposed模塊的特殊屬性來判斷的。我們點擊進行激活:
這時候看到,激活成功之后,會提示你再次重啟設備才能生效,所以這里可以看到每次如果有新的模塊或者是模塊代碼有更新了,比如這樣:
都是需要重啟設備,模塊才能生效的,這一點還是有點蛋疼的和麻煩的。然后咋們重啟設備之后,在運行我們的模塊代碼看看效果:
從這顯示結(jié)果看到了,Hook成功了,在沒有Hook之前的效果是:
這時候咋們在來看一下打印的日志信息:
看到了,百度地圖在獲取我們設備的imei和位置信息,當然這是符合正常情況的,從這里可以看到,我們還可以利用這個技術來觀察設備中有哪些應用在獲取設備的一些隱私數(shù)據(jù)。
項目下載地址:http://download.csdn.net/detail/jiangwei0910410003/9654604
七、實際用途
本文主要是介紹了Xposed框架的基本使用以及一個簡單作用,但是在實際過程中,這個框架是非常有用的,比如在文章開頭就說到了,我們可以通過修改系統(tǒng)的一些信息來幫助測試模擬復雜的測試環(huán)境,但是這個框架現(xiàn)在用的最廣泛的當屬破解了,這個也是我們后續(xù)講解的重點,用這個框架咋們可以進行應用的脫殼,游戲的外掛等。
八、總結(jié)
本文是介紹Xposed的基礎篇,主要介紹了Xposed的具體使用,XposedInstaller.apk其實是一個模塊載體和管理器,如果想實現(xiàn)具體的Hook操作,就必須自己在編寫模塊程序,然后在激活加載方可生效。后續(xù)會繼續(xù)介紹用這個框架咋們來進行其他一些操作,比如應用的脫殼,游戲外掛編寫,系統(tǒng)信息篡改等知識,期待大家多多期盼和點贊啦啦?。?/p>
相關文章
ListView的Adapter使用(綁定數(shù)據(jù)) 之 自定義每一項的布局去綁定數(shù)據(jù)
之前寫的綁定數(shù)據(jù)是只是簡單的綁定了字符串,這次我們將一次綁定多條數(shù)據(jù)并且嘗試用自定義的布局。在這篇文章中首先講解的是用Hashmap 去綁定數(shù)據(jù),第二個例子,講解自定義布局然后綁定數(shù)據(jù)2013-06-06Android Tablayout 自定義Tab布局的使用案例
這篇文章主要介紹了Android Tablayout 自定義Tab布局的使用案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Android Studio 視頻播放失敗 start called in state1 異常怎么解決
很多朋友問小編在使用MediaPlayer播放音頻時報出 E/MediaPlayerNative: start called in state 1, mPlayer(0x0)問題,該如何處理呢,今天小編給大家?guī)砹薃ndroid Studio 視頻播放失敗 start called in state1 異常問題,需要的朋友可以參考下2020-03-03