欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Xposed框架实战

发布时间:2025/3/21 编程问答 35 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Xposed框架实战 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 环境
      • 夜神(Android5.1)
      • XposedInstaller(这里我用的是夜神软件商店下载的)
        • 下载后直接点击version进行install
      • 插件(i春秋教程教导)
    • 过程
      • 导入(注意这里不是libs,而是新建的lib)lib文件XposedBridgeApi-54.jar(把implemention改为provided模式,也就是不参与编译到最终文件中)
        • 原来:
        • 更改:
      • AndroidManifest.xml文件编写
      • 入口类编写
      • 回调函数编写
      • 设置启动入口
      • 安装激活插件,重启即看到插件效果
    • 实战
      • times类
      • hook掉times类中的test函数,让它不再调用
    • hook前(无这行代码param.setResult(null);)
    • hook后(有这行代码param.setResult(null);)
    • classLoader

环境

夜神(Android5.1)

XposedInstaller(这里我用的是夜神软件商店下载的)


点击立即安装就行,切记:不要再去稀奇古怪找一些其它版本的,那样没办法激活的(即使有,也得费半天劲),自带的直接双击式安装

下载后直接点击version进行install


然后就会显示已激活

插件(i春秋教程教导)

过程

导入(注意这里不是libs,而是新建的lib)lib文件XposedBridgeApi-54.jar(把implemention改为provided模式,也就是不参与编译到最终文件中)

原来:

更改:

AndroidManifest.xml文件编写

<meta-data android:name="xposedmodule" android:value="true"/><meta-data android:name="xposeddescription" android:value="模块说明"/><meta-data android:name="xposedminversion" android:value="54"/>

<meta-data android:name="xposedmodule" android:value="true"/>

true的话,xposed尝试去加载apk作为插件的一部分

<meta-data android:name="xposeddescription" android:value="模块说明"/>

<meta-data android:name="xposedminversion" android:value="54"/>


或者在assets目录下的version文件里

入口类编写

package com.example.xposed; import android.app.Application; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;public class XposedEntry implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());} }class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}}

创建一个类继承IXposedHookLoadPackage,然后把接口函数handleLoadPackage进行相应的重写

findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());

hook函数的思路是先找到类,然后再近一步找到函数, findAndHookMethod的第一个参数是函数所在的类名(包名+类名),第二个参数Param.classLoader类装载器,第三个参数是函数名,第四个参数是函数所需要的参数(参数类型+class),第五个参数是回调函数(还需近一步实现)

回调函数编写

class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}}

创建一个类,继承XC_MethodHook,然后对beforeHookedMethod(函数调用前操作,举例 :直接让它别调这个函数)和afterHookedMethod(函数调用后操作,举例:直接把返回值(返回值在param中)更改再进行返回)

设置启动入口

创建assests文件,在文件夹中,新建xposed_init文件,写入入口类的信息


安装激活插件,重启即看到插件效果

可以看到,xp是在程序启动的时候同时加载的,因此它的钩子函数是区分进程的。如果有想对特定进程下钩的话可以很方便使用xposed。而挂钩函数方面可能没有Cydia那样容易写,不过有一个优点是,对于程序的类和参数,可以通过名字来进行下构。比如说,对于String类,类名是java.lang.String,那么传递的参数可以使“java.lang.String”,与传递String.class效果是一样的

xp的Hook分为函数执行前,和执行后两个位置,可以分别进行参数修改和结果修改。如果不想进行调用的话,可以在执行前使用setResult(NULL)参数

实战

times类

package com.example.xposed; import android.app.Application; import android.widget.Toast;import static android.widget.Toast.LENGTH_LONG;public class times {public void test(Application a){Toast.makeText(a, "点击成功",LENGTH_LONG).show();}}

hook掉times类中的test函数,让它不再调用

package com.example.xposed;import android.app.Application; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.callbacks.XC_LoadPackage;import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;public class XposedEntry implements IXposedHookLoadPackage {@Overridepublic void handleLoadPackage(XC_LoadPackage.LoadPackageParam Param) throws Throwable {findAndHookMethod("com.example.xposed.times",Param.classLoader,"test", Application.class,new myget_times());} }class myget_times extends XC_MethodHook{protected void beforeHookedMethod(MethodHookParam param) throws Throwable {param.setResult(null);}protected void afterHookedMethod(MethodHookParam param) throws Throwable {}

hook前(无这行代码param.setResult(null);)


hook后(有这行代码param.setResult(null);)

classLoader

与java上的类似,就是一个类装载器,与java不同的是,classLoader所加载的就是dex文件本身,所以通过程序的classLoader,可以取得程序的classLoader,可以取得程序的dex中所定义的所有类以及成员函数。同理,如果一个程序有多个dex,那么则会对应着多个classLoader,特别是使用动态加载的dex,则需要传递想要的classLoader才可以进行数据获取,这点请注意。

总结

以上是生活随笔为你收集整理的Xposed框架实战的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。