Xposed API详解
- Hook修改变量
- Hook普通方法
- 回调函数
- XC_MethodHook
- XC_MethodReplacement
- Hook获取参数与返回值
- 获取参数
- 获取返回值
- Hook构造函数
- 无参构造
- 有参构造
- Hook复杂函数
- Hook自定义类参数
- Hook替换函数与函数置空
- 替换函数
- 函数置空
- Hook内部类与匿名类
- 内部类
- 匿名类
- Xposed主动调用
Hook修改变量
- 静态变量(static):类被
初始化
,同步进行初始化 - 非静态变量:类被
实例化
(产生一个对象的时候),进行初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GjgzU9d-1636708324463)(F:\Xposed Hook.assets\image-20211110101349782.png)]
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;import de.robv.android.xposed.IXposedHookLoadPackage;
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...");//过滤包名if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {final Class clazz = XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo", lpparam.classLoader);//1、修改变量: @类的字节码 @变量名 @变量值XposedHelpers.setStaticIntField(clazz, "staticInt", 100);XposedHelpers.setStaticObjectField(clazz, "tage", "52Hz");}}
}
Hook普通方法
回调函数
回调函数常见的两种形式
XC_MethodHook
自定义Hook执行之前操作
自定义Hook执行之后操作
new XC_MethodHook() { //回调函数(方法)@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});
XC_MethodReplacement
替换函数
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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...");//过滤包名if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {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方法执行之前操作@Overrideprotected 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方法执行之后操作@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {Log.d("52Hz", "publicFunc is hooked after");//获取返回值:param.getResult()Log.d("52Hz", "传出参数:" + param.getResult());}});}}}
Hook获取参数与返回值
获取参数
//Hook方法执行之前操作@Overrideprotected 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方法执行之后操作@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {Log.d("52Hz", "publicFunc is hooked after");//获取返回值:param.getResult()Log.d("52Hz", "传出参数:" + param.getResult());}
Hook构造函数
构造函数:类实例化的时候被调用
无参构造
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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...");//过滤包名if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {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构造函数执行之前操作@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {//获取传入参数:param.args是一个列表,获取第一个则param.args[0]Log.d("52Hz", "构造函数参数:" + param.args[0]);}});}}}
有参构造
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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...");//过滤包名if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {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有参构造函数执行之前操作@Overrideprotected 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有参构造函数执行之后操作@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {Log.d("52Hz", "Constructor is hooked after");//获取返回值:param.getResult()Log.d("52Hz", "构造函数传出参数:" + param.getResult());}});}}}
Hook复杂函数
//5、Hook复杂方法:@方法名 @参数类型字节码 @回调函数// String str, String[][] strArr, Map<String,String>, ArrayList arrayList// String.class String[][].class Map.class ArrayList.classXposedHelpers.findAndHookMethod(clazz,"complexParameterFunc",//参数-startString.class, //java.lang.StringString[][].class, //[[Ljava.lang.StringMap.class, //Map.classArrayList.class, //Class.forName("java.util.ArrayList")//参数-endnew XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;import java.util.ArrayList;
import java.util.Map;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...");//过滤包名if (lpparam.packageName.equals("com.xiaojianbang.xposeddemo")) {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<String,String>, ArrayList arrayList// String.class String[][].class Map.class ArrayList.classXposedHelpers.findAndHookMethod(clazz,"complexParameterFunc",//参数-startString.class, //java.lang.StringString[][].class, //[[Ljava.lang.StringMap.class, //Map.classArrayList.class, //Class.forName("java.util.ArrayList")//参数-endnew XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}}}
Hook自定义类参数
//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.AnimalString.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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<String,String>, 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.AnimalString.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}}}
Hook替换函数与函数置空
替换函数
//7、替换函数 @类的字节码文件 @hook的方法名 @使用replace替换原方法XposedHelpers.findAndHookMethod(clazz,"replaceFunc",new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {Log.i("52Hz", "替换后的输出");return null;}});
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
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<String,String>, 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() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {Log.i("52Hz", "替换后的输出");return null;}});}}}
函数置空
//7、替换函数 @类的字节码文件 @hook的方法名 @使用replace替换原方法XposedHelpers.findAndHookMethod(clazz,"replaceFunc",new XC_MethodReplacement() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {return null;}});
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
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<String,String>, 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() {@Overrideprotected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {return null;}});}}}
Hook内部类与匿名类
内部类
内部类:一个类里面还有一个类
smali
//8、hook内部类 @hook的内部类:包名+类名+$+类名 @匿名类方法 @匿名类方法参数字节码XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),"innerFunc",String.class,new XC_MethodHook() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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<String,String>, 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() {@Overrideprotected void beforeHookedMethod(MethodHookParam param) throws Throwable {super.beforeHookedMethod(param);}@Overrideprotected void afterHookedMethod(MethodHookParam param) throws Throwable {super.afterHookedMethod(param);}});}}}
匿名类
匿名类:没有名称的类
Xposed主动调用
//8、hook内部类 @hook的内部类:包名+类名+$+类名 @匿名类方法 @匿名类方法参数字节码XposedHelpers.findAndHookMethod(XposedHelpers.findClass("com.xiaojianbang.xposeddemo.Demo$InnerClass", lpparam.classLoader),"innerFunc",String.class,new XC_MethodHook() {@Overrideprotected 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);}});
param.thisObject
获取其所属对象,最终得到InnerClass
package com.hz52.xposeddalvik;/*** @Program: XposedDalvik* @Description:* @Author: 52Hz* @CreationTime: 2021年11月09日 17:21 星期二**/import android.util.Log;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<String,String>, 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() {@Overrideprotected 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);}});}}}