前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android逆向|Xposed Hook(中)

Android逆向|Xposed Hook(中)

作者头像
辞令
发布2022-05-17 10:50:30
1.9K0
发布2022-05-17 10:50:30
举报
文章被收录于专栏:WhITECat安全团队WhITECat安全团队

本篇是《Android逆向入门教程》的第八章第1.3节,具体课程详情可点击下方图片查看:

声明:所有实验含部分虚构,纯属技术练习,未对真实环境造成任何影响。也请勿将相关技术用于非法操作,否则责任自负。

0x01 Hook复杂参数

在我们Hook的时候经常会遇到一些复杂类型的参数,如map、二维数组、自定义类型和集合等参数,这个时候我们应该如何传入我们的参数列表的字节码?本小节将介绍几种方法来传入复杂参数的字节码。

在这里我们还是以上一次案例为例

我们这次要Hook的函数为complexParameterFunc(String,String,Map,ArrayList),其中的参数有复杂类型参数,那我们最常规的一种hook参数列表的方式为”类型.class”。代码如下:

代码语言:javascript
复制
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为例。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-04-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WhITECat安全团队 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x01 Hook复杂参数
  • 0x02 Hook自定义参数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档