相关参考:
准备工作:
上一篇中我们用的是“华为专用Xposed框架”,也并不是很完美,于是还是从官网上下载稳定版本的,这个要视不同手机而定。
实现思路:
实现接口IXposedHookLoadPackage的接口函数handleLoadPackage,判断参数包名是否是目标APK,若是则调用findAndHookMethod对目标启动类的onCreate函数进行HOOK,在afterHookedMethod函数中动态加载插件,将参数中有关activity的实例传给插件。
一个 XposedModule 本质上是设定了部分特殊元数据标志位的普通应用程序,需要在AndroidManifest.xml 文件中添加如下设置:
AndroidManifest.xml => Application => Application Nodes (at the bottom) => Add => Meta Data
添加节点:name = xposedmodule,value = true。name = xposedminiversion, value = API level。
<applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme"android:name=".MainApplication"><!--Xposed--><meta-dataandroid:name="xposedmodule"android:value="true"/><meta-dataandroid:name="xposedminversion"android:value="42+"/><meta-dataandroid:name="xposeddescription"android:value="GameAssistant"/><activityandroid:name="com.netease.ga.view.MainActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"><intent-filter><actionandroid:name="android.intent.action.MAIN"/><categoryandroid:name="android.intent.category.LAUNCHER"/></intent-filter></activity><activityandroid:name=".view.MyGamesActivity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen"/><activityandroid:name=".view.PluginsActivity"/><activityandroid:name=".view.MoreActivity"/><receiverandroid:name=".receiver.MyReceiver"/></application>
添加标记的作用估计是让XPOSED安装器识别为插件。
添加库文件:XposedBridgeApi.jar
需要注意的是这个jar包不能放到工程的libs目录,否则运行会出现异常。最好是放到工程主目录下,然后在eclipse里右键选择该jar-Build
Path => Add to Build Path。
注意这个jar包版本选择,经测试XposedBridgeApi-54.jar在2.5.1版本的xposedinstaller下是兼容的,但是最新版的靠谱助手(2.5.1143)上默认集成安装了2.6.1版本的xposedinstaller,测试发现XposedBridgeApi-54.jar并不是很稳定,后来改用XposedBridgeApi-42.jar是可以的。
Next, make the XposedBridge API known to the project. You can downloadXposedBridgeApi-<version>.jar
from
the first post ofthis
XDA thread. Copy it into a subfolder calledlib
.
Then right-click on it and select Build Path => Add to Build Path. The<version>
from
the file name is the one you insert asxposedminversion
in
the manifest.
Make sure that the API classes are not included (but only referenced) in your compiled APK, otherwise you will get anIllegalAccessError
.
Files in thelibs
(with "s") folder are automatically included by Eclipse, so don't put the API file there.
这个设置对应到androidstudio的操作步骤:
F4打开工程结构,选择Modules-当前项目-Dependencies-+-选择“Jar or directiories”,
选择jar包后,在“Scope”栏选择“Provided”,不要选择“Complie”。
然后声明一个类XposedXXHook实现接口IXposedHookLoadPackage
在 assets 目录下新建一个 xposed_init 文件,这个文件声明了需要加载到 XposedInstaller的入口类:com.netease.ga.XposedXXHook
由于改动不大,因此直接在原来的GA工程(基于libsubstrate的叉叉游戏辅助框架)上添加。
完善XposedXXHook的代码:
packagecom.netease.ga;importandroid.app.Activity;importandroid.content.Context;importandroid.content.SharedPreferences;importandroid.os.Build;importandroid.os.Bundle;importandroid.util.Log;importjava.lang.reflect.Method;importdalvik.system.DexClassLoader;importde.robv.android.xposed.IXposedHookLoadPackage;importde.robv.android.xposed.XC_MethodHook;importde.robv.android.xposed.callbacks.XC_LoadPackage;importstaticde.robv.android.xposed.XposedHelpers.findAndHookMethod;importstaticde.robv.android.xposed.XposedHelpers.findClass;/*** Created by sing on 14-9-17. * desc:*/publicclassXposedXXHookimplementsIXposedHookLoadPackage {privatestaticfinalString TAG = "XposedXXHook";privatestaticfinalString TARGET_PACKAGE = "com.example.helloapplication";privatestaticfinalString TARGET_CLASS = "com.example.helloapplication.MainActivity";privatestaticfinalString TARGET_FUNCTION = "onCreate";//private SharedPreferences sp;/*** *@paramparam *@throwsThrowable*/@OverridepublicvoidhandleLoadPackage(XC_LoadPackage.LoadPackageParam param)throwsThrowable { String packageName=param.packageName; Log.d(TAG,"handleLoadPackage: " +packageName);if(packageName.equals(TARGET_PACKAGE) ==false) {return; } Log.d(TAG,"handleLoadPackage: star hook"); XC_MethodHook.Unhook unhook= findAndHookMethod(TARGET_CLASS, param.classLoader, TARGET_FUNCTION, Bundle.class,newXC_MethodHook() { @OverrideprotectedvoidbeforeHookedMethod(MethodHookParam param)throwsThrowable { Log.d(TAG,"[handleLoadPackage]beforeHookedMethod"); } @OverrideprotectedvoidafterHookedMethod(MethodHookParam param)throwsThrowable { Log.d(TAG,"[handleLoadPackage]afterHookedMethod: " +param.thisObject.toString()); String plugApkPath= "/data/data/com.netease.ga/app_plugin/lianmengplug.apk"; String plugSoPath= "/data/data/com.netease.ga/app_plugin/libxxlianmeng_mm.so"; String dexOutputDir= "/data/data/" + TARGET_PACKAGE + "/cache"; ClassLoader localClassLoader=ClassLoader.getSystemClassLoader(); DexClassLoader localDexClassLoader=newDexClassLoader(plugApkPath, dexOutputDir,null, localClassLoader); java.lang.Class<?> plugClass = localDexClassLoader.loadClass("com.xxAssistant.UI.UniversalUI"); Method mInit= plugClass.getDeclaredMethod("init", Activity.class, String.class); mInit.invoke(null, param.thisObject, plugSoPath); } });if(unhook!=null) { Log.d(TAG,"handleLoadPackage: hook ok"); }else{ Log.d(TAG,"handleLoadPackage: hook failed"); } } }
注意这段代码只HOOK包名为com.example.helloapplication的应用程序,如果要HOOK其他应用程序则把包名过滤的判断去掉,并动态解析应用程序的主启动类即可。
编译安装好后在xposed安装器的模块中激活GA并重启手机。
启动手机后不用运行xposed安装器和GA,直接运行helloapplication程序:
可以看出插件已经被我们成功加载了。
常见错误:
09-17 07:58:42.049: I/Xposed(2447): java.lang.NoSuchMethodError: com.example.helloapplication.MainActivity#onCreate()#exact
错误为未找到对应的函数,在hook的时候需要指定函数的参数形式。
findAndHookMethod(TARGET_CLASS, param.classLoader, TARGET_FUNCTION,newXC_MethodHook(){...});
因为
onCreate是有参数的,所以正确的调用方式是:
findAndHookMethod(TARGET_CLASS, param.classLoader, TARGET_FUNCTION, Bundle.class,newXC_MethodHook(){...});
xposed与libsubstrate的对比:
测试都需要经过反复的重启,此次xposed的测试demo也是如是,即便写的只是java层代码,也需要每次改动都要重启手机。而之前用libsubstrate实现的底层hook,在每次改动JNI代码后也是需要重启手机的。
代码量方面还是xposed框架下少很多,而且都是java层代码,写起来速度也快不容易出错,测试的时间自然也少很多。
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
Xposed框架(含sdk21-23), arm & arm64 & x86
【安卓/android】Xposed框架2.4-3.0全部版本
xposed-v89-sdk25-x86.zip
xposed-v88-sdk23-x86.zip
xposed-v89-sdk25-arm86与xposed-v89-sdk25-arm64两个版本对应的系统是安卓5.0以上的
仅供学习
Xposed框架包(sdk23-27即安卓6.0-8.1---32和64都有).rar------------亲测可用,积分便宜
xposed框架的卸载程序,配套xposed-uninstaller-20180117-arm.zip,适用于android5
安装xposed使用
Android11 — SDK 30 Android10 — SDK 29 Pie 9.0 — SDK 28 Oreo 8.1 — SDK 27 Oreo 8.0 — SDK 26 Nougat 7.1 — SDK 25 Nougat 7.0 — SDK 24 Marshmallow 6.0 — SDK 23 Lollipop 5.1 — SDK 22 ...
当安装好xposed框架后,还需要安装.zip包对其进行激活。然而由于网络环境问题,xposed框架软件总是无法成功从网站上下载相应的.zip包。在这里,整理了sdk21-sdk25(android5.0-android7.1)相对应的.zip包。 安装...
适用于 模拟器是 SDK7.1的 ,其实就是安卓版本和SDK版本的对应包
xposed框架大全压缩包
Xposed框架是一种基于模块的系统,这意味着用户可以选择安装不同的模块来实现不同的功能和修改。总的来说,Xposed鸭是一个非常有用的工具,它可以帮助Android用户实现各种自定义和修改,而无需进行复杂的ROM修改。它...
andoid xposed 安装包
xposed 无法自动下载,采用手动用的xposed-v89-sdk22-x86.zip