hjw45611 发表于 2019-3-4 11:10

Xposed-微信自动加好友功能实现2--自动跳转验证申请页面

本帖最后由 hjw45611 于 2019-6-22 18:00 编辑

严重声明
本文的意图只有一个就是通过分析app学习更多的逆向技术,如果有人利用本文知识和技术进行非法操作进行牟利,带来的任何法律责任都将由操作者本人承担,和本文作者无任何关系,最终还是希望大家能够秉着学习的心态阅读此文。
上篇文章仅仅做到自动查看联系人信息就结尾了,总感觉对不起这个帖子的题目,所以利用这几天的空闲时间就有了第二篇自动跳转验证申请页面
上篇链接: https://www.52pojie.cn/thread-872046-1-1.html
批量添加好友存在一定的问题,不是被警告频繁就是会有封号的隐患,所以本帖仅作为自动加好友的技术探索
另需注意,因为误操作,手机微信版本升级到最新了,所以在此以微信7.0.3为例

上篇结尾自动搜索好友并跳转到资料信息页,本篇功能是在信息页展示后自动点击添加好友按钮并跳转到验证申请页面
寻找点击事件
信息展示页是com.tencent.mm.plugin.profile.ui.ContactInfoUI,jadx打开并查找类ContactInfoUI,但代码中并找不到相关的点击跳转代码,所以换个思路
点击添加好友按钮后跳转到验证申请页面SayHiWithSnsPermissionUI,直接搜索intent跳转中用到的 SayHiWithSnsPermissionUI.class

可以看到有三个方法使用到,简单查看后,进行简单hook
只有EF方法执行
打印如下:
2019-02-27 16:57:24.959 3772-3772/? I/Xposed: com.a85.wechatplugin::onClick------1contact_profile_add_contact

确定走的是com.tencent.mm.plugin.profile.a中的EF方法。参数打印是 contact_profile_add_contact
直接在EF方法中扔出异常:
findAndHookMethod("com.tencent.mm.plugin.profile.a", mlpparam.classLoader,
                  "EF", String.class,
                  new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            log("onClick------1" + param.args);
                            throw new NullPointerException();
                        }
                  });
查看日志

很容易发现它的调用过程,先是一个item点击事件,然后回调给ContactInfoUI中a方法,最后调用到EF方法
1.item点击事件
首先看com.tencent.mm.ui.base.preference.MMPreference$2这个OnItemClickListener

主要是对adapter中item数据的判断处理
打印onItemClick方法中adapterView.getAdapter().getItem(i)的对象实例的class与mKey的值
findAndHookMethod("com.tencent.mm.ui.base.preference.MMPreference$2", mlpparam.classLoader,
                  "onItemClick", AdapterView.class, View.class, int.class, long.class,
                  new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            Object preference=((AdapterView)param.args).getAdapter().getItem((int)param.args);

                            log("onItemClick------" + preference.getClass().getSimpleName() + "=="+
                                    XposedHelpers.findField(XposedHelpers.findClass("com.tencent.mm.ui.base.preference.Preference",mlpparam.classLoader),"mKey").get(preference)
                            );
                        }
                  });
log日志如下:
2019-03-01 14:05:06.815 5718-5718/? I/Xposed: com.a85.wechatplugin::onItemClick------ButtonPreference==contact_profile_add_contact
可以看到getItem的数据类是ButtonPreference,对于preference类的不同可以参考以下:

可以参考这个页面,不管加没加好友,联系人信息页面都是ContactInfoUI,顶部是一个头视图,下面的View是ListView,不过每个Item的Preference类不相同,发消息、音视频通话、添加好友都是ButtonPreference,朋友圈是SnsPreference,电话号码是PhoneNumPreference。
通过log数据,判断后只走了MMPreference.this.mo15244a(MMPreference.this.xOS, preference); 这个就是回调的ContactInfoUI中的a方法
2.ContactInfoUI中a方法

根据之前打印的EF方法的参数是contact_profile_add_contact,所以preference.mKey="contact_profile_add_contact",而且上一步的打印结果preference的类是ButtonPreference,所以整个回调只会执行 this.oHt.mo15424EF(str); 这段代码,mo15424EF方法就是一开始找到的EF方法。
3.EF方法

