Android xposed hook使用总结

一、 HOOK JAVA 层函数的三要素获取:   目标类路径、 函数名、 参数 。


二、插件开发步骤

1. 以 导入 lib 文件 XposedBridgeApi-54.jar(不参与编译到最终文件中) 且用 AS 开发的你千万不要将其放在 libs

目录中,否则你会发现你的插件安装上却一直没有运行起来的尴尬情况 

AS中可以在配置文件配置 :

provided 'de.robv.android.xposed:api:53'
provided 'de.robv.android.xposed:api:53:sources'
 
2. AndroidManifest.xml 中添加框架信息:
<application> <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="这里填写模块说明信息"/> <meta-data android:name="xposedminversion" android:value="42"/> </application>
 
3.编写响应类并实现类 IXposedHookLoadPackage 接口 handleLoadPackage 函数方法: 
handleLoadPackage 函数的 findAndHookMethod 方法我们要提供 HOOK 目标的信息,参数为(类全路径,当前的 CLASSLOADERHOOK 的函数名,参数 1 类类型...参数 N 类类型, XC_MethodHook 的回调)
XposedHelpers.findAndHookMethod(类全路径, loader, 方法, 参数, new XC_MethodHook(){
......}
callMethod(类对象, 执行的方法,参数); // 主动执行想要hook的方法
Object activityThread = callStaticMethod(findClass("android.app.ActivityThread", null), "currentActivityThread");
 
4. 将响应类添加到框架启动文件 
新建 assests 文件夹, 并在其中新建 xposed_init 文件,写入插件入口类的信息
5. 安装我们的插件设置启用,并在机器重启后插件生效 
=================================================================================================================
 
以上步骤就可以完成简单的对app的hook了,但是对于某些参数例如 String[][] strAry, Map mp1, Map<Integer, String> mp3,
ArrayList<String> al1, ArgClass ac 这些该怎么办呢?
 
用反射调用的方式 可以看出
String[][] ==> [[Ljava/lang/String;
Map 数组不论何种形式 ==> Ljava/util/Map;
ArrayList 无论何种形式 ==> Ljava/util/ArrayList;
ArgClass ac 自定义类给个全路径的事==> Laqcxbom/xposedhooktarget/ArgClass; 
 
public class XposedMain implements IXposedHookLoadPackage
{
public String TAG = "AqCxBoM" ;
private final String mStrPackageName = "aqcxbom.xposedhooktarget"; //HOOK APP 目标的包名
private final String mStrClassPath = "aqcxbom.xposedhooktarget.MyClass";//HOOK 目标类全路径
private final String mStrMethodName = "fun1"; //HOOK 目标函数名
private void LOGI(String ct){ Log.d(TAG, ct); }
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//判断包名是否一致
if (loadPackageParam.packageName.equals(mStrPackageName)) {
LOGI("found target: " + loadPackageParam.packageName);
final Class<?> ArgClass= XposedHelpers.findClass("aqcxbom.xposedhooktarget.ArgClass", loadPackageParam.classLoader);
final Class<?> ArrayList= XposedHelpers.findClass("java.util.ArrayList", loadPackageParam.classLoader);
final Class<?> Map= XposedHelpers.findClass("java.util.Map", loadPackageParam.classLoader);
//包名一致时查找是否有匹配参数的类及函数
XposedHelpers.findAndHookMethod(mStrClassPath, //类路径
loadPackageParam.classLoader, //ClassLoader
mStrMethodName, //目标函数名
"[[Ljava.lang.String;", //参数 1
Map, //参数 2
Map, //参数 3
Map, //参数 4
ArrayList, //参数 5
ArrayList, //参数 6
ArgClass, //参数 7
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param); //这个函数会在被 hook 的函数执行前执行
LOGI("beforeHook");
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);//这个函数会在被 hook 的函数执行后执行
LOGI("afterHooke param: ");
}
});
}
}
} 
 
这样就可以找到该参数的类了  



 
 
 
 
 
 




 
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值