首页
社区
课程
招聘
[分享]Xposed Hook Apk不在classes.dex中定义的类
发表于: 2018-3-15 10:21 20220

[分享]Xposed Hook Apk不在classes.dex中定义的类

2018-3-15 10:21
20220

一直在论坛学习,学到了很多知识,分享一下。

逛论坛的时候,看到很多Xposed新手询问类似以下的问题:
  1. 为什么某个类明明存在却Hook不到,出现异常ClassNotFoundError?
  2. 怎么Hook MultiDex中的类?
  3. xposed怎么hook一个主dex加载的jar(包含dex)?
  4. 怎么Hook被加壳隐藏的类?
  5. .....
还有看到有大神在脱壳的时候,通过Hook Application的attach/onCreate/......等方法获取到加壳的DexClassLoader,然后再去Hook某个类。

其实都不必绕那么多的圈子,来完成Hook。

Hook一个类,我们不要关心这个类在哪个DexClassLoader中;因为在Xposed模块加载的时候,Apk应用程序的类都没有加载,通过哪个DexClassLoader加载,我们也不知道。

我们知道的是,所有的类都是通过ClassLoader的loadClass方法加载的。我们只需要Hook loadClass方法,就能得到所有的类(除非该方法被重写)。

我们直接上代码,其中classes是我们定义的一个List/Set对象,具体怎么用,看你自己的需求。
        // 第一步:Hook方法ClassLoader#loadClass(String)
        findAndHookMethod(ClassLoader.class, "loadClass", String.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                if (param.hasThrowable()) return;
                Class<?> cls = (Class<?>) param.getResult();
                String name = cls.getName();
                if (classes.contains(name)) {
                    // 所有的类都是通过loadClass方法加载的
                    // 所以这里通过判断全限定类名,查找到目标类
                    // 第二步:Hook目标方法
                    findAndHookMethod(cls, "methodName", paramTypes, new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                            // TODO
                        }

                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            // TODO
                        }
                    });
                }
            }
        });


可以动手测试一下。

