栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Xposed Java反射大法

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Xposed Java反射大法

Java反射大法
      • 反射获取类方法并调用
      • 反射获取类字段并修改
      • 技巧
        • 反射获取类字段
        • 反射获取方法
      • 获取私有函数

反射获取类方法并调用
反射:在执行innerFunc函数之前获取reflect字段的值,并且调用ref1函数

反射获取类字段并修改 技巧 反射获取类字段

四种方法(clazz为类的字节码)

  • 获取公有字段:

    • getField:获取类的字段
    • getFields:获取当前类的所有字段:返回数组
  • 获取私有字段:

    不管什么类型都可以

    • getDeclaredField:获取类的字段
    • getDeclaredFields:获取当前类的所有字段:返回数组
反射获取方法

四种方法(clazz为类的字节码)

  • 获取公有方法:

    • getMethod:获取公有函数
    • getMethods:获取所有公有函数
  • 获取私有函数

    不管什么类型都可以

    • getDeclaredMethod:获取所有类型函数
    • getDeclaredMethods:获取所有类型函数搜索函数
//10、反射:在执行innerFunc函数之前获取reflect字段的值,并且11、调用ref1函数
            XposedHelpers.findAndHookMethod(
                    XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),
                    "innerFunc",
                    String.class,
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

                            //反射获取字段:     @获取类的字段
                            Field reffield = clazz.getDeclaredField("reflect");
                            //如果是private私有字段需要设置为true
                            reffield.setAccessible(true);

                            //reffield.get里面需要一个对象
                            //实例化:com.xiaojianbang.xposeddemo.Demo InnerClass
                            Object obj = clazz.newInstance();

                            //获取修改前字段值
                            String str = (String) reffield.get(obj);
                            Log.i("52Hz", "这是反射获取的字段:" + str);

                            //修改字段值
                            reffield.set(obj, "famshedafa");

                            //获取修改后字段值
                            String str2 = (String) reffield.get(obj);
                            Log.i("52Hz", "这是反射设置的字段:" + str2);


                            //11、找方法
                            Method refmethod = clazz.getDeclaredMethod("ref1");
                            //如果是private私有方法需要设置为true
                            refmethod.setAccessible(true);

                            //调用:invoke,这里调用了三次
                            refmethod.invoke(obj);
                            refmethod.invoke(obj);
                            refmethod.invoke(obj);
                        }
package com.hz52.xposeddalvik;



import android.util.Log;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;

