8.1.3 Xposed Hook-中(第五十八课)
以下为图文内容:8.1.3 Xposed Hook-中
0x01 Hook复杂参数
在我们Hook的时候经常会遇到一些复杂类型的参数,如map、二维数组、自定义类
型和集合等参数,这个时候我们应该如何传入我们的参数列表的字节码?本小节将介绍几
种方法来传入复杂参数的字节码。
在这里我们还是以上一次案例为例
我们这次要Hook 的函数为
complexParameterFunc(String,String,Map,ArrayList),其中的参数有复杂类型参数,
那我们最常规的一种hook参数列表的方式为”类型.class”。代码如下:
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import android.util.Log;
public class Hook implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws
Throwable {
if (lpparam.packageName.equals("com.feichen.xposeddemo")){
final Class clazz =
XposedHelpers.findClass("com.feichen.xposeddemo.Demo",lpparam.classLoad
er);
XposedHelpers.findAndHookMethod(clazz,
//Hook参数列表方式一:类型.class
"complexParameterFunc",
String.class,
String[][].class,
Map.class,
ArrayList.class,
new XC_MethodHook(){
public void beforeHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng===============before");
Log.d("before-获取参数", ""+param.args);
}p
ublic void afterHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng=============after");
Log.d("after-获取参数", ""+param.args);
Log.d("Lvmeng", ""+param.getResult());
}
});
}
}
}
然后运行效果如下:
通过日志输出可以发现我们已经成功hook到complexParameterFunc的参数。
0x02 Hook自定义参数
对于一些自定义类型的参数,很显然类型.class是不可取的,那么我们介绍另外一种
方式,即该方法所在的全路径,还是以complexParameterFunc为例。
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import android.util.Log;
public class Hook implements IXposedHookLoadPackage {
public void handleLoadPackage(final LoadPackageParam lpparam) throws
Throwable {
if (lpparam.packageName.equals("com.feichen.xposeddemo")){
final Class clazz =
XposedHelpers.findClass("com.feichen.xposeddemo.Demo",lpparam.classLoad
er);
XposedHelpers.findAndHookMethod(clazz,
//Hook参数列表方式二:该方法所在的全路径
"complexParameterFunc",
"java.lang.String",
"[[Ljava.lang.String;",
“java.util.Map",
“java.util.ArrayList”,
new XC_MethodHook(){
public void beforeHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng===============before");
Log.d("before-获取参数", ""+param.args);
}p
ublic void afterHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng=============after");
Log.d("after-获取参数", ""+param.args);
Log.d("Lvmeng", ""+param.getResult());
}
});
}
}
}
然后运行截图如下:
通过日志输出可以发现我们已经成功hook到complexParameterFunc的参数。
另外Hook参数列表即是获取列表的字节码,因此还有两种获取方式,均已获取字符
串列表为例,一种是:
XposedHelpers.findClass("java.lang.String",lpparam.classLoader),
另一种为反射获取:
Class.forName("java.lang.String"),
其中反射函数forName有重载,一个是一个参数的,一个是三个参数的,其中三个参数
的,可以指明classLoader,而我们一般可以选择三个参数的指明我们选取的类加载器。
这个必须得顶 谢谢大神666 你好,谢谢你得热心分享 多谢分享
谢谢大佬分享 感谢分享!!