本文from https://blog.dreamtobe.cn/xposed_module/
以隱藏微信發(fā)現(xiàn)頁(yè)面游戲中心的入口為例子上陕,源碼在這: https://github.com/Jacksgong/wechat-hunter
1. Xposed原理淺談
在此之前建議通過(guò)這幾篇文章簡(jiǎn)單的了解下Android簡(jiǎn)要的知識(shí): ART童叠、Dalvik伤靠、Android GC很洋、ActivityManagerService渡冻。
常用方法
通常我們?nèi)バ薷钠渌麘?yīng)用的行為,要通過(guò)反編譯竿滨,然后重新編譯芭碍、重新簽名才行徒役。
Xposed做法
Xposed是通過(guò)hook方法的方式來(lái)實(shí)現(xiàn),由于Xposed修改了系統(tǒng)在啟動(dòng)時(shí)加載的Zygote進(jìn)程相關(guān)的邏輯以及加載的資源(并且所有應(yīng)用的啟動(dòng)都是從Zygote進(jìn)程中拷貝出來(lái)的)窖壕,因此幾乎可以架空一切安全忧勿,做所有事情,包括修改系統(tǒng)行為艇拍。
hook的大概原理
hook方法是XposedBridge中的一個(gè)私有native方法hookMethodNative改變被hook方法的類(lèi)型為native并且link方法實(shí)現(xiàn)到它自己的native方法中狐蜕,并且對(duì)調(diào)用者透明宠纯,該native方法調(diào)用XposedBridge中的handleHookedMethod方法卸夕,將參數(shù),this引用等傳進(jìn)來(lái)婆瓜,之后在回調(diào)回去快集,這樣我們就可以在任意方法執(zhí)行前后做任何的事情了(當(dāng)然xposed框架還支持替換各類(lèi)資源)。
2. 編寫(xiě)code
2.1. 創(chuàng)建空Android項(xiàng)目
首先創(chuàng)建一個(gè)空的Android項(xiàng)目
本文案例使用:
- compileSdkVersion: 25
- buildToolsVersion: 25.0.2
- minSdkVersion: 9
- targetSdkVersion: 25
2.2. 申明為Xposed module項(xiàng)目
在AndroidManifest中通過(guò)meta-data申明:
- xposeddescription: 該模塊的簡(jiǎn)要描述
- xposedminversion: 最低依賴(lài)的xposed版本(這里主要看你要使用的xposed的功能在該版本之下是否已經(jīng)支持)
<application android:label="WechatHunt">
<meta-data
android:name="xposedmodule"
android:value="true" />
<meta-data
android:name="xposeddescription"
android:value="The hunter for wechat" />
<meta-data
android:name="xposedminversion"
android:value="30" />
</application>
2.3. 引入依賴(lài)
由于這些依賴(lài)庫(kù)在安裝了Xposed框架手機(jī)的Zygote進(jìn)程上默認(rèn)就已經(jīng)有加載了廉白,所以我們這邊只需要保證當(dāng)前寫(xiě)代碼時(shí)候找得到依賴(lài)个初,并不需要打入apk包中,因此使用provided關(guān)鍵字即可猴蹂,還有一個(gè)是為了我們?cè)赾ode中看得到Java-Doc院溺,因此兩個(gè)都引接口:
- 這里的[latest version]替換為目前最新版本,如這邊文章編寫(xiě)的時(shí)候最新版本是82
provided 'de.robv.android.xposed:api:[latest version]'
provided 'de.robv.android.xposed:api:[latest version]:sources'
2.4. CODING
- 實(shí)現(xiàn)IXposedHookLoadPackage來(lái)在應(yīng)用被加載的時(shí)候生效hook方法磅轻。
- 實(shí)現(xiàn)好之后珍逸,創(chuàng)建assets目錄逐虚,默認(rèn)情況下是在app/src/main/assets
- 在assets目錄中創(chuàng)建xposed_init文件
- 在xposed_init中申明加載器(完整的加載器路徑),如cn.dreamtobe.xposed.wechathunt.WechatHunt
3. 實(shí)現(xiàn)隱藏游戲中心入口
下載微信谆膳,解壓縮叭爱,反編譯,搜索關(guān)鍵字:
- 反編譯工具漱病,可以參看Android開(kāi)發(fā)周邊中的快速反編譯
找到混淆后的類(lèi)名后买雾,進(jìn)行編寫(xiě)
// 找到需要hook的類(lèi)
final Class<?> pluginHelper = findClass("com.tencent.mm.ay.c", lpparam.classLoader);
// 以及需要hook的方法FZ(String)
findAndHookMethod(pluginHelper, "FZ", String.class, new XC_MethodHook() {
// 對(duì)方法執(zhí)行后進(jìn)行hook
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
final String plugin = (String) param.args[0];
if (plugin.equals("game")) {
// 將返回值修改為false
param.setResult(false);
}
}
});
4.發(fā)布到Xposed Module Repo
- 創(chuàng)建xda developers帳號(hào)
- 在Xposed Module repo中使用xda帳號(hào)登錄
- 惦記Upload new module進(jìn)行上傳即可
當(dāng)然如果是混淆的話(huà),即可要keep加載器杨帽,因?yàn)槭窃赼ssets中申明的漓穿,如這個(gè)案例中:
-keep class cn.dreamtobe.xposed.wechathunt.WechatHunt{*;}
-keepnames class cn.dreamtobe.xposed.wechathunt.WechatHunt