public class Demo implements IXposedHookLoadPackage {
    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {
        Log.d("52Hz", "hooking...");

        //-1、需要hook的apk(包名)
        if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {

            //0、需要hook的类
            final Class clazz = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo", lpparam.classLoader);

            //1、修改变量: @类的字节码 @变量名 @变量值
//            XposedHelpers.setStaticIntField(clazz, "staticInt", 100);
//            XposedHelpers.setStaticObjectField(clazz, "tage", "52Hz");

            //2、普通方法:@类的字节码 @方法名 @方法参数类型字节码,指明(因为存在重载,不同参数,不同方法)@回调函数
//            XposedHelpers.findAndHookMethod(
//                    clazz,                              //hook的类的字节码
//                    "publicFunc",                       //hook方法名称
//                    String.class,                       //hook方法的传入参数类型字节码类型,可扩增
//                    new XC_MethodHook() {               //回调函数(方法)
//
//                        //Hook方法执行之前操作
//                        @Override
//                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                            Log.d("52Hz", "publicFunc is hooked before");
//
//                            //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
//                            Log.d("52Hz", "传入参数:" + param.args[0]);
//
//                        }
//
//                        //Hook方法执行之后操作
//                        @Override
//                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                            Log.d("52Hz", "publicFunc is hooked after");
//
//                            //获取返回值:param.getResult()
//                            Log.d("52Hz", "传出参数:" + param.getResult());
//
//                        }
//
//
//                    });


            //3.1、无参构造函数  @回调函数(因为不存在返回值,所以只beforeHookedMethod)
//            XposedHelpers.findAndHookConstructor(clazz, new XC_MethodHook() {
//                //Hook构造函数执行之前操作
//                @Override
//                protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                    //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
//                    Log.d("52Hz", "构造函数参数:" + param.args[0]);
//                }
//            });

            //3.2、有参构造函数 @参数类型字节码 @参数类型  @回调函数
//            XposedHelpers.findAndHookConstructor(
//                    clazz,
//                    String.class,
//                    new XC_MethodHook() {
//
//                        //Hook有参构造函数执行之前操作
//                        @Override
//                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                            Log.d("52Hz", "Constructor is hooked before");
//
//                            //获取传入参数:param.args是一个列表,获取第一个则param.args[0]
//                            Log.d("52Hz", "构造函数传入参数:" + param.args[0]);
//
//                        }
//
//                        //Hook有参构造函数执行之后操作
//                        @Override
//                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                            Log.d("52Hz", "Constructor is hooked after");
//
//                            //获取返回值:param.getResult()
//                            Log.d("52Hz", "构造函数传出参数:" + param.getResult());
//
//                        }
//
//                    });

            //5、Hook复杂方法:@方法名 @参数类型字节码  @回调函数
            //  String str,     String[][] strArr,      Map,     ArrayList arrayList
            //  String.class    String[][].class        Map.class               ArrayList.class
//            XposedHelpers.findAndHookMethod(
//                    clazz,
//                    "complexParameterFunc",
//                    //参数-start
//                    String.class,       //java.lang.String
//                    String[][].class,   //[[Ljava.lang.String
//                    Map.class,          //Map.class
//                    ArrayList.class,    //Class.forName("java.util.ArrayList")
//                    //参数-end
//                    new XC_MethodHook() {
//                        @Override
//                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                            super.beforeHookedMethod(param);
//                        }
//
//                        @Override
//                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                            super.afterHookedMethod(param);
//                        }
//                    });


            //6、需要hook的自定义类
            //final Class cls = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Animal",lpparam.classLoader);
//            final Class cls = Class.forName("com.xiaojianbang.xposeddemo.Animal",false,lpparam.classLoader);

            //6、    @hook类的字节码文件    @hook的方法    @方法参数1:hook自定义类的字节码文件   @方法参数2:
//            XposedHelpers.findAndHookMethod(
//                    clazz,
//                    "Inner",
//                    cls,        //com.xiaojianbang.xposeddemo.Animal
//                    String.class,
//                    new XC_MethodHook() {
//                        @Override
//                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                            super.beforeHookedMethod(param);
//                        }
//
//                        @Override
//                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                            super.afterHookedMethod(param);
//                        }
//                    }
//            );

            //7、替换函数    @类的字节码文件    @hook的方法名   @使用replace替换原方法
//            XposedHelpers.findAndHookMethod(
//                    clazz,
//                    "replaceFunc",
//                    new XC_MethodReplacement() {
//                        @Override
//                        protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
//                            Log.i("52Hz", "替换后的输出");
//                            return null;
//                        }
//                    }
//            );


            //8、hook内部类     @hook的内部类:包名+类名+$+类名    @匿名类方法      @匿名类方法参数字节码
//            XposedHelpers.findAndHookMethod(
//                    XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),
//                    "innerFunc",
//                    String.class,
//                    new XC_MethodHook() {
//
//
//                        @Override
//                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//
//                            Log.i("52Hz", "Xposed主动调用前");
//                            //9、xposed主动调用#方法:@不是静态方法需要先实例化大类.newInstance()  @方法名
//                            XposedHelpers.callMethod(
//                                    clazz.newInstance(),        //外面大类进行实例化:大类.newInstance()
//                                    "refl"
//                                    //  new Object[0]       //参数列表没有去除
//                            );
//                            Log.i("52Hz", "Xposed主动调用后");
//
//
//                            //param.thisObject获取当前所属的对象
//                            int cc = XposedHelpers.getIntField(param.thisObject, "innerPublicInt");
//                            Log.i("52Hz", " " + cc);
//
//                        }
//
//                    }
//
//            );


            //10、反射:在执行innerFunc函数之前获取reflect字段的值,并且11、调用ref1函数
            XposedHelpers.findAndHookMethod(
                    XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),
                    "innerFunc",
                    String.class,
                    new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

                            //反射获取字段:     @获取类的字段
                            Field reffield = clazz.getDeclaredField("reflect");
                            //如果是private私有字段需要设置为true
                            reffield.setAccessible(true);

                            //reffield.get里面需要一个对象
                            //实例化:com.xiaojianbang.xposeddemo.Demo InnerClass
                            Object obj = clazz.newInstance();

                            //获取修改前字段值
                            String str = (String) reffield.get(obj);
                            Log.i("52Hz", "这是反射获取的字段:" + str);

                            //修改字段值
                            reffield.set(obj, "famshedafa");

                            //获取修改后字段值
                            String str2 = (String) reffield.get(obj);
                            Log.i("52Hz", "这是反射设置的字段:" + str2);


                            //11、找方法
                            Method refmethod = clazz.getDeclaredMethod("ref1");
                            //如果是private私有方法需要设置为true
                            refmethod.setAccessible(true);

                            //调用:invoke,这里调用了三次
                            refmethod.invoke(obj);
                            refmethod.invoke(obj);
                            refmethod.invoke(obj);


                        }


                    }

            );


        }
    }

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/490678.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号