Xposed Hook不到类报错以及Xposed的Hook方法讲解

有时候XposedHook会报错,提示找不到类,这个是因为,hook的那个类是其他classloader加载的,这个时候,就需要先hook Application.class下的attach方法,拿到每个ClassLoader,然后再用这个ClassLoder尝试加载自己的目标类,如果成功加载了,那说明这个类就是该classLoader加载的,然后再进行hook

代码如下:

XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                mContext = (Context) param.args[0];
                classLoader = mContext.getClassLoader();
                Class w;
                Class webtoonViewerActivity;
                Log.i(TAG,"拿到classLoader");
                try {
                    //你的目标
                    w = classLoader.loadClass("xxx.xxx");
                    webtoonViewerActivity =                 classLoader.loadClass("com.naver.linewebtoon.episode.viewer.WebtoonViewerActivity");
                }catch (Exception  e) {
                    Log.i(TAG, "寻找com.naver.linewebtoon.auth.w报错", e);
                    return;
                }
                //这样就不会报错了
                XposedBridge.hookMethod(w.getMethod("m"), new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws           Throwable {
                        Log.i(TAG,"hook到了m方法");
                        super.afterHookedMethod(param);
                        param.setResult(true);
                    }
                });

               
           }
}

接下来就顺便介绍一下Xposed的用的比较多的Hook方法

Xposed的hook方式有很多种,上面代码只是其中一种API,Xposed提供了两个类,这两个类都能实现Hook

第一个类:XposedHelpers

这个类有多个重载方法,第一种是可以直接提供类名,然后第二个参数是一个classLoader,第三个参数是一个可变参数,如果方法有参数,可以提供形参的class对象,第三个是一个回调

XposedHelpers.findAndHookMethod("xxx.xxx.xx", classLoader, "func", new XC_MethodHook() {
            @Override
            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                //这个里是方法执行前的的回调,这个parame是方法的参数

                super.beforeHookedMethod(param);
                param.setResult(true);//可以修改返回值
            }

            @Override
            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                //这个里是方法执行后的的回调。和上面没啥区别

                super.afterHookedMethod(param);
            }
        });
    }

如果想要hook类的构造方法,也提供了接口:

findAndHookConstructor这个类可以hook构造方法

上面说了 除了XposedHelpers之外还提供了一个hook类 :XposedBridge

这个类提供了3个hook接口,第一个是可以根据一个method对象来hook,

第二个是提供一个class对象来hook这个方法的所有重载

第三个是hook一个class的所有构造器

Xposed Hook不到类报错以及Xposed的Hook方法讲解_第1张图片

 

你可能感兴趣的:(安卓,爬虫,java,安卓,android)