一商叹、原理
一句話,替換所有程序的/system/bin/app_process只泼,控制 zygote 進程剖笙,從而使 app_process 在啟動過程中加載XposedBridge.jar 這個jar包,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持辜妓,進而控制所有程序
Xposed框架是由rovo89開發(fā)的一款針對Android平臺的動態(tài)劫持項目枯途,是一款可以在不修改APK的情況下
影響程序運行(修改系統(tǒng))的框架服務,通過替換/system/bin/app_process 程序控制 zygote 進程籍滴,從而使 app_process 在啟動過程中加載XposedBridge.jar
這個jar包酪夷,從而完成對Zygote進程及其創(chuàng)建的Dalvik虛擬機的劫持
。
Zygote進程在啟動過程中孽惰,除了創(chuàng)建一個Dalvik虛擬機實例之外晚岭,還會將Java運行時庫加載到進程中來,同時還會注冊一些Android核心類的JNI方法到前面創(chuàng)建的Dalvik虛擬機實例中去勋功。
一個應用程序被孵化出來的時候坦报,其不僅會獲得Zygote進程中的Dalvik虛擬機實例,還會與Zygote一起共享Java運行時庫狂鞋,這也是可以將XposedBridge.jar這個jar包加載到每一個Android應用中的原因片择。
XposedBridge有一個私有的Native方法:hookMethodNative,這個方法也在app_process中使用骚揍。該函數(shù)提供一個方法對象利用Java的反射機制來對內(nèi)置的方法覆寫字管。
xposed只是個框架,對用戶來說本身并不沒有什么卵用信不,真正厲害的是xposed上面的模塊嘲叔,下面博主就來推薦幾個好玩的模塊。如果沒有給出下載鏈接抽活,默認這些模塊都是可以在xposed中直接搜索到然后下載的硫戈。
但是作為開發(fā),我們更加關心自己開發(fā)模塊
準備
- 1下硕、已經(jīng)root的手機
- 2丁逝、先安裝Xposed Installer
- 3、安裝自己或者別人開發(fā)的 xposed module
Xposed Installer
4.4是一個分水嶺卵牍,如果有可能果港,直接在4.4上開發(fā)
xposed官網(wǎng)安裝教程:
http://repo.xposed.info/module/de.robv.android.xposed.installer
- Android 4.0.3 ~ 4.4 安裝 xposed
如果是Android 4.0.3~4.4則直接下載
de.robv.android.xposed.installer_v33_36570c.apk 安裝即可,下載地址:
de.robv.android.xposed.installer_v33_36570c.apk
-
Android 5.0糊昙、5.1、6.0 安裝 xposed
從Android 5.0開始谢谦,谷歌使用ART替換Dalvik释牺,所以xposed安裝有點麻煩萝衩,分為兩個部分:xposed*.zip 和 XposedInstaller_3.1.apk。zip文件是框架主體没咙,需要進入Recovery后刷入猩谊,apk文件是xposed模塊管理應用,主要用于下載祭刚、激活牌捷、是否啟用模塊等管理功能。Android 5.0涡驮、5.1暗甥、6.0 安裝 xposed 官網(wǎng)教程:
http://forum.xda-developers.com/showthread.php?t=3034811
開發(fā)一個module
S1、安裝 XposedBridgeApi
我們這里用的是:XposedBridgeApi-54
[XposedBridgeApi-54官方下載地址]
https://forum.xda-developers.com/attachment.php?s=5903ce1b3edb1032faba7292b21e1801&attachmentid=2748878&d=1400342298
除了XposedBridgeApi-54捉捅,還有XposedBridgeApi-82.jar撤防、XposedBridgeApi-87.jar、XposedBridgeApi-89.jar等版本
XposedBridgeApi 特殊存放位置
一句話:XposedBridgeApi分版本棒口,可以引用XposedBridgeApi本地jar寄月,也可以依賴引用。
本地jar
下載完畢后我們需要將 Xposed Library 復制到 lib目錄(注意是 lib 目錄不是Android提供的 libs 目錄)无牵,然后將這個 jar 包添加到 Build PATH 中
如果直接將jar包放置到了libs目錄下漾肮,很可能會產(chǎn)生錯 誤“IllegalAccessError: Class ref in
pre-verified class resolved to unexpected
implementation”。
估計Xposed作者在其框架內(nèi)部也引用了BridgeApi茎毁,這樣操作避免重復引用克懊。
引入包
dependencies {
……
implementation files('lib/XposedBridgeApi-54.jar')
}
As 依賴引入
As,也可以依賴引入
比如
provided 'de.robv.android.xposed:api:82'
//如果需要引入文檔充岛,方便查看的話
provided 'de.robv.android.xposed:api:82:sources'
S2保檐、配置
<?xml version="1.0" encoding="utf-8"?>
<manifest package="com.fine.hookfoo"
xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--xposed 配置開始-->
<!--xposedmodule: 表示這是一個xposed模塊-->
<meta-data
android:name="xposedmodule"
android:value="true"/>
<!--xposeddescription: 描述該模塊的用途,可以引用string.xml中的字符串-->
<meta-data
android:name="xposeddescription"
android:value="何夜無月崔梗,何處無好module"/>
<!--xposedminversion:要求支持的Xposed Framework最低版本 并不是指定82 就寫82-->
<meta-data
android:name="xposedminversion"
android:value="30"/>
<!--xposed 配置開始-->
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
</application>
</manifest>
- xposedmodule: 表示這是一個xposed模塊
- xposeddescription: 描述該模塊的用途夜只,可以引用string.xml中的字符串
- xposedminversion:要求支持的Xposed Framework最低版本,引入的是82蒜魄,mix寫30也沒關系
S3扔亥、最簡單的模塊
創(chuàng)建一個類,并實現(xiàn)IXposedHookLoadPackage,IXposedHookZygoteInit或者其他IXposedMod的子接口谈为。
我們這里例子實現(xiàn)的是:IXposedHookLoadPackage
public class XposedMainInit implements IXposedHookLoadPackage {
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
XposedBridge.log("XposedMainInit handleLoadPackage 執(zhí)行");
XposedBridge.log("Loaded app: " + lpparam.packageName);
}
}
XposedBridge.log會將日志輸出到logcat旅挤,并寫入日志文件
當然,也可以用 android.util.Log輸出到logcat伞鲫。
S4粘茄、聲明xposed入口
我們需要新建一個assets文件夾,并創(chuàng)建文件xposed_init,在里面填上xposed模塊的入口柒瓣。
這里我們聲明自己的類儒搭,比如:“com.fine.hookfoo.XposedMainInit”
安裝
這時候,安裝apk芙贫,然后Xposed搂鲫。
第一次安裝,需要進入到Xposed Install——模塊磺平,勾選我們的模塊魂仍,然后重啟機器。
每次修改完代碼安裝apk拣挪,都需要重啟機器擦酌,新代碼才會生效。
當然媒吗,我們這里的代碼沒人任何實則性的操作仑氛。
通過log,我看到:
- 1闸英、模塊安裝成功了
- 2锯岖、我們通過XposedBridge.jar,劫持 了所有app甫何。
如果無效出吹,可以試著裝上release包。
xposed一出辙喂,寸草不生捶牢。
本文完扯罐。