起因
最近突然想hook一下东西,然后捡起xposed这个古老的东西就开始来hook它,然后突然给打脸了,仔细检查ClassName,methodName和parameter都毫无问题,为啥要打我脸?慢慢蹲下身子,沉思良久,自我检讨,xposed能有什么坏心思,问题肯定是出在自己身上,附上打脸现场日志。
查因
想要根除困扰自己问题的方法,只能从自身出发,马上检查自己打出来的包(这里以友盟SDK作为演示样例学习),好家伙,原来我要hook的类在第二个dex中(Adnroid打包机制,dex方法数超过邪恶的65535个方法就会按照一定的规律进行分包),问题找到了,也不能怪人家 XposedHelpers.findAndHookMethod 不行,不行的永远是自己,附上查因现场。
解决
既然是多dex导致的hook问题,那么只要找到那个dex再进行hook即可(这里的方式和动态加载dex hook的方式地方有点不一样)。这里必然想到Application入口,打开打开查看一下,必经之路好像是这个
那么代码就撸起来,这么写试试
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 { hookclass = cl.loadClass("com.umeng.commonsdk.UMConfigure"); } catch (Exception e) { XposedBridge.log("load class error"+e); return; } 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里面的方法了。