转:https://bbs.pediy.com/thread-225190.htm
一直在论坛学习,学到了很多知识,分享一下。
- 为什么某个类明明存在却Hook不到,出现异常ClassNotFoundError?
- 怎么Hook MultiDex中的类?
- xposed怎么hook一个主dex加载的jar(包含dex)?
- 怎么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。
可以动手测试一下。
懒汉可以查看Github链接:https://github.com/fooree/fooXposed/tree/master/Foox_05th。