前言:最近在学习Xposed,想Hook一些方法返回类型和类,但是有的时候不知道到底怎么写返回参数,和传递参数,这里自己做一个学习过程的笔记。
一、获取返回值以及参数,基本数据类型。
获取一些返回字段 int、String、Byte、这些类型。
Hook代码
private void hookAvatrPathPlay(ClassLoader classLoader) {
//图片存放位置
try {
XposedHelpers.findAndHookMethod("com.tencent.mm.a.e", classLoader, "e",String.class,int.class,int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//返回值
byte[] byte1 = (byte[]) param.getResult();
//第一个参数
String str1 = (String) param.args[0];
//第二个参数
int int1= (int) param.args[1];
//第三个参数
int int2= (int) param.args[2];
Log.d(TAG, "hook:======emoji==str1==="+ str1);
Log.d(TAG, "hook:======emoji==int1==="+ int1);
Log.d(TAG, "hook:======emoji==int2==="+ int2);
Log.d(TAG, "hook:======emoji==byte1==="+ Arrays.toString(byte1));
super.afterHookedMethod(param);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
二、获取返回值以及参数,对象引用类型。
Hook代码
private void hookWechatStorage(ClassLoader classLoader) {
//表情存放位置
try {
XposedHelpers.findAndHookMethod("com.tencent.mm.plugin.card.ui.k", classLoader, "nV",int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//返回值
Object result = param.getResult();
Object hwR = result.getClass().getField("hwR").get(result);
Log.d(TAG, "afterHookedMethod: ======="+hwR);
super.afterHookedMethod(param);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
三、获取返回值以及参数,参数是对象类型。
Hook代码
private void hookTest(ClassLoader classLoader) {
//表情存放位置
String className="com.tencent.mm.ax.a";
String methodName="a";
Class<?> aClass1 = XposedHelpers.findClass("com.tencent.mm.network.e", classLoader);
Class<?> aClass2 = XposedHelpers.findClass("com.tencent.mm.ac.e", classLoader);
try {
XposedHelpers.findAndHookMethod(className, classLoader, methodName,aClass1,aClass2,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//返回值
int result = (int) param.getResult();
//第一个参数
Log.d(TAG, "hook:======result==="+ result);
super.afterHookedMethod(param);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
四、打印方法调用的地方,通过打印堆栈信息。
Hook代码
private void hookGetStackTraceString(ClassLoader classLoader) {
try {
XposedHelpers.findAndHookMethod("com.tencent.mm.a.e", classLoader, "e",String.class,int.class,int.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//通过主动抛异常,来通过打印堆栈信息,锁定报错的地方,也就是调用的位置。
try {
throw new NullPointerException();
} catch (Exception e) {
Log.d(TAG, "hook:======emoji: -getStackTraceString----"+Log.getStackTraceString(e));
}
super.afterHookedMethod(param);
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
日志信息