Xposed hook Multidex 和动态加载的解决方法
Xposed hook Multidex 和动态加载的解决方法
blitzfeng 发表于5个月前
Xposed hook Multidex 和动态加载的解决方法
  • 发表于 5个月前
  • 阅读 60
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

    现在应用的体积越来越大,方法数突破65K上限越来越多,有的采用了Multidex方案,有的使用动态加载,而用Xposed 直接hook Multidex的其他dex,或者动态加载里的方法,会触发异常。这两种方式的解决方法不同,下面给出方案:

    由于android最开始并没有把classes2.dex(代表Multidex)和动态加载的dex加载进入,导致Xposed无法识别。针对Multidex,先hook这个应用的Application类,在afterHookedMethod里在hook你想要的类,以google play service为例:

          XposedHelpers.findAndHookMethod("com.google.android.gms.common.app.GmsApplication", lpp.classLoader, "onCreate", new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    final Class cls = XposedHelpers.findClass("owr", lpp.classLoader);
                    Class oxaCls = XposedHelpers.findClass("oxa", lpp.classLoader);
                    XposedHelpers.findAndHookConstructor(cls, Context.class, Executor.class, oxaCls, new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            Field url = XposedHelpers.findField(cls, "m");
                            url.setAccessible(true);
                            url.set(param.thisObject, "");
                        }
                    });

                }
            });

gms有5个dex文件,我想要hook的“owr”类在第三个dex文件中,先hook Application,再hook目标方法。如果该应用没有继承Application的类,那直接hook Application也可以。

    上面的方法对于动态加载并不适用,针对动态加载,先hook目标类的父类,假如目标是自定义的ImageView,则hook ImageView,在afterHookedMethod就有你的目标类,通过这个类来获得classloader。

            Class imageCls = XposedHelpers.findClass("android.widget.ImageView",lpp.classLoader);
            XposedBridge.hookAllConstructors(imageCls, new XC_MethodHook() {
                @Override
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                    final Object imageObj = param.thisObject;
                    String name = imageObj.getClass().getName();
                    XposedBridge.log("name:"+name);
                    if("com.xx.yy".equals(name)){
                        XposedHelpers.findAndHookMethod("com.xx.yy", imageObj.getClass().getClassLoader(), "a", new XC_MethodHook() {
                            @Override
                            protected void afterHookedMethod(MethodHookParam param) throws Throwable {

                            }
                        });
                    }

                }
            });

目标是com.xx.yy 的a方法,imageObj.getClass().getClassLoader()才是真正需要的classloader。

共有 人打赏支持
粉丝 0
博文 8
码字总数 3993
×
blitzfeng
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: