6、XPOSED二、叉叉助手框架--用XPOSED实现

继《 xposed框架初探》之后,编写一个小小的demo应用,刚好之前分析叉叉的游戏辅助框架(参考《 叉叉助手逆向分析续集--模拟实现游戏插件框架--再扩展到脱壳机 》, 我们是用了libsubstrate的hook框架来完成的 ),这次就用XPOSED实现一下。

相关参考:
看雪论坛《 XPOSED的小笔记 ,文章介绍的很详细很清晰。

准备工作:
上一篇中我们用的是“ 华为专用Xposed框架”,也并不是很完美,于是还是从官网上下载稳定版本的,这个要视不同手机而定。
http://repo.xposed.info/module/de.robv.android.xposed.installer,点下面的“Show older versions”逐个版本安装试用,每个版本都要激活一次并重启手机,还是挺麻烦的,好在试到2.5.1版本的时候成功了!这个版本确实比 华为专用Xposed框架 ”要稳定完美许多,果断换用2.5.1官方版本。

实现思路:
实现接口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。
<application android: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-data android: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"/><activity android: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 of this XDA thread. Copy it into a subfolder called lib. 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 an IllegalAccessError. 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的代码:
package com.netease.ga; import android.app.Activity; import android.content.Context;import android.content.SharedPreferences; import android.os.Build; importandroid.os.Bundle; import android.util.Log; import java.lang.reflect.Method; importdalvik.system.DexClassLoader; import de.robv.android.xposed.IXposedHookLoadPackage;import de.robv.android.xposed.XC_MethodHook; importde.robv.android.xposed.callbacks.XC_LoadPackage; import staticde.robv.android.xposed.XposedHelpers.findAndHookMethod; import staticde.robv.android.xposed.XposedHelpers.findClass; /** * Created by sing on 14-9-17. * desc: */ public class XposedXXHook implements IXposedHookLoadPackage { private staticfinal String TAG = "XposedXXHook"private static final String TARGET_PACKAGE = "com.example.helloapplication"private static final String TARGET_CLASS = "com.example.helloapplication.MainActivity"private static final String TARGET_FUNCTION = "onCreate"//private SharedPreferences sp; /** * * @param param *@throws Throwable */ @Override public voidhandleLoadPackage(XC_LoadPackage.LoadPackageParam param) throws Throwable { 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.classnewXC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param)throws Throwable { Log.d(TAG, "[handleLoadPackage]beforeHookedMethod"); } @Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable { 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 new DexClassLoader(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.classnewXC_MethodHook(){...});

xposed与libsubstrate的对比:
测试都需要经过反复的重启,此次 xposed的测试demo也是如是,即便写的只是java层代码,也需要每次改动都要重启手机。而之前用 libsubstrate 实现的底层hook,在每次改动JNI代码后也是需要重启手机的。
代码量方面还是 xposed框架下少很多,而且都是java层代码,写起来速度也快不容易出错,测试的时间自然也少很多。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
xposed-v7.1-sdk25-x86.zip是一个针对Android系统的软件框架文件。Xposed框架是一个开源项目,可以在不修改系统APK文件的情况下改变系统和应用程序的行为。xposed-v7.1-sdk25-x86.zip中的v7.1表示框架的版本号,sdk25表示该框架适用于Android 7.1版本的开发工具包,而x86表示该框架适用于基于x86架构的处理器。 使用xposed-v7.1-sdk25-x86.zip,我们可以在Android系统中实现各种定制化和优化的功能。通过安装该框架,我们可以在不修改应用程序源代码的情况下,通过加载和运行特定模块来修改应用程序的行为。这些模块可以实现例如更改应用程序界面、增加额外的功能、去除广告等等。同时,xposed-v7.1-sdk25-x86.zip提供了一个非常方便的开发环境,使开发者能够轻松创建和调试自己的模块。 要安装xposed-v7.1-sdk25-x86.zip,首先需要确保你的设备已经root权限。然后,将该框架文件通过适当的方法(如刷机)安装到设备的系统分区中。安装完成后,重启设备并安装Xposed Installer应用程序,该应用程序将允许你管理和加载模块。 总结来说,xposed-v7.1-sdk25-x86.zip是一个强大的Android系统软件框架,可以通过加载模块来修改和定制应用程序和系统的行为,提供了方便的开发环境供开发者创造自己的模块。但要注意,在使用之前确保你的设备已经root,并且安装过程需要相应的技术和操作技巧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

asmcvc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值