Xposed框架实战

环境

夜神(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 {
    @Override
    public 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 {
    @Override
    public 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才可以进行数据获取,这点请注意。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

寻梦&之璐

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

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

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

打赏作者

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

抵扣说明:

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

余额充值