大致浏览后EF方法是根据传过来的String来判断点击的是哪个按钮,是发消息按钮,还是查看朋友圈按钮,还是添加通讯录按钮
根据上一步的打印数据,EF方法的参数是contact_profile_add_contact,这部分代码如下。


可以看到代码量还是很多,简单分析主要是得到一些变量的获取与判断,然后设置好c41857a中的回调方法,mo12226a方法与mo12227vr方法,一个是不需要验证执行的方法,一个是需要验证执行的方法。

至此整个点击过程结束
其实到此我们已经能从这已有的三个方法来实现自动点击了。
我们可以从ContactInfoUI中a方法的主要代码this.oHt.mo15424EF(str); 入手来实现自动点击,代码如下:
            findAndHookMethod(ContactInfoUIClass,
                  "onCreate", Bundle.class,
                  new XC_MethodHook() {
                        @Override
                        protected void beforeHookedMethod(final MethodHookParam param) throws Throwable {
                            super.beforeHookedMethod(param);
                            new Handler().postDelayed(new Runnable() {
                              @Override
                              public void run() {
                                    if (!isFromAddFriend) {
                                        return;
                                    }

                                    try {
                                        Object oHt = XposedHelpers.findField(ContactInfoUIClass, "oHt").get(param.thisObject);

                                        XposedHelpers.callMethod(oHt, "EF", "contact_profile_add_contact");

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

我们在显示账号信息页面的时候自动执行this.oHt.mo15424EF(str); 这个方法
运行截图如下:


可以看到成功跳转到验证页面。

至此本文结束,其实一开始我是想要找到intent跳转的回调是哪一个发出的,但中间的分析实在是过于复杂,大致过程是点击后生成一个提示窗,然后生成一个请求,后台查询这个用户是不是需要验证,然后解析数据进行回调,然后取消弹窗,然后跳转到验证页或者直接加好友。涉及到十几个类的分析,我也一直在钻牛角尖,一直想找到网络请求生成这一部分的代码再自己xposed进行实现,导致找的头昏脑胀,但其实最简单的方式就是代码实现点击的方法,后续处理才会直接接连调用,不用自己去构造那些过于复杂的方法和变量。
至此自动添加好友的功能只差最后一步发送验证了,下篇再做分析实现吧。

因为本文以微信7.0.3分析,部分代码和上篇不同,所以在GitHub给出完整代码
https://github.com/hjw45611/WechatPlugin/

使用请修改代码内的"手机号/微信号/QQ号"

pwp 发表于 2019-3-4 11:39

{:1_921:}膜拜大佬,这都分析得出来,太厉害啦。

hjw45611 发表于 2019-3-6 09:38

心机呢喃 发表于 2019-3-5 23:15
大佬,问一下,微信的加人限制能否通过修改客户端(或者Xposed模块hook)来绕过限制实现加人无限制,先不讨 ...

首先我没专门研究过无限制加人,其一我没那么多测试数据,其二我的微信号也不想加一堆不认识的人,,而且这种涉及到加好友的功能,不可能把一些重要判断放在客户端,因为客户端永远没有绝对安全。

阿桀桀桀 发表于 2019-3-4 11:34

好贴,学习了

jiang196771 发表于 2019-3-4 11:34

沙发,谢谢大神分享

forward2000 发表于 2019-3-4 11:38

看起来好厉害的样子

nws0507 发表于 2019-3-4 12:23

好文章,希望大神多多分享

灬清风C 发表于 2019-3-4 12:52

保存了,厉害,自己还得再研究研究

福建白琳 发表于 2019-3-4 13:18

真的好厉害啊想学可惜看不懂 难受

qazx5555 发表于 2019-3-4 13:53

学历不够

丿终结者 发表于 2019-3-4 16:13

写的很不错{:301_999:}
页: [1] 2 3 4 5 6
查看完整版本: Xposed-微信自动加好友功能实现2--自动跳转验证申请页面