本篇是《Android逆向入门教程》的第八章第1.3节,具体课程详情可点击下方图片查看:
每一章节详细内容及实验材料可通过加入底部免费的【Android逆向成长计划】星球获得!
声明:所有实验含部分虚构,纯属技术练习,未对真实环境造成任何影响。也请勿将相关技术用于非法操作,否则责任自负。
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.classLoader);
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[0]);
}
public void afterHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng=============after");
Log.d("after-获取参数", ""+param.args[0]);
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.classLoader);
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[0]);
}
public void afterHookedMethod(MethodHookParam param){
Log.d("Lvmeng","Lvmeng=============after");
Log.d("after-获取参数", ""+param.args[0]);
Log.d("Lvmeng", ""+param.getResult());
}
});
}
}
}
然后运行截图如下:
通过日志输出可以发现我们已经成功hook到complexParameterFunc的参数。
另外Hook参数列表即是获取列表的字节码,因此还有两种获取方式,均已获取字符串列表为例,一种是:
XposedHelpers.findClass("java.lang.String",lpparam.classLoader),
另一种为反射获取:
Class.forName("java.lang.String"),
其中反射函数forName有重载,一个是一个参数的,一个是三个参数的,其中三个参数的,可以指明classLoader,而我们一般可以选择三个参数的指明我们选取的类加载器。
团队公开知识库链接:
https://www.yuque.com/books/share/f7515884-c39f-4d2b-ab15-55921c8205b8?# 《WhITECat公开知识积累》密码:kstn
知识星球:
往期经典
安
全
扫描二维码 |关注我们
原文始发于微信公众号(WhITECat安全团队):Android逆向|Xposed Hook(中)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论