xposed中hook的用法

1.普通的类中方法;

XposedHelpers.findAndHookMethod(clazz,//类
    "test",//方法名
    String::class.java,//参数
    object : XC_MethodHook() {
        @Throws(Throwable::class)
        override fun beforeHookedMethod(param: MethodHookParam) {
            Log.i(TAG, "正在替换参数:"+param)
            param.args[0] = "Haha, Android are hooked"
        }
    })

2.普通的类文件中的全局函数;

val packageName = "com.example.hooktarsget" // 包名
val className = "$packageName.MainActivityKt"//包中的类文件【注意类名后面加上Kt】

val gTestClass = lpparam.classLoader.loadClass(className)//加载这个特殊的类

剩下的与XposedHelpers.findAndHookMethod上面方式相同!

3.内部类的方法

 //hook 匿名内部类TestClass的a方法,并替换参数,通过美元符号 $ 连接内部类
    XposedHelpers.findAndHookMethod("com.example.hookdemo.MainActivity$TestClass", clazz.getClassLoader(),
            "a", String.class, new XC_MethodHook() {
                @Override
                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                }

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    param.setResult("我被hook了");
                }
            });

总结:

一:hook方法,基本都是要获取类的模版,然后都按照相同的方式去调用XposedHelpers.findAndHookMethod方法

二:对于需要修改变量的值的时候,通过param可以获得hook的对象param.thisObject。然后使用param.thisObject进行一些相应的操作!

// 查找并访问字段
val targetClass: Class<*> = param.thisObject.javaClass
val field = XposedHelpers.findField(targetClass, "name")
if (field != null) {
    // 修改字段值
    field.isAccessible = true
    field[param.thisObject] = "胜利的fork you!"
}

三:相应的XposedHelpers还有get,setfield方法用来获得和设置字段内容!

XposedHelpers.setObjectField

四:同时不仅可以hook目标方法从类修改参数之类的,还可以直接替换目标方法从而直接实现自己想要的逻辑。用的是

XC_Methodreplacement()

-=-=-==-=-=-=========--------------------------------------------------------------------------------

4.//hook 获取MainActivity的TextView控件,并修改器内容
    XposedHelpers.findAndHookMethod("com.example.hookdemo.MainActivity",
            loadPackageParam.classLoader,
            "onCreate",
            Bundle.class,
            new XC_MethodHook() {

                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    //获取到当前hook的类,这里是MainActivity
                    Class clazz = param.thisObject.getClass();
                    XposedBridge.log("class name:" + clazz.getName());
                    // 通过反射获取控件,无论parivate或者public
                    Field field = clazz.getDeclaredField("mTextView");
                    // 设置访问权限
                    field.setAccessible(true);
                    TextView textView = (TextView) field.get(param.thisObject);
                    String string = textView.getText().toString();
                    XposedBridge.log("原来的文案 " + string);
                    // 修改文案
                    textView.setText("我是被劫持修改啦");
                }
            }
    );
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值