編輯:關於Android編程
一、前言
關於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和位置信息,當然這是符合正常情況的,從這裡可以看到,我們還可以利用這個技術來觀察設備中有哪些應用在獲取設備的一些隱私數據。
項目下載地址:http://download.csdn.net/detail/jiangwei0910410003/9654604
七、實際用途
本文主要是介紹了Xposed框架的基本使用以及一個簡單作用,但是在實際過程中,這個框架是非常有用的,比如在文章開頭就說到了,我們可以通過修改系統的一些信息來幫助測試模擬復雜的測試環境,但是這個框架現在用的最廣泛的當屬破解了,這個也是我們後續講解的重點,用這個框架咋們可以進行應用的脫殼,游戲的外掛等。
八、總結
本文是介紹Xposed的基礎篇,主要介紹了Xposed的具體使用,XposedInstaller.apk其實是一個模塊載體和管理器,如果想實現具體的Hook操作,就必須自己在編寫模塊程序,然後在激活加載方可生效。後續會繼續介紹用這個框架咋們來進行其他一些操作,比如應用的脫殼,游戲外掛編寫,系統信息篡改等知識,期待大家多多期盼和點贊啦啦!!
本文實例講述了Android編程繪制圓形圖片的方法。分享給大家供大家參考,具體如下:效果圖如下:第一步:新建RoundView自定義控件繼承Viewpackage com
在上一篇文章中,我們詳細分析了android是如何解析藍牙反饋上來的搜索到的設備信息,本文將會繼續分析這些信息到了上層之後是如何處理。 8、inquiry result引
Android中Service的一個Demo例子Service組件是Android系統重要的一部分,網上看了代碼,很簡單,但要想熟練使用還是需要Coding。本文,主要貼
BroadcastReceiver也就是“廣播接收者”的意思,它是用來接收來自系統和應用中的廣播。在Android中,Broadcast是一種廣泛運用的在應用程序之間傳輸