从零开始自学了半年Android逆向反编译,写个博客记录下xPosed框架中的几个常见的反射方法。
一:对Class类的HOOK反射
① 反射类,获取该类;
/** hook某类 */ Class> clazz = XposedHelpers.findClass("类的路径", classLoader);
② 反射类,获取该类是否存在;
/** hook某类是否存在 */ Class> clazz = XposedHelpers.findClassIfExists("类的路径", classLoader);
③ 反射类,获取该类,可以取出传入该类的数据
/** hook类 */ XposedBridge.hookAllConstructors(clazz, 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); } });
二:对方法类的HOOK反射
① 反射某类中的方法,获取该方法,可以取出传入该方法的数据
XposedHelpers.findAndHookMethod("类的路径", classLoader, "类里的方法", "方法传入的值", 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); /** 反射方法后 */ } });
② 反射某类中的方法,获取该方法,可以取出传入该方法的数据
/** hook某路径类方法 */ XposedHelpers.findAndHookMethod(clazz, "类里的方法", "方法传入值", new XC_MethodHook() { @Override protected void beforeHookedMethod(MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); /** hook某路径类中的方法 */ Object objectField = XposedHelpers.getObjectField(param.thisObject, "方法变量"); } @Override protected void afterHookedMethod(MethodHookParam param) throws Throwable { super.afterHookedMethod(param); } });
③ 获取某类中的全部方法,并进行遍历,可以取出传入该方法的数据
/** 遍历类中的方法 */ for (Method method : clazz.getDeclaredMethods()) { if (method.getName().equals("方法") && !Modifier.isAbstract(method.getModifiers()) && Modifier.isPublic(method.getModifiers())) { XposedBridge.hookMethod(method, 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); } }); } }
④ 反射某类中的方法,获取该方法,可以取出传入该方法的数据
/** hook类中的方法 */ XposedBridge.hookAllMethods(clazz, "方法", 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); } });
以上是获取反射类,若目前常用的就是这些方法,接下来介绍下怎么进行重新创建:
①对类进行创建
Object object = XposedHelpers.newInstance(clazz, "需要传入的值");
②对类里的公用方法的重获取
Object object = XposedHelpers.callStaticMethod(clazz, "该类中的公用方法", "需要传入的值");
③对类里的方法的重获取
Object object = XposedHelpers.callMethod("HOOK某类的对象", "该类中的公用方法", "需要传入的值");