云计算百科
云计算领域专业知识百科平台

Xposed Hook 钱庄 APP 常见问题及解决方案

一、问题1:为何需先 Hook 壳 Application 的 onCreate 方法再 Hook 目标类/方法

问题描述

Hook APP 内部类/方法前,需先 Hook 壳 Application(路径:com.secneo.waer.A*)的 onCreate 方法,直接 Hook 目标方法会导致失败。

根本原因

钱庄 APP 为加固包(加固壳),类加载存在“加密→解密”的特殊过程:

  • 普通 APP:android.app.Application.onCreate 执行时,所有类已完成加载;

  • 加固 APP:

    • 启动初期(handleLoadPackage 阶段),目标类(如 com..core..BizCls,为APP内承载具体业务逻辑的类,非壳Application类;其中“core”代表核心业务模块,“BizCls”是“Business Class”缩写,即业务类,例如下单、支付、数据请求等功能对应的类)仅为“加密壳引用”,非真实解密类;

    • 仅当壳 Application(负责APP启动初始化的入口类,非业务类,路径:com.secneo.waer.A*)的 onCreate 方法执行完成后,壳才会对核心类(含上述 BizCls 业务类)进行解密与初始化,此时获取的 Class 对象为可用的真实类。

  • 解决方案

    将 Hook 目标方法的逻辑,置于壳 Application 的 onCreate 方法的 afterHookedMethod 中执行,确保目标类已完成解密:

    // 先Hook壳的onCreate,再Hook目标方法
    XposedHelpers.findAndHookMethod(
    "com.secneo.***w*a**er.A*", // 壳Application类名
    lpparam.classLoader, // 壳的类加载器
    "onCreate",
    new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    super.afterHookedMethod(param);
    // 此时类已解密,可安全Hook目标方法
    hookSendShark(lpparam.classLoader);
    }
    }
    );

    关键结论

    • 加固包 Hook 最优时机:壳 onCreate 执行后 → 目标类解密完成 → Hook 目标方法,该时机稳定性最高;

    • 直接在 handleLoadPackage 中 Hook 目标方法,会因获取的是“加密空壳类”,导致 Hook 无响应。

    补充:未加固 APP 的 Hook 时机适配及 Application 入口查找方式

    若目标 APP 无加固,无需 Hook 壳 Application,直接 Hook 系统通用 Application 基类(android.app.Application)的 onCreate 方法即可,此时类加载已完成,Hook 稳定性更高:

    // 未加固APP:Hook系统Application的onCreate
    XposedHelpers.findAndHookMethod(
    "android.app.Application", // 通用Application基类,兼容所有未加固APP
    lpparam.classLoader, // 目标APP的类加载器
    "onCreate",
    new XC_MethodHook() {
    @Override
    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
    super.afterHookedMethod(param);
    // 未加固APP此时类已加载完成,可安全Hook目标方法
    hookSendShark(lpparam.classLoader);
    }
    }
    );

    场景对比总结:

    • 未加固 APP:Hook android.app.Application.onCreate,通用且稳定,无需考虑壳解密逻辑;

    • 加固 APP(如钱庄 APP):必须 Hook 壳 Application(com.secneo.waer.A*)的 onCreate,等待类解密后再 Hook 目标方法。

    查找目标APP的Application入口,并非只能依赖代码层面Hook推测,还可通过以下两种方式精准定位,且两种方式获取的入口效果一致,均可作为Hook目标:

  • 项目源码层面(有APP项目权限时):APP的Application入口类,可在项目assets文件夹下的xposed_init文件中查看。
    在这里插入图片描述

  • 反编译层面(无源码时):通过APKTool、JADX等工具反编译APK,打开根目录下的AndroidManifest.xml文件,查找标签,其中android:name属性对应的类路径,即为该APP的Application入口类。

  • 无论通过哪种方式定位到的Application入口,其核心作用均为APP启动初始化,Hook对应的onCreate方法,均可达到等待类加载/解密完成的效果,无需局限于某一种查找方式。

    二、问题2:MethodHookParam 仅在 handleLoadPackage 中无报错,自定义方法中报错

    问题描述

    在 handleLoadPackage 方法内使用 XC_MethodHook.MethodHookParam 无报错,在自定义方法(如 hookSharkFramework)中使用时,IDEA 会出现爆红及编译报错。

    根本原因

    • 报错本质为导入路径错误与作用域缺失,二者共同导致 IDEA 无法识别 MethodHookParam,最终引发爆红;

    • MethodHookParam 是 XC_MethodHook 的内部类,非顶级类,其作用域依赖 XC_MethodHook 类的可见性,正确导入路径为 de.robv.android.xposed.XC_MethodHook.MethodHookParam;

    • 场景差异导致作用域识别差异:

      • handleLoadPackage 方法:作为 IXposedHookLoadPackage 接口的实现方法,该接口来源于 de.robv.android.xposed.callbacks.XC_LoadPackage 包。Xposed 框架初始化时,会自动关联 XC_MethodHook 相关类的作用域,且该方法运行于 Xposed 核心回调环境中,IDEA 可通过环境上下文自动识别 MethodHookParam,无需额外显式导入,因此无作用域缺失问题;

      • 自定义方法(如 hookSharkFramework):属于手动定义的普通方法,脱离了 Xposed 核心回调环境,IDEA 无法通过上下文自动关联 MethodHookParam 的作用域。若未手动导入该类,IDEA 会判定其为“未定义符号”并爆红;若导入路径错误,也会因作用域不匹配导致识别失败。

    解决方案

  • 全局正确导入对应类:
  • // 必须导入此路径,避免自定义方法中报错
    import de.robv.android.xposed.XC_MethodHook.MethodHookParam;

  • 在自定义方法中显式使用:
  • // 自定义方法中使用MethodHookParam,需通过显式导入确保识别
    private void hookSendShark(ClassLoader classLoader) {
    XposedHelpers.findAndHookMethod(
    "com.***.core.***.BizCls", // BizCls:业务类,承载具体功能逻辑(如sendShark为数据请求方法),非壳Application
    classLoader,
    "sendShark",
    new Object[]{… , new XC_MethodHook() {
    // 已通过全局导入识别MethodHookParam,无爆红问题
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    super.beforeHookedMethod(param);
    }
    }}
    );
    }

    关键结论

    • handleLoadPackage 中无报错,因该方法为 IXposedHookLoadPackage 接口方法,Xposed 环境已自动识别相关类;

    • 自定义方法中需手动导入 MethodHookParam,且确保包路径正确(无 callbacks 子包),方可避免报错。

    补充:两个核心导入包的区别及适用场景

    以下两个核心包功能不同,需根据开发需求针对性导入,核心区别如下:

    import de.robv.android.xposed.XC_MethodHook; // 核心Hook方法类
    import de.robv.android.xposed.callbacks.XC_LoadPackage; // 包加载回调类

    1. de.robv.android.xposed.XC_MethodHook

    作用:提供方法 Hook 的核心能力,是实现 beforeHookedMethod(Hook 前执行)、afterHookedMethod(Hook 后执行)的基础类,同时包含内部类 MethodHookParam(用于获取 Hook 方法的参数、返回值等信息)。

    适用场景:解决自定义方法中 MethodHookParam 爆红问题的核心包。因 MethodHookParam 是该类的内部类,导入此类方可间接使用 MethodHookParam,避免 IDEA 爆红。

    2. de.robv.android.xposed.callbacks.XC_LoadPackage

    作用:提供包加载相关的回调接口和类,核心为 IXposedHookLoadPackage 接口(handleLoadPackage 方法来源于此接口),同时包含 XC_LoadPackage.LoadPackageParam 类(用于获取当前加载包的类加载器、包名等信息)。
    在这里插入图片描述

    适用场景:与 MethodHookParam 爆红问题无关,仅当需在 handleLoadPackage 中操作包加载信息(如通过包名过滤目标 APP、获取 lpparam.classLoader)时,需导入此类。

    总结:导入包选择建议
    • 解决 MethodHookParam 在自定义方法中爆红:仅需导入 de.robv.android.xposed.XC_MethodHook(或更精准的 de.robv.android.xposed.XC_MethodHook.MethodHookParam),无需导入第二个包;

    • 操作包加载信息:需导入 de.robv.android.xposed.callbacks.XC_LoadPackage;

    • 实际开发中,两个包常同时导入以覆盖 Hook 方法与包加载场景,但针对 MethodHookParam 爆红问题,核心依赖第一个包。

    三、问题3:findAndHookMethod 重载函数的参数混淆(ClassLoader 是否需要传)

    问题描述

    findAndHookMethod 的重载函数中,第二个参数有时为 ClassLoader,有时为 String methodName,传入 ClassLoader 时出现报错,不传入则正常运行。

    核心知识点:两个核心重载函数对比

    重载函数1(传类名字符串)重载函数2(传 Class 对象)
    格式:findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object… args) 格式:findAndHookMethod(Class<?> clazz, String methodName, Object… args)
    第二个参数:必须传 ClassLoader(用于加载指定类名的类) 第二个参数:直接为 methodName(无需传 ClassLoader,因 Class 对象已关联类加载器)
    适用场景:加固包(通过类名+类加载器精准加载解密类) 适用场景:已获取 Class 对象的普通场景

    常见错误场景

    混淆重载函数参数的错误写法:

    // 错误:传了Class对象,额外多传ClassLoader
    XposedHelpers.findAndHookMethod(
    sharkClazz, // Class对象(重载2的第一个参数)
    classLoader, // 多余参数(重载2无此参数)
    "sendShark", // 应为重载2的第二个参数,误变为第三个
    new Class<?>[]{…}
    );

    正确写法

  • 使用重载函数1(类名字符串+ClassLoader):
  • XposedHelpers.findAndHookMethod(
    "com.***.core.***.BizCls", // 类名字符串
    lpparam.classLoader, // 必须传ClassLoader
    "sendShark", // 方法名
    new Object[]{…}
    );

  • 使用重载函数2(Class 对象):
  • XposedHelpers.findAndHookMethod(
    sharkClazz, // Class对象
    "sendShark", // 直接写方法名(无需传ClassLoader)
    new Object[]{…}
    );

    关键结论

    • 传入 Class 对象时,第二个参数直接写 methodName,无需传 ClassLoader;

    • 传入类名字符串时,第二个参数必须传 ClassLoader,否则无法加载目标类。

    四、问题4:findAndHookMethod 的 Object… args 参数格式错误(Class 数组 vs Object 数组)

    问题描述

    使用 new Class<?>[]{参数类型} 传递目标方法入参类型时 Hook 失败,替换为 new Object[]{参数类型+回调} 后执行成功。

    根本原因

    findAndHookMethod 的最后一个参数为 Object… args(可变参数),需遵循以下规则:

  • 可变参数中,需先依次放入目标方法的参数类型(单个 Class 对象),最后放入 XC_MethodHook 回调;

  • 若使用 new Class<?>[]{…},该数组会被识别为“单个 Class 数组参数”,而非“多个 Class 参数”,导致目标方法签名匹配失败,进而 Hook 失效。

  • 常见错误写法

    // 错误:Class数组被当作单个参数,Xposed会查找“参数为Class数组”的目标方法
    XposedHelpers.findAndHookMethod(
    sharkClazz,
    "sendShark",
    new Class<?>[]{sharkHttpEntityClazz, Integer.TYPE, iSharkCallBack2Clazz, Long.TYPE}, // 错误:Class数组
    new XC_MethodHook(){…} // 被当作第二个可变参数,非回调
    );

    正确写法

    // 正确:Object数组中依次放入参数类型+回调
    XposedHelpers.findAndHookMethod(
    sharkClazz,
    "sendShark",
    new Object[]{
    sharkHttpEntityClazz, // 参数类型1
    Integer.TYPE, // 参数类型2
    iSharkCallBack2Clazz, // 参数类型3
    Long.TYPE, // 参数类型4
    new XC_MethodHook(){ // 最后放入回调(必须在Object数组内)
    @Override
    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
    Log.d(TAG, "sendShark触发:" + Arrays.toString(param.args));
    }
    }
    }
    );

    关键结论

    • Object… args 的正确格式为:[参数类型1, 参数类型2, …, XC_MethodHook 回调];

    • 禁止用 Class[] 包裹参数类型,需将每个参数类型及回调直接放入 Object 数组中。


    最终关键总结(快速查阅版)

    问题类型核心避坑点
    Hook 时机 加固包必须在壳 onCreate 的 afterHookedMethod 中 Hook 目标方法
    MethodHookParam 报错 自定义方法中需导入 de.robv.android.xposed.XC_MethodHook.MethodHookParam
    findAndHookMethod 重载 传 Class 对象→无 ClassLoader;传类名字符串→必须传 ClassLoader
    Object… args 格式 用 Object 数组放“参数类型+回调”,不用 Class 数组包裹参数类型
    (注:文档部分内容可能由 AI 生成)

    (注:文档部分内容可能由 AI 生成)

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Xposed Hook 钱庄 APP 常见问题及解决方案
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!