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

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

2018-3-15 10:21
20888

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


其实都不必绕那么多的圈子,来完成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
                        }
                    });
                }
            }
        });

        // 第一步: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
                        }
                    });
                }
            }
        });

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 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
雪    币: 15924
活跃值: (7163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
Github链接打不开,麻烦把APK提供下载。
2018-3-16 10:48
0
雪    币: 144
活跃值: (718)
能力值: ( 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
雪    币: 8260
活跃值: (2913)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
谢谢分享,不错不错。、
2018-3-17 14:17
0
雪    币: 15924
活跃值: (7163)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
fooree 公众号“安卓Xposed框架交流”里有完整的代码介绍
不需要看介绍,原理都知道。只是不想写代码,拿来就用。麻烦把APK放这里
2018-3-18 16:28
0
雪    币: 1387
活跃值: (5614)
能力值: ( 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
活跃值: (388)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
这个还是比较简便的。不用关心classloader了。  只要拿到加载类就可以hook了
2018-3-19 17:00
0
雪    币: 411
活跃值: (539)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
14
这个挺实用的
2018-3-21 14:48
0
雪    币: 241
活跃值: (236)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
15
比如  A.class  调用  B.getText() 
在loadClass里能拦截到B.class的加载吗?

我测试结果是不能

求解楼主
2018-4-5 10:59
0
雪    币: 241
活跃值: (236)
能力值: ( 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
活跃值: (236)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
18
网上随便下载一个app都能测
微信  优酷  淘宝  京东...

你会发现  楼主的方法能拦截到的类非常有限
2018-4-7 17:56
0
雪    币: 33
活跃值: (332)
能力值: ( 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
活跃值: (4263)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
22
似乎只能拦截到部分class,貌似是因为classloader的隐式加载导致的。可以在这里打印这个函数所有被加载的类,我测试的时候似乎只有三五个记录(一个classloader似乎只有三五个加载记录)。当然我也不知道是不是我的环境问题。

后来,我换了一个姿势实现了的这个功能  ,见:  b8bK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8W2k6g2)9J5k6h3y4G2L8g2)9J5c8Y4k6A6M7X3A6S2M7W2)9J5c8Y4S2H3L8%4y4W2k6r3S2G2L8$3E0@1L8$3!0D9i4K6u0r3j5X3I4G2j5W2)9J5c8X3#2S2M7%4c8W2M7W2)9J5c8X3q4H3M7q4)9J5c8Y4y4J5j5#2)9J5c8X3#2S2K9h3&6Q4x3V1k6B7j5i4k6S2i4K6u0r3j5$3!0E0i4K6u0r3N6X3W2J5K9X3q4J5i4K6u0r3P5s2m8G2M7$3g2V1K9r3!0G2K9%4c8G2L8$3I4Q4x3V1k6@1L8$3!0D9i4K6u0r3b7$3I4S2M7%4y4x3L8$3q4V1e0h3!0F1K9i4c8G2M7W2)9J5k6h3A6S2N6X3p5`.
方式就是,通过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
活跃值: (1127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
感谢楼主,很受用 969K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6D9j5e0m8K6i4K6u0W2k6$3W2@1K9s2g2T1i4K6u0W2K9h3!0Q4x3V1j5J5x3o6p5^5i4K6u0r3x3o6k6Q4x3V1j5J5x3q4)9J5c8Y4S2H3L8%4y4W2k6q4)9J5c8R3`.`.
2018-7-23 19:54
0
雪    币: 102
活跃值: (2815)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
mark
2018-7-25 01:40
0
游客
登录 | 注册 方可回帖
返回