Xposed(也被稱作Xposed框架、XP框架、Xposed framework),是運行於Android作業系統的一個著名的免費開源Hook框架。其通過替換Android系統的關鍵文件,可以攔截幾乎所有Java函數的調用,並允許通過模塊擴展方式來實現各種功能,模塊中的自定義代碼可以更改調用函數時的行為,常被用來修改Android系統和應用程式的功能。
用戶可以在一些應用商店或其自帶的下載庫來下載安裝各種模塊,相比於重新安裝系統來獲得新功能,Xposed提供了一種更便捷的方式[1][2]。Xposed模塊可以很容易的開啟和關閉。你只需要激活或者禁用Xposed模塊,然後重啟手機即可。
Xposed框架的標誌
但如今,隨著Android系統的不斷更新,Xposed框架逐漸無法在新設備上運行。此時,EdXposed團隊成為了後續版本研發的繼任者。2019年1月,ElderDrivers完成了EdXposed的開發。EdXposed是一個Magisk模塊,依賴於riru框架,成功將Xposed移植到了Android Pie上,成為最接近原版Xposed的框架。2019年9月,EdXposed正式支持Android Q。2020年1月,EdXposed與Xposed原開發團隊達成共識,成為Xposed停止更新後的官方接任者[3]。
EdXposed有如下幾個特點:
1. 完全支持Android Pie和Q,甚至也可以支持R。
2.EdXposed具有「應用列表」模式。可以選擇要應用Xposed模塊進行hook的的應用程式,而系統中的其他應用程式在完全乾淨的環境中運行。
3. EdXposed使用Riru注入,不修改libart和app_process。
安裝和使用
對於Xposed,Xposed Installer是Xposed框架的官方安裝器,可以在擁有root權限的設備上安裝Xposed框架。Xposed Installer也提供模塊的下載、管理、日誌顯示等功能[4]。鑑於Xposed已經不再適用於新的Android系統,並且網上已經有非常多的教程,在此就不再贅述了。下面著重介紹一下EdXposed的安裝方法。
由於框架的核心點是系統進程注入技術,需要擁有設備的root權限,而且針對不同型號的設備和系統版本需要選擇正確的框架版本,滿足條件才能安裝。
首先,我們需要解除手機的BL鎖,對於不同品牌的手機,解鎖方式有所不同。以小米手機為例,可以在官方網站進行申請,步驟較為簡單[5]。
其次,需要在手機上安裝第三方Recovery,此處以TWRP為例。
2.1. 下載並安裝ADB/FASTBOOT支持,安裝完成後啟動手機進入fastboot模式,連接電腦。在命令行中輸入fastboot devices並執行,如果顯示當前的連接手機,則安裝成功。
2.2. 打開TWRP官網[6],在Devices頁面選擇自己的機型對應的TWRP安裝包,例如小米6,進入後點擊對應的下載連結:
點擊想要下載的版本,如twrp-3.4.0-0-sagit.img進行下載:
下載完成後,在命令行中輸入「fastboot flash recovery D:\twrp-3.4.0-0-sagit.img」(剛剛下載的twrp路徑)並執行。
提示刷入成功後,重啟進入twrp Recovery頁面,如小米是同時按開機鍵和音量上鍵進入。
2.3. 下載Magisk的zip卡刷包和apk安裝文件(https://www.download-magisk.com),並使用數據線導入到手機中。在twrp首頁,點擊「安裝」,選擇剛剛下載的Magisk的zip包進行安裝。
安裝成功後,重啟系統,安裝Magisk的apk管理軟體。
打開Manager應該可以看到安裝成功的頁面。
2.4. 參考EdXposed的官方文檔的Install步驟[7],安裝EdXposed:
2.4.1. 在Magisk Manager的「下載」中安裝 Riru(Riru - Core)和 Riru - EdXposed 後重啟手機。
2.4.2. 下載安裝EdXposed Manager[8],安裝完成後打開可以看到EdXposed框架已激活。
開發
本節中將介紹如何在AndriodStudio 4.0.1開發環境下創建一個簡單的EdXposed模塊。其實,EdXposed模塊也是一個 Android 程序。與普通程序不同的是,編寫EdXposed模塊時需要完成以下4個任務:
1)讓手機上的EdXposed框架知道我們安裝的這個程序是個EdXposed模塊。
2)模塊裡要包含有EdXposed的API的jar包,以實現下一步的Hook操作。
3)這個模塊裡面要有對目標程序進行Hook操作的方法。
4)要讓手機上的EdXposed框架知道,我們編寫的EdXposed模塊中,哪一個方法是實現Hook操作的。
下面開始按步驟進行:
3.1. 新建項目,可以選擇Empty Activity,進入項目頁面,在項目目錄中找到AndroidManifest.xml文件,插入如下代碼:
本步驟主要對Xposed模塊進行聲明。
3.2. 手機連接Android Studio,運行剛剛編寫的代碼,在手機裡會安裝一個app,同時,EdXposed框架中會顯示出這個模塊。
3.3. 配置Xposed API的依賴。在AndroidStudio 4.0.1中,可以在項目目錄中找到build.gradle,插入以下代碼。完成之後,build.gradle會提示文件已經修改,點擊 「sync now」進行同步。
本步驟設置了jcenter作為代碼倉庫,直接從這個倉庫裡遠程尋找de.robv.android.xposed:api:82 的API。
3.4. 下面打開activity_main.xml,在界面上加入一個button,並在MainAcitiviy裡插入以下代碼:
本步驟在MainActivity界面上加入了一個按鈕,打開app後點擊按鈕後會彈出一個toast提示,該提示的內容由 toastMessage() 方法提供,而toastMessage()的返回值為「我在正常運行」。
至此,我們已經搭建好一個app靶子,其中包含一個之後用來hook的按鈕,在關閉和啟動Xposed模塊時會顯示不同的toastMessage。
3.5. 下面編寫hook代碼。在MainActivity的路徑下新建一個類「HookTest.java」,插入以下代碼:
此處通過IXposedHookLoadPackage接口中的handleLoadPackage方法來實現Hook並篡改按鈕的toastMessage。需要設置目標程序的包名,在XposedHelpers.findAndHookMethod中設置想要Hook的類和方法。在afterHookedMethod方法(用來定義Hook了目標方法之後的操作)中,修改了toastMessage()方法的返回值為「嘿嘿!你已被劫持!」,對應之前點擊按鈕後顯示的文字提示。
3.6. 下面設置Xposed模塊入口。在main文件夾中新建assets文件夾,並在其中新建文件xposed_init,文件類型text,並在其中填寫剛剛編寫的hook類路徑「com.example.test.HookTest」。此時,EdXposed框架就能夠從這個 xposed_init 讀取信息來找到模塊的入口,然後進行Hook操作了。
3.7. 在File -> Settings -> Build, Execution, Deployment ->Debugger找到hotSwap,把Enable hotswap的勾去掉。
3.8. 點擊「運行」!在EdXposed框架裡找到自己寫的模塊,打上勾啟動模塊,重啟手機。
3.9. 打開app點擊按鈕顯示劫持成功。
總結
本文介紹了EdXposed框架的前世今生,安裝使用和模塊編寫,而EdXposed框架的強大不止於此,更多功能大家有興趣可以自己體驗。
Reference:
[1].https://www.xda-developers.com/xposed-framework-hub/
[2].https://github.com/rovo89/XposedBridge/wiki/Development-tutorial#how-xposed-works
[3].https://zh.wikipedia.org/zh-hans/Xposed_(%E6%A1%86%E6%9E%B6)
[4].https://repo.xposed.info/module/de.robv.android.xposed.installer
[5].http://www.miui.com/unlock/index.html
[6].https://twrp.me/
[7].https://github.com/ElderDrivers/EdXposed
[8].https://github.com/ElderDrivers/EdXposedManager/releases