继《xposed框架初探》之后,编写一个小小的demo应用,刚好之前分析叉叉的游戏辅助框架(参考《叉叉助手逆向分析续集--模拟实现游戏插件框架--再扩展到脱壳机》,我们是用了libsubstrate的hook框架来完成的),这次就用XPOSED实现一下。
相关参考:
官方教程《Making the project an Xposed module》
《Android Hook框架Xposed原理与源代码分析》
看雪论坛《XPOSED的小笔记》,文章介绍的很详细很清晰。
Xpoded模块开发教程
准备工作:
上一篇中我们用的是“华为专用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.class, newXC_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.class, newXC_MethodHook(){...});
xposed与libsubstrate的对比:
测试都需要经过反复的重启,此次xposed的测试demo也是如是,即便写的只是java层代码,也需要每次改动都要重启手机。而之前用libsubstrate实现的底层hook,在每次改动JNI代码后也是需要重启手机的。
代码量方面还是xposed框架下少很多,而且都是java层代码,写起来速度也快不容易出错,测试的时间自然也少很多。

6、XPOSED二、叉叉助手框架--用XPOSED实现相关推荐

  1. 4、叉叉助手逆向分析续集--模拟实现游戏插件框架--再扩展到脱壳机

    这里以HOOK程序启动后调用天天星联盟为例,下面是2014年4月30日抠出来的天天星联盟插件APK代码: package com.xxAssistant.UI; import android.app. ...

  2. 3、叉叉助手逆向分析(下)

    plugin/117/xxFknsg.apk --ui-name:com/xxAssistant/FknsgUI/xxMain --activity-name:com/babeltimes/main/ ...

  3. android 叉叉助手 弹幕原理

    叉叉助手能实现从它的app打开另外的app,并实现弹幕,请问下这种弹幕效果是用的什么技术呢?

  4. 叉叉框架_叉/连接框架

    叉叉框架 本文是我们名为Java Concurrency Essentials的学院课程的一部分. 在本课程中,您将深入探讨并发的魔力. 将向您介绍并发和并发代码的基础知识,并学习诸如原子性,同步和线 ...

  5. 二维叉乘求三角形面积_角形

    二维叉乘求三角形面积 Today we will look into Angular Form elements. We are all familiar with HTML forms and it ...

  6. android每天定时打卡,钉钉定时打卡脚本下载|叉叉助手钉钉定时打卡插件安卓版下载 v4.3.1 - 跑跑车安卓网...

    叉叉助手钉钉定时打卡插件是一个实用的工具,让用户自定义打卡的时间,无论是上班还是下班都能通过这个应用来自动打卡. 软件介绍 钉钉是中国领先的智能移动办公平台,由阿里巴巴集团开发,免费提供给所有企业,用 ...

  7. 2、叉叉助手逆向分析(上)

    描述:主要讲解如何有条例地逆向分析出软件的主要逻辑. 工具:APKIDE,JD-GUI 方法:顺藤摸瓜,smali代码主要看invoke关键函数调用,定位到相应的类中看代码. 使用APKIDE反编译x ...

  8. 三维叉乘怎么算_圆锥曲线第十四节:二次点乘与二次叉乘

    目录: 质点:圆锥曲线题目的三维矢量解法​zhuanlan.zhihu.com 我们在第八节中已经涉及到了"二次点"和"二次线"(它们统称二次曲线)的概念,我们 ...

  9. 剑网3指尖江湖开局门派选TA最好 叉叉助手伴你快意江湖

    万众期待的<剑网3:指尖江湖>将于6月12日上线!在国创武侠网游界,剑网三的大名可谓无人不知无人不晓.该作是西山居以端游IP研发的一款角色扮演类手游,有别于大部分角色扮演游戏的单人物多职业 ...

最新文章

  1. react select默认选项_reactjs – 如何为Picker提供默认的“Please select …”选项?
  2. 距离高效率学习CV算法我还有多远的距离?
  3. 4.1.9 OS之文件系统的层次结构
  4. 图论为什么这么难_图论是什么,为什么要关心?
  5. 计算领域的致敬与前行
  6. 机器学习速成课程 | 练习 | Google Development——编程练习:逻辑回归
  7. [cocos2dx]斗地主制作之洗牌算法
  8. linux系统编译时make出错,centos 编译安装cmake和常见过程错误解决办法(linux系统均适用,以爬坑。。)...
  9. 脚本基础(未完待续)
  10. 了凡四训——改变命运之学
  11. 视频直播系统源码,简单计时器
  12. shutdown配合at命令 实现定时关机,重启---
  13. win10启用长路径
  14. Button设置elevation阴影
  15. 超级文本编辑器Sublime Text3
  16. 国内计算机类核心期刊投稿交流——分享给后进小硕
  17. 解决UU加速器导致电脑不能正常睡眠(休眠)的问题
  18. 2022G3锅炉水处理考试100题模拟考试平台操作
  19. 基于RestTemplate的在线武器库
  20. c语言实现京东秒杀软件,python实现京东秒杀功能

热门文章

  1. 电话呼叫中心系统是什么?有什么作用?
  2. 什么是次世代?零基础学习次世代全解
  3. Bootstrap图标库下载到本地后的引用
  4. sql语句计算出每个月的天数
  5. arr访问绝对地址_西门子1200PLC与汇川伺服电机的MODBUS-RTU通讯
  6. 商城项目购物车的实现
  7. eclipse下快捷键总结【永久更新】
  8. 【惯性导航姿态仪】02 磁传感器的简易标定说明
  9. idea Gradle7.0+ :Could not find method compile()
  10. 18650锂电池参数、充放电时间计算详解