懒汉可以查看Github链接:https://github.com/fooree/fooXposed/tree/master/Foox_05th。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 2
支持
分享
最新回复 (27)
雪    币: 10
活跃值: (923)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
正好解决了我滴问题,3q
2018-3-15 11:20
0
雪    币: 23
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
ugui 正好解决了我滴问题,3q[em_52]
那感情好。个人公众号“安卓Xposed框架交流”持续更新,欢迎关注
2018-3-15 21:08
0
雪    币: 14471
活跃值: (5718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Github链接打不开,麻烦把APK提供下载。
2018-3-16 10:48
0
雪    币: 144
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
,这个真是极好的思路
2018-3-16 12:14
0
雪    币: 24
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
zylyy [em_41],这个真是极好的思路
这种方式用了很长时间了,不需要考虑更多细节
2018-3-16 17:52
0
雪    币: 24
活跃值: (68)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
tDasm Github链接打不开,麻烦把APK提供下载。
公众号“安卓Xposed框架交流”里有完整的代码介绍
2018-3-16 17:54
0
雪    币: 6818
活跃值: (153)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
2018-3-17 10:03
0
雪    币: 7752
活跃值: (2144)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,不错不错。、
2018-3-17 14:17
0
雪    币: 14471
活跃值: (5718)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
fooree 公众号“安卓Xposed框架交流”里有完整的代码介绍
不需要看介绍,原理都知道。只是不想写代码,拿来就用。麻烦把APK放这里
2018-3-18 16:28
0
雪    币: 1366
活跃值: (5584)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
11
跟我使用的最终结果差不多,不过方式不一样,我是直接把几个dex转成jar,然后倒入,然后所有类都hook,不过是在进入Main的oncreate之后了,书上说应该是在自定义Application中进行dex加载的,
2018-3-19 10:49
0
雪    币: 23
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
supperlitt 跟我使用的最终结果差不多,不过方式不一样,我是直接把几个dex转成jar,然后倒入,然后所有类都hook,不过是在进入Main的oncreate之后了,书上说应该是在自定义Application中进行 ...
除了classes.dex其他的dex可以任意加载,和appplication没有关系
2018-3-19 14:51
0
雪    币: 4687
活跃值: (253)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个还是比较简便的。不用关心classloader了。  只要拿到加载类就可以hook了
2018-3-19 17:00
0
雪    币: 416
活跃值: (509)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
这个挺实用的
2018-3-21 14:48
0
雪    币: 241
活跃值: (226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
比如  A.class  调用  B.getText() 
在loadClass里能拦截到B.class的加载吗?

我测试结果是不能

求解楼主
2018-4-5 10:59
0
雪    币: 241
活跃值: (226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
16
安卓4.4.4和  7.1.2测试  发现该方法失败

并非所有类都在ClassLoader.loadClass方法内加载

比如我15楼的情况B.class无法捕捉到

希望楼主再验证一下原贴的方法
2018-4-6 09:55
0
雪    币: 23
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
ckis 安卓4.4.4和 7.1.2测试 发现该方法失败 并非所有类都在ClassLoader.loadClass方法内加载 比如我15楼的情况B.class无法捕捉到 希望楼主再验证一下原 ...
能发个apk和类名给我吗?Java类加载机制就是这样的我测试下
2018-4-7 08:48
0
雪    币: 241
活跃值: (226)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
网上随便下载一个app都能测
微信  优酷  淘宝  京东...

你会发现  楼主的方法能拦截到的类非常有限
2018-4-7 17:56
0
雪    币: 33
活跃值: (322)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
有点有限..  很多壳的attachBaseContext都很好找  不太稳定
2018-4-10 00:01
0
雪    币: 23
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
gaybc 有点有限.. 很多壳的attachBaseContext都很好找 不太稳定
hook过棒棒加壳的app和三六零加壳的app,在4.4.4上还可以,hook的类都找到了,和attachBaseContext好像没有关系
2018-4-11 09:35
0
雪    币: 12
活跃值: (55)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
恩  思路不错,  脱壳也可以在这里弄.
2018-4-18 17:21
0
雪    币: 1867
活跃值: (3763)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
似乎只能拦截到部分class,貌似是因为classloader的隐式加载导致的。可以在这里打印这个函数所有被加载的类,我测试的时候似乎只有三五个记录(一个classloader似乎只有三五个加载记录)。当然我也不知道是不是我的环境问题。

后来,我换了一个姿势实现了的这个功能  ,见:  https://gitee.com/virjar/xposedhooktool/blob/master/app/src/main/java/com/virjar/xposedhooktool/tool/ClassLoadMonitor.java
方式就是,通过hook  classloader的方式,收集所有的classloader对象。然后每当增加了一个classloader,就去强制调用这个classloader来loadclass,如果load成功,那么就是这个classloader的,否则可能能够加载这个Class的classloader还没有出现,继续等待。

然后,我这样做还是有问题。因为这种方案提前了class的初始化,本身可能class被用到的时候才会定义,但是我在对应的classloader被构造之后里面就进行了class的定义。如果这个class对这个定义时机比较敏感,那么确实可能引发未知问题(我又一次玩爱加密的壳就遇到过,也不是程序闪退,app也能打开,就是某些功能似乎发生了变化,业务不正常了)。
2018-5-22 17:26
0
雪    币: 23
活跃值: (37)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
virjar 似乎只能拦截到部分class,貌似是因为classloader的隐式加载导致的。可以在这里打印这个函数所有被加载的类,我测试的时候似乎只有三五个记录(一个classloader似乎只有三五个加载记录) ...
发现只有Dalvik的hook  loadclass方法才有用  art无效
2018-5-22 20:51
0
雪    币: 905
活跃值: (957)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢楼主,很受用 https://la0s.github.io/2018/06/20/xposed/
2018-7-23 19:54
0
雪    币: 102
活跃值: (1845)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
mark
2018-7-25 01:40
0
游客
登录 | 注册 方可回帖
返回
//