Xposed API详解
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() { //回调函数(方法)
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected 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方法执行之前操作
@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());
}
});
}
}
}
Hook获取参数与返回值
获取参数
//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());
}
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构造函数执行之前操作
@Override
protected 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有参构造函数执行之前操作
@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());
}
});
}
}
}
Hook复杂函数
//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);
}
});
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.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);
}
});
}
}
}
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.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);
}
}
);
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);
}
}
);
}
}
}
Hook替换函数与函数置空
替换函数
//7、替换函数 @类的字节码文件 @hook的方法名 @使用replace替换原方法
XposedHelpers.findAndHookMethod(
clazz,
"replaceFunc",
new XC_MethodReplacement() {
@Override
protected 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() {
@Override
protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
Log.i("52Hz", "替换后的输出");
return null;
}
}
);
}
}
}
函数置空
//7、替换函数 @类的字节码文件 @hook的方法名 @使用replace替换原方法
XposedHelpers.findAndHookMethod(
clazz,
"replaceFunc",
new XC_MethodReplacement() {
@Override
protected 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() {
@Override
protected 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() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected 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() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected 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() {
@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);
}
}
);
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() {
@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);
}
}
);
}
}
}