xposed hook 多dex的apk
Angulu Lv1
起因

最近突然想hook一下东西,然后捡起xposed这个古老的东西就开始来hook它,然后突然给打脸了,仔细检查ClassName,methodName和parameter都毫无问题,为啥要打我脸?慢慢蹲下身子,沉思良久,自我检讨,xposed能有什么坏心思,问题肯定是出在自己身上,附上打脸现场日志。
演示1

查因

想要根除困扰自己问题的方法,只能从自身出发,马上检查自己打出来的包(这里以友盟SDK作为演示样例学习),好家伙,原来我要hook的类在第二个dex中(Adnroid打包机制,dex方法数超过邪恶的65535个方法就会按照一定的规律进行分包),问题找到了,也不能怪人家 XposedHelpers.findAndHookMethod 不行,不行的永远是自己,附上查因现场。
演示2

解决

既然是多dex导致的hook问题,那么只要找到那个dex再进行hook即可(这里的方式和动态加载dex hook的方式地方有点不一样)。这里必然想到Application入口,打开打开查看一下,必经之路好像是这个
演示3

那么代码就撸起来,这么写试试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
//过滤一下不关注的包,排除影响
if(!loadPackageParam.packageName.equals("yourPkgName"))
return;
XposedHelpers.findAndHookMethod(Application.class, "attach",
Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ClassLoader cl = ((Context) param.args[0]).getClassLoader();
Class<?> hookclass = null;
try {
//查看dex有没有这个Class
hookclass = cl.loadClass("com.umeng.commonsdk.UMConfigure");
} catch (Exception e) {
XposedBridge.log("load class error"+e);
return;
}
//确定有这个Class再进行hook方法的操作
XposedBridge.log( "load success");
XposedHelpers.findAndHookMethod(hookclass, "init", Context.class,String.class,String.class,int.class,String.class,
new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
XposedBridge.log( "has Hooked!");
}
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//打印一下形参
XposedBridge.log("param.args[0] = "+param.args[0]);
XposedBridge.log("param.args[1] = "+param.args[1]);
XposedBridge.log("param.args[2] = "+param.args[2]);
XposedBridge.log("param.args[3] = "+param.args[3]);
XposedBridge.log("param.args[4] = "+param.args[4]);
}
});
}
});

果然很顺利,成功hook到了多dex里面的方法了。
演示4