我的CSDN博客:https://blog.csdn.net/gfg156196 by--qihao
书接上文,上回说到了xposed,接下来就用一下,体验一下商业项目的赶脚……
上一篇:史上最全面 Android逆向培训之__Xposed使用
接下来以hook微信官网最新版本7.0.6版本为例。可以去微信官网下载。
首先咱们解开微信的源码,使用jadx看一下,微信其实是一个超级庞大的工程。
咱们就hook顶部的加号和搜索🔍。(本教程只供学习xposed使用,不可作为商用。否则后果自负。)
《写给新手入职的培训资料》-- by 齐浩 2019/8/13 19:29
我们先找到 com.tencent.mm.ui.LauncherUI 类里的 onCreateOptionsMenu 方法。
仔细分析代码
方法内部看清楚了吧……接下来咱们就hook这个方法。
XposedHelpers.findAndHookMethod("com.tencent.mm.ui.LauncherUI", mClassLoader, "onCreateOptionsMenu", Menu.class, new XC_MethodHook() { @Override protected void afterHookedMethod(final MethodHookParam methodHookParam) throws Throwable { super.afterHookedMethod(methodHookParam); Log.i("Hook", "====com.tencent.mm.ui.LauncherUI onCreateOptionsMenu===="); Object objectField =XposedHelpers.getObjectField(methodHookParam.thisObject, WxConstant.GETCLASS_LAUNCHERUI_FIELD_XPU); View zIg = (View) XposedHelpers.getObjectField(objectField, "zIg"); View zEs = (View) XposedHelpers.getObjectField(objectField, "zEs"); Log.d("是否为空 = " + zIg + ", zEs= " + zEs); zIg.setOnClickListener(v -> { /** 这个是当前Activity的上下文 */ Context context = (Context) methodHookParam.thisObject; Log.i("Hook", "正在初始化..."); Toast.makeText(context, "正在初始化请等待......", Toast.LENGTH_SHORT).show(); }); zEs.setOnClickListener(v->Log.d("hook","我是搜索按钮 🔍")); } });
hook就必须使用 ClassLoader,类加载机制,用反射的思想去理解它就好了……很简单。
public class XhookEntry implements IXposedHookLoadPackage { /** * hook拦截入口 * @param loadPackageParam */ @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) { try { final String pkgName = loadPackageParam.packageName; //hook 微信进程 if (loadPackageParam.processName.equals("com.tencent.mm")) { ClassLoader classLoader = loadPackageParam.classLoader; // 有了classLoader,接下来就可以做其他的hook操作了 //………… } } catch (Exception e) { e.printStackTrace(); } }
最后记住一句话,凡是hook,必须 try……catch……
今天牛刀小试了一下,多练习,多看别人的源码,xposed没啥难度……有问题可以私聊我……
所有项目源码,持续更新:https://github.com/yugu88/MagicWX
熬夜写教程不容易,如果你欣赏我的代码,可以赞赏我几块钱买个新键盘。
一个简单的工具箱,新手还是很友好的,当然功能 low 了点……大部分小工具都有,需要的可以跟我要链接。