首页
论坛
专栏
课程

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

2018-3-15 10:21 10235

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

2018-3-15 10:21
10235

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

逛论坛的时候,看到很多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。


[公告][征集寄语] 看雪20周年年会 | 感恩有你,一路同行

最新回复 (26)
ugui 2018-3-15 11:20
2
0
正好解决了我滴问题,3q
WX学徒 2018-3-15 21:08
3
0
ugui 正好解决了我滴问题,3q[em_52]
那感情好。个人公众号“安卓Xposed框架交流”持续更新,欢迎关注
tDasm 2018-3-16 10:48
4
0
Github链接打不开,麻烦把APK提供下载。
zylyy 2018-3-16 12:14
5
0
,这个真是极好的思路
fooree 2018-3-16 17:52
6
0
zylyy [em_41],这个真是极好的思路
这种方式用了很长时间了,不需要考虑更多细节
fooree 2018-3-16 17:54
7
0
tDasm Github链接打不开,麻烦把APK提供下载。
公众号“安卓Xposed框架交流”里有完整的代码介绍
聖blue 2018-3-17 10:03
8
0
friendanx 2018-3-17 14:17
9
0
谢谢分享,不错不错。、
tDasm 2018-3-18 16:28
10
0
fooree 公众号“安卓Xposed框架交流”里有完整的代码介绍
不需要看介绍,原理都知道。只是不想写代码,拿来就用。麻烦把APK放这里
supperlitt 2018-3-19 10:49
11
0
跟我使用的最终结果差不多,不过方式不一样,我是直接把几个dex转成jar,然后倒入,然后所有类都hook,不过是在进入Main的oncreate之后了,书上说应该是在自定义Application中进行dex加载的,
WX学徒 2018-3-19 14:51
12
0
supperlitt 跟我使用的最终结果差不多,不过方式不一样,我是直接把几个dex转成jar,然后倒入,然后所有类都hook,不过是在进入Main的oncreate之后了,书上说应该是在自定义Application中进行 ...
除了classes.dex其他的dex可以任意加载,和appplication没有关系
bjhrwzh 2018-3-19 17:00
13
0
这个还是比较简便的。不用关心classloader了。  只要拿到加载类就可以hook了
lykseek 2018-3-21 14:48
14
0
这个挺实用的
ckis 2018-4-5 10:59
15
0
比如  A.class  调用  B.getText() 
在loadClass里能拦截到B.class的加载吗?

我测试结果是不能

求解楼主
ckis 2018-4-6 09:55
16
0
安卓4.4.4和  7.1.2测试  发现该方法失败

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

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

希望楼主再验证一下原贴的方法
WX学徒 2018-4-7 08:48
17
0
ckis 安卓4.4.4和 7.1.2测试 发现该方法失败 并非所有类都在ClassLoader.loadClass方法内加载 比如我15楼的情况B.class无法捕捉到 希望楼主再验证一下原 ...
能发个apk和类名给我吗?Java类加载机制就是这样的我测试下
ckis 2018-4-7 17:56
18
0
网上随便下载一个app都能测
微信  优酷  淘宝  京东...

你会发现  楼主的方法能拦截到的类非常有限
gaybc 2018-4-10 00:01
19
0
有点有限..  很多壳的attachBaseContext都很好找  不太稳定
WX学徒 2018-4-11 09:35
20
0
gaybc 有点有限.. 很多壳的attachBaseContext都很好找 不太稳定
hook过棒棒加壳的app和三六零加壳的app,在4.4.4上还可以,hook的类都找到了,和attachBaseContext好像没有关系
蔡金成 2018-4-18 17:21
21
0
恩  思路不错,  脱壳也可以在这里弄.
virjar 1 2018-5-22 17:26
22
0
似乎只能拦截到部分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也能打开,就是某些功能似乎发生了变化,业务不正常了)。
WX学徒 2018-5-22 20:51
23
0
virjar 似乎只能拦截到部分class,貌似是因为classloader的隐式加载导致的。可以在这里打印这个函数所有被加载的类,我测试的时候似乎只有三五个记录(一个classloader似乎只有三五个加载记录) ...
发现只有Dalvik的hook  loadclass方法才有用  art无效
wx_La0s 2018-7-23 19:54
24
0
感谢楼主,很受用 https://la0s.github.io/2018/06/20/xposed/
koflfy 1 2018-7-25 01:40
25
0
mark
miyuecao 2018-12-12 15:37
26
0
挺实用技巧,mark下
skywhite 2019-4-9 17:16
27
0
方便实用的方法。
游客
登录 | 注册 方可回帖
返回