文档章节

Xposed hook Multidex 和动态加载的解决方法

blitzfeng
 blitzfeng
发布于 2017/07/14 10:02
字数 382
阅读 559
收藏 0

    现在应用的体积越来越大,方法数突破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。

© 著作权归作者所有

共有 人打赏支持
blitzfeng
粉丝 0
博文 8
码字总数 3993
作品 0
程序员
私信 提问
Xposed模块的开发

Xposed模块的开发 snowdream - Impossible is nothing!2017-06-0631 阅读 android 作者:snowdream Email:yanghui1986527#gmail.com Github: https://github.com/snowdream QQ 群: 5293276......

snowdream - Impossible is nothing!
2017/06/06
0
0
Android逆向之旅---获取加固后应用App的所有方法信息

一、前言 在逆向应用的时候,我们有时候希望能够快速定位到应用的关键方法,在之前我已经详细介绍了一个自己研发的代码动态注入工具icodetools,来进行动态注入日志信息到应用中,不了解的同...

guozhendan
2017/04/05
0
0
Android逆向之旅---获取加固后应用App的所有方法信息

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangwei0910410003/article/details/54982476 一、前言 在逆向应用的时候,我们有时候希望能够快速定位到应用...

尼古拉斯_赵四
2017/03/20
0
0
那些年Android黑科技②:欺骗的艺术

“我的能量无穷无尽,只有强大暗能量才能统治Android界。 受屎吧!!! =≡Σ((( つ•̀ω•́)つ ” -- 来自暗世界android工程师 前言: 这是黑科技系列的第二篇,是Android知识正营中较有深...

猴亮屏
2017/10/24
0
0
Android.Hook框架Cydia篇

Cydia Substrate是一个代码修改平台.它可以修改任何主进程的代码,不管是用Java还是C/C++(native代码)编写的.而Xposed只支持HOOK app_process中的java函数,因此Cydia Substrate是一款强大而...

henry-zhang
2015/11/11
0
2

没有更多内容

加载失败,请刷新页面

加载更多

百度黄埔学院将培养一批首席AI架构师,为“国之重器”赋能

深度学习高端人才不仅是AI发展的重要养分,也是企业转型AI巨大推动力。2019年1月19日,百度黄埔学院——深度学习架构师培养计划在百度科技园举行开学典礼,深度学习技术及应用国家工程实验室...

深度学习之桨
31分钟前
2
0
扒站wget仿站

wget -c -r -p -np -k http://xxx.com/xxx 其中: -c, --continue (断点续传) 接着下载没下载完的文件 -r, --recursive(递归) specify recursive download.(指定递归下载) -p, --page...

临江仙卜算子
33分钟前
2
0
Nextjs+React非页面组件SSR渲染

@随风溜达的向日葵 Nextjs Nextjs是React生态中非常受欢迎的SSR(server side render——服务端渲染)框架,只需要几个步骤就可以搭建一个支持SSR的工程(_Nextjs_的快速搭建见Next.js入门)...

随风溜达的向日葵
今天
0
0
如何在 Linux 系统查询机器最近重启时间

在你的 Linux 或类 UNIX 系统中,你是如何查询系统上次重新启动的日期和时间?怎样显示系统关机的日期和时间? last 命令不仅可以按照时间从近到远的顺序列出该会话的特定用户、终端和主机名...

来来来来来
今天
3
0
Redis协议是什么样的

前言 我们用过很多redis的客户端,有没有相过自己撸一个redis客户端? 其实很简单,基于socket,监听6379端口,解析数据就可以了。 redis协议 解析数据的过程主要依赖于redis的协议了。 我们...

春哥大魔王的博客
今天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部