Xposed-微信自动加好友功能实现2--自动跳转验证申请页面
Xposed-微信自动加好友功能实现2--自动跳转验证申请页面
批量添加好友这一行为可能带来风险,要么面临频繁被警告,要么存在被封号的危险,因此,本帖旨在探讨自动加好友的技术途径。
由于操作失误,手机上的微信已自动升级至最新版本,因此这里以微信7.0.3版本为参照。
在上一章节中,系统实现了自动搜寻并导航至好友资料页面,而本章新增的功能则是在信息页面展示完毕后,自动触发点击操作,以添加好友,并进一步跳转至验证申请界面。
寻找点击事件
在信息展示界面,我们定位到了com.tencent.mm.plugin.profile.ui.ContactInfoUI这一模块,随后使用jadx工具对其进行了深入分析,试图寻找类ContactInfoUI中的点击跳转相关代码,遗憾的是,在代码库中并未发现此类代码,因此我们不得不转变策略。
点击“添加好友”按钮Xposed-微信自动加好友功能实现2--自动跳转验证申请页面,系统将自动跳转至“SayHiWithSnsPermissionUI”验证申请界面,在该页面上,可以查找实现跳转功能的“SayHiWithSnsPermissionUI.class”类。
可以看到有三个方法使用到,简单查看后,进行简单hook
只有EF方法执行
打印如下:
2019年2月27日16时57分24秒,进程ID为3772的线程3772报告:I/Xposed模块中,com.a85.wechatplugin插件在16时57分24秒触发了一次onClick事件,这是针对添加联系人功能的操作。
我们已确认将执行com.tencent.mm.plugin.profile.a包内的EF函数,该函数的参数输出为contact_profile_add_contact。
直接在EF方法中扔出异常:
[Java] 纯文本查看 复制代码
寻找并挂钩方法,针对“com.tencent.mm.plugin.profile.a”这一类,由mlpparam类加载器负责执行。 "EF", String.class, new XC_MethodHook() { @Override 在执行被钩子方法之前,需调用此方法,并确保以final修饰的MethodHookParam参数传入,同时处理可能抛出的异常。 在执行方法之前,通过super对象调用beforeHookedMethod方法,并将参数param传递给它。 记录日志("点击事件------1" + 参数数组中的第一个元素); 抛出空指针异常。 } });
查看日志
不难观察到其调用流程,首先是由一个项目点击动作触发,紧随其后的是将回调信息发送至ContactInfoUI的a函数,最终流程指向了EF方法的执行。
1.item点击事件
首先,需要关注的是com.tencent.mm.ui.base.preference.MMPreference$2这个类中的OnItemClickListener接口。
主要是对adapter中item数据的判断处理
在onItemClick方法内部,需打印出adapterView获取的适配器所针对的item在索引i处的对象实例的class类型,以及与mKey值相关的信息。
[Java] 纯文本查看 复制代码
寻找并挂钩方法,针对“com.tencent.mm.ui.base.preference.MMPreference$2”,通过mlpparam的类加载器实现。 当点击事件发生时,适配器视图类,视图类,整型以及长整型都将被涉及。 new XC_MethodHook() { @Override protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); 对象偏好值等于通过参数args中的第一个元素转换为AdapterView后,获取其适配器,再从适配器中获取索引为param.args[2]转换后的整数值对应的项。 记录("点击事件发生——" + 偏好对象的类名 + "等于") Xposed助手查找类"com.tencent.mm.ui.base.preference.Preference"下的字段"mKey",然后通过mlpparam的类加载器获取该字段,最后使用得到的字段来获取偏好设置。 ); } });
log日志如下:
2019年3月1日14点05分06秒815毫秒,进程ID为5718的线程5718报告:I/Xposed模块中,com.a85.wechatplugin插件在14点05分06秒时触发onItemClick事件,按钮偏好设置中的contact_profile_add_contact被点击。
观察getItem方法返回的数据类型为ButtonPreference,若需了解preference类别的多样性,请参阅以下内容:
此页面可供参考,无论是否添加了好友微信电脑端怎么加好友,显示联系人信息的界面均称作ContactInfoUI。页面上方设有头像展示区域,下方则是列表视图。值得注意的是,列表中的每个项目所对应的偏好设置类各不相同:发送消息、进行音视频通话以及添加好友等功能均由ButtonPreference按钮偏好设置类实现,而朋友圈功能则由SnsPreference社交偏好设置类负责,至于电话号码则由PhoneNumPreference电话号码偏好设置类来管理。
通过分析日志数据,我们可以发现程序执行过程中调用了MMPreference类中的mo15244a方法,该方法接收MMPreference类自身的xOS属性和preference参数作为输入;这正是ContactInfoUI回调函数中a方法的调用。
2.ContactInfoUI中a方法
依据先前打印出的EF方法参数为contact_profile_add_contact,因此preference.mKey被设置为"contact_profile_add_contact",同时,前一步的打印结果显示preference所属的类为ButtonPreference,这意味着整个回调过程将仅执行this.oHt.mo15424EF(str)这一段代码Xposed-微信自动加好友功能实现2--自动跳转验证申请页面,而mo15424EF方法正是最初定位到的EF方法。
3.EF方法
在初步查看之后微信电脑端怎么加好友,EF方法通过接收到的字符串信息来识别用户点击的是哪个按钮,这可能是用于发送消息的按钮,也可能是用于浏览朋友圈的按钮微信电脑端怎么加好友,亦或是用于添加通讯录的按钮。
依据前一步骤输出的数据,EF算法所采用的参数为contact_profile_add_contact,相应的代码部分如下。
观察之下,代码的篇幅依然颇为庞大,其核心内容主要涉及变量的获取与判断处理,接着便是配置c41857a模块的回调函数,包括mo12226a和mo12227vr两个方法,前者为无需验证即可执行的方法,而后者则需经过验证后方可执行。
至此整个点击过程结束
其实到此我们已经能从这已有的三个方法来实现自动点击了。
我们可以从ContactInfoUI模块中a方法的核心代码片段入手,具体为this.oHt.mo15424EF(str);这一部分,以此来实现自动点击功能,具体代码如下:
[Java] 纯文本查看 复制代码
寻找并钩住与ContactInfoUIClass相关的函数或方法, "onCreate", Bundle.class, new XC_MethodHook() { @Override protected void beforeHookedMethod(final MethodHookParam param) throws Throwable { super.beforeHookedMethod(param); 创建一个新的处理器实例,随后使用该实例调用postDelayed方法,该方法接受一个Runnable对象作为参数。 @Override public void run() { if (!isFromAddFriend) { return; } try { 通过XposedHelper工具,我们找到了ContactInfoUIClass类中的字段"oHt",并将其值赋给对象oHt,该值是通过调用get方法,并传入param对象中的thisObject参数来获取的。 Xposed助手调用了方法,对对象oHt执行了操作,具体是调用"EF"方法,然后在该方法中添加了联系人信息。 捕获到非法访问异常后,{ e.printStackTrace(); } } }, 1000); } });
在展示账户详情界面时,系统会自动调用this.oHt.mo15424EF(str)这一函数。
运行截图如下:
可以看到成功跳转到验证页面。
本文至此告一段落,实际上我最初的目标是探究intent跳转的回调究竟由哪个环节触发。然而,在分析过程中,遇到了极为复杂的情形。大致流程是:用户点击后,系统会弹出一个提示窗口,随后发起一个请求,后台系统会查询该用户是否需要进行验证。接着,系统解析数据并执行回调操作,随后关闭弹窗,并最终跳转至验证页面或直接完成添加好友的操作。分析涉及十几个类别,我反复钻研,力求找到网络请求生成部分的代码,打算通过Xposed自行实现。这一过程让我疲惫不堪,但实则最简便的方法是直接编写点击代码,后续的处理步骤便会顺理成章地连续调用,无需我亲自构建那些过于繁复的方法和变量。
功能实现接近尾声,仅剩发送验证这一环节尚未完成,后续的分析和实现将在下一篇文章中进行探讨。
鉴于本文基于微信7.0.3版本进行解析,其中某些代码与上篇文章有所差异,因此,我在GitHub上提供了全部的代码内容。
请勿对GitHub上的hjw45611用户创建的WechatPlugin项目进行修改。
使用请修改代码内的 "手机号/微信号/QQ号"