官网:https://api.xposed.info/reference/packages.html
接口实现
posed框架拥有下方三个接口,我们编写hook脚本基本上使用handleLoadPackage即可
public class HookText implements IXposedHookLoadPackage, IXposedHookInitPackageResources, IXposedHookZygoteInit {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
// 对APP进行一些hook操作
}
@Override
public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
// 修改静态资源
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
// hook时机比较早 可以修改系统属性相关操作
}
}
Hook
public class HookText implements IXposedHookLoadPackage, IXposedHookInitPackageResources, IXposedHookZygoteInit {
private static final String TAG = "log-->";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
// 对APP进行一些hook操作
HookStatic(lpparam);
HookCz(lpparam);
HookConstructor(lpparam);
HookInnerClass(lpparam);
CallMethod(lpparam);
}
@Override
public void handleInitPackageResources(XC_InitPackageResources.InitPackageResourcesParam resparam) throws Throwable {
// 修改静态资源
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
// hook时机比较早 可以修改系统属性相关操作
}
}
静态方法
public static void HookStatic(XC_LoadPackage.LoadPackageParam lpparam) {
Class<?> Utils = XposedHelpers.findClassIfExists("com.myapp.com.Utils", lpparam.classLoader);
XposedHelpers.findAndHookMethod(Utils, "getSum", int.class, int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
int arg1 = (int) param.args[0];
int arg2 = (int) param.args[0];
Log.d(TAG, "beforeHookedMethod: " + arg1 + "|" + arg2);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "afterHookedMethod: " + param.getResult());
}
});
}
重载方法
public static void HookCz(XC_LoadPackage.LoadPackageParam lpparam) {
Class<?> Utils = XposedHelpers.findClassIfExists("com.myapp.com.Utils", lpparam.classLoader);
XposedHelpers.findAndHookMethod(Utils, "getCz", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d(TAG, "hook不带参数beforeHookedMethod: args" + param.args[0]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "hook不带参数afterHookedMethod: " + param.getResult());
}
});
XposedHelpers.findAndHookMethod(Utils, "getCz", int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d(TAG, "hook带参数beforeHookedMethod: args" + param.args[0]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "hook带参数afterHookedMethod: " + param.getResult());
}
});
// 当参数是一个类时可通过包名.类名进行传入
XposedHelpers.findAndHookMethod(Utils, "getCz", "com.myapp.com.Money", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
Log.d(TAG, "hook带方法beforeHookedMethod: args" + param.args[0]);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
Log.d(TAG, "hook带方法afterHookedMethod: " + param.getResult());
}
});
}
构造方法
public static void HookConstructor(XC_LoadPackage.LoadPackageParam lpparam) {
Class<?> Money = XposedHelpers.findClassIfExists("com.myapp.com.Money", lpparam.classLoader);
XposedHelpers.findAndHookConstructor(Money, String.class, int.class, new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
// 获取原始参数值
String originalName = (String) param.args[0];
int originalNum = (int) param.args[1];
Log.d(TAG, "beforeHookedMethod: " + originalName + originalNum);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 获取 Money 对象实例
Object moneyObject = param.thisObject;
// 使用 XposedHelpers 设置实例变量的值
XposedHelpers.setObjectField(moneyObject, "name", "小明");
XposedHelpers.setIntField(moneyObject, "num", 123);
super.afterHookedMethod(param);
Log.d(TAG, "afterHookedMethod: " + param.getResult());
}
});
}
内部类
private void HookInnerClass(XC_LoadPackage.LoadPackageParam lpparam) {
Class<?> innerClass = XposedHelpers.findClassIfExists("com.myapp.com.Utils$innerClass", lpparam.classLoader);
XposedHelpers.findAndHookMethod(innerClass, "getName", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
// 在方法调用前插入你的逻辑,例如,可以访问内部类的字段值
String name = (String) XposedHelpers.getObjectField(param.thisObject, "name");
int num = (int) XposedHelpers.getIntField(param.thisObject, "num");
Log.d(TAG, "beforeHookedMethod: " + name + ", " + num);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
// 在方法调用后插入你的逻辑,例如,可以访问方法的返回值
super.afterHookedMethod(param);
Log.d(TAG, "afterHookedMethod: " + param.getResult());
}
});
}
主动调用
private void CallMethod(XC_LoadPackage.LoadPackageParam lpparam) {
Class<?> Utils = XposedHelpers.findClassIfExists("com.myapp.com.Utils", lpparam.classLoader);
// 主动调用静态方法
Object results1 = XposedHelpers.callStaticMethod(Utils, "静态方法名称");
// 主动调用重载类型静态方法
Object results2 = XposedHelpers.callStaticMethod(Utils, "重载方法名称","重载方法参数");
// 获取静态字段的值
String flagValue = (String) XposedHelpers.getStaticObjectField(Utils, "字段名称");
// 设置静态字段值的值
XposedHelpers.setStaticObjectField(Utils, "字段名称", "字段值");
// 创建实例对象
Object myInstance = XposedHelpers.newInstance(Utils, "初始化值");
// 调用实例方法
Object result = XposedHelpers.callMethod(myInstance, "方法名称");
// 设置对象实例的字段值
XposedHelpers.setObjectField(myInstance, "字段名称", "字段值");
}