- 反射获取类方法并调用
- 反射获取类字段并修改
- 技巧
- 反射获取类字段
- 反射获取方法
- 获取私有函数
反射:在执行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);
}
}
);
}
}
}



