有时候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的所有构造器