Xposed-微信自动加好友3

自动发送验证信息

Posted by JovenHe on March 13, 2019

上篇是在信息展示页自动点击添加好友按钮并跳转到验证申请页面,本篇功能自动发送验证信息。

同样以微信7.0.3为例

严重声明 本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。

查看页面并分析

发送验证信息页是com.tencent.mm.plugin.profile.ui.SayHiWithSnsPermissionUI,jadx打开并查找类SayHiWithSnsPermissionUI,分析代码

SayHiWithSnsPermissionUI.png

一眼看到有两个EditText,对比页面,可以肯定这两个EditText就是页面中的输入框,直接hook一下:

            findAndHookMethod(SayHiWithSnsPermissionUIClass,
                    "onCreate", Bundle.class,
                    new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
                            super.afterHookedMethod(param);
                            log("SayHiWithSnsPermissionUI-bundle=" + logBundle(((Activity) param.thisObject).getIntent().getExtras()));

                            new Handler().postDelayed(new Runnable() {
                                @Override
                                public void run() {

                                    try {

                                        EditText editText= (EditText) XposedHelpers.findField(SayHiWithSnsPermissionUIClass,"oLC").get(param.thisObject);
                                        editText.setText("测试用,勿加");
                                        EditText editText1= (EditText) XposedHelpers.findField(SayHiWithSnsPermissionUIClass,"oLD").get(param.thisObject);
                                        editText1.setText("测试好友");

                                    } catch (IllegalAccessException e) {
                                        e.printStackTrace();
                                    }
                                }
                            },100);
                        }
                    });

结果就如我们所猜测的那样

修改页面输入框文字.png

继续分析代码,我们要找的是实现了OnMenuItemClickListener的内部类,因为在 我的微信数据监控研究发展过程 这个帖子中微信页面的顶部点击事件是实现了OnMenuItemClickListener的内部类,能直接找到有两个内部类实现了OnMenuItemClickListener

发送按钮.png

返回按钮.png

它们在initView方法中被使用到

initView点击事件绑定.png

可以确定一个是发送按钮,一个是返回按钮,那就重点分析mo9514a方法吧

直接搜索mo9514a方法,发现是父类MMActivity中的方法,只有addTextOptionMenu这个方法

父类中的mo9514a方法.png

查找mController对象的类:

mController对象的类.png

可以看到这个类继承自一个抽象类,只有实现几个抽象方法,我们需要查看这个抽象类

C2173q抽象父类.png

在这个类中查找addTextOptionMenu这个方法,

addTextOptionMenu方法.png

mo5334a方法.png

可以看到方法中构造了一个内部类的对象,然后加到这个xrG变量的list集合里,然后直接在类中搜索gkj.onMenuItemClick,能看到是这个a方法调用的点击事件:

onMenuItemClick调用方法.png

查看m4207a方法的调用,调用有多处,但确定是onCreateOptionsMenu方法中调用,因为在MMActivity中也有它的的调用

mController多次使用.png

所以先分析onCreateOptionsMenu方法

onCreateOptionsMenu方法1.png onCreateOptionsMenu方法2.png

可以看到,代码大致就是直接遍历集合后通过menu.add添加item按钮,并通过findview得到发送按钮,设置好点击监听。

直接hook

可以直接hook这个方法,并在方法执行完成后直接执行点击事件

findAndHookMethod(ControllerClass,
        "onCreateOptionsMenu", Menu.class,
        new XC_MethodHook() {
            @Override
            protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
                super.afterHookedMethod(param);
                if (TextUtils.equals(XposedHelpers.findField(ControllerClass, "xyi").get(param.thisObject).getClass().getSimpleName(),
                        "SayHiWithSnsPermissionUI")) {
                    log("onCreateOptionsMenu--" +
                            "list(0).xrP=" + XposedHelpers.findField(XposedHelpers.findClass("com.tencent.mm.ui.q$a", mlpparam.classLoader), "xrP").get(((LinkedList) findField(ControllerClass, "xrG").get(param.thisObject)).get(0)) + "===" +
                            "list(0).xyM==null=" + (XposedHelpers.findField(XposedHelpers.findClass("com.tencent.mm.ui.q$a", mlpparam.classLoader), "xyM").get(((LinkedList) findField(ControllerClass, "xrG").get(param.thisObject)).get(0)) == null) + "===" +
                            "textview=" + ((TextView) findField(ControllerClass, "xrx").get(param.thisObject)).getText() + "==" +
                            "Button=" + ((Button) findField(ControllerClass, "lvg").get(param.thisObject)).getText() + "=="
                    );
                    menuItem = ((Menu) param.args[0]).getItem(0);


                            try {
                                XposedHelpers.callMethod(param.thisObject, "a", menuItem,
                                        ((LinkedList) findField(ControllerClass, "xrG").get(param.thisObject)).get(0));
                            } catch (IllegalAccessException e) {
                                e.printStackTrace();
                            }
                }
            }
        });

因为我们hook的是一个抽象父类,所以先确定调用者是不是我们要用的SayHiWithSnsPermissionUI,使用了类中的Activity变量xyi来对比,然后打印了一些方法内的参数,通过这几个参数确定集合中只有一个数据,menu.add也就只add了一个发送按钮,然后通过方法的Menu参数获取到这个按钮的MenuItem对象后,直接执行a方法。

在这里运行后直接报错

onCreateOptionsMenu后执行点击报错.png

可以看到是没有找到这个方法报错了,我们看到是com.tencent.mm.ui.MMActivity$1这个类中没有a方法,而这个类是mController对象的类,而我们Hook的是它继承的那个抽象父类,所以hook时param.thisObject这个实例对象并不是父类,所以无法调用它里面的private方法。

既然无法使用a方法,那我们就执行a方法里的代码吧, c2171a.gkj.onMenuItemClick(menuItem);

        findAndHookMethod(ControllerClass,
                "onCreateOptionsMenu", Menu.class,
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        if (TextUtils.equals(XposedHelpers.findField(ControllerClass, "xyi").get(param.thisObject).getClass().getSimpleName(),
                                "SayHiWithSnsPermissionUI")) {
                            menuItem = ((Menu) param.args[0]).getItem(0);

                            Object c2171a = ((LinkedList) findField(ControllerClass, "xrG").get(param.thisObject)).get(0);
                            Object menuItemClickListener = findField(XposedHelpers.findClass("com.tencent.mm.ui.q$a", mlpparam.classLoader), "gkj").get(c2171a);
                            XposedHelpers.callMethod(menuItemClickListener, "onMenuItemClick", menuItem);
                        }
                    }
                });

效果图

发送验证成功.gif

至此本文完成,可能本文较上文更细致一些,把全部思路都有截图说明,希望喜欢Xposed的朋友能从中获益。

同样在GitHub给出完整代码

https://github.com/hjw45611/WechatPlugin/blob/master/WXMain.java