一、前言
春节过年发个红包本来就是为了讨个喜庆,朋友亲戚之间的关系交流,但是现在随着技术变革,抢红包插件越来越多,导致现在不太愿意发红包了,特别是在一个多人群里,潜水的非常多,但是丢个红包瞬间就没了,感觉真的很不爽呀,然后造成的现象就是你用插件,我也用,结果抢红包就变得没有意思了。在这里我还是觉得尽量不要用这些所谓的抢红包插件。多读些书多好呀!
二、自动抢红包插件分析
本文就来应对那些自动抢红包插件功能的防护功能,我们知道现在自动抢红包主要有着三种方式:
第一种:利用辅助功能和通知栏消息拦截来做到第一时间红包来了提醒用户
第二种:利用Xposed框架进行hook抢红包功能
第三种:直接修改具备抢红包功能app的代码,二次打包安装
但是这三种方式其实目的只有一个:在收到红包之后能够立即提醒用户,核心点就一个字"快",那么防止这些插件的出发点也就是如何能够得到抢红包的时间,通过这个时间来判断一个人到底有没有用插件。因为我们抢过红包的都知道,正常情况下抢一个红包需要经历:接受红包消息+手动点击红包+红包打开动画,这三个场景。安装平均网速和人的反应速度,抢一个红包消耗的时间大约在4s-5s左右。当然可能会更长,如果更长的时间就不在我们这次讨论范围内了,而这个时间也是我们自己估摸出来的,不是非常准确的。所以我们现在的思路是,如何能够获取一个红包被抢了之后,每个人抢包消耗的时间。
三、寻找Hook入口
先来看看一个红包被抢完之后的详情页面信息:
从这个详情页面可以看到,有一个值就是时间字段,而这个页面应该是个ListView控件,所以这里就是我们的突破口,这里依然使用命令查看当前页面名称:adb shell dumpsys activity top
然后用Jadx打开WX应用,这里我依然用的是6.3.9版本:
这里就阻碍住了,为何找不到这个类呢?在之前的一篇文章中已经踩过这个坑了,就是WX应用进行了拆包技术,就是有多个dex文件,不了解的可以看这篇文章:如何获取WX应用的聊天记录和通讯录信息;他把从dex放在assets目录下:
所以我们可以直接解压这个jar,得到对应的dex文件,然后用jadx打开即可,继续搜索类:
看到了吧,这时候就找到了,点击进入即可:
找到了ListView控件,要想看具体数据肯定要找到他的Adapter值:
这里的代码就非常简单了,大众化的Adapter代码,为了能够看到数据,直接找到数据列表信息:
我们只要hook这个ix方法即可,然后得到他的返回值,在使用反射打印所有字段值:
四、打印红包详情信息
上面就分析完了红包详情页面数据信息,下面可以直接写Xposed模块,来hook这个方法即可,不过这里有一个坑需要注意的:Xposed默认是加载classes.dex主dex中的类。对于从dex中的类,按照以前方式加载的话会提示找不到类信息的,所以这里需要做一个处理,就是先hook系统的Application类的attach方法,然后得到对应的Context的类加载器,然后用这个类加载器去加载指定的类,如果找不到这个类就直接返回,因为无法知道想要加载类是在哪个dex中,而且你也无法知道当前hook的是哪个dex文件。所以只能一次一次进行尝试,一旦加载成功就开始后续的操作了,加载代码非常简单,如下所示:
这里加载com.tencent.mm.plugin.luckymoney.ui.h这个类成功之后,咋们就来hook他的ix方法:
模块编写完成之后,安装重启设备生效,然后在打开一个红包的详情页面,打印值如下:
我们看到这里的eNC字段值应该是一个时间戳,是10位的,注意后面如果要计算时间差得注意13位的时间戳和10位的时间戳问题。而eNc字段代表的是一个id值。暂且认为是当前红包的唯一id值。
五、获取红包id值和时间戳
那么有了这些信息之后,我们应该还需要知道一个信息,那就是接受红包的时间戳和id值,这样我们才能计算每个人抢包的时间值。这个值获取也比较简单了,这个可以直接拦截消息,过滤是红包信息之后,解析xml信息得到对应的值,关于如何拦截消息在之前的一篇关于:如何自动打开公众号文章和链接文章 中已经详细介绍了,这里不再多说,直接上代码:
我们可以看到当发送一个红包之后的消息xml格式如下:
我们看到这个paymsgid值和上面的eNc字段值非常类似,不过不是一致的,但是可以作为唯一id值来处理,这里我们用这个id值的倒数13位开始截断作为Map存储结构的key值。这样就把当前红包的id值和时间戳保存下来了,然后在查看红包详情信息的时候在计算时间差信息即可。
这里为了更好的在界面上看到每个人抢包时间,我们需要在修改列表信息,这时候我们可能需要去hook信息列表的getView方法了,我们知道每次展示item的时候都会调用getView方法的,看看getView方法的实现逻辑:
这里的代码也是非常大众化的,没难度,我们找到界面中展示时间的TextView控件,将其内容改成抢包时间差信息,这里找的方法也比较简单,直接计算id值转化成16进制,然后去public.xml文件中找到对应的id名称,查看布局文件即可。首先我们找到item的布局文件,将上面的2131362602十进制转化成16进制,然后去public.xml中查看:
找到布局文件是v6.xml,打开这个文件:
看到这里的布局层次是外层LinearLayout,然后内层第二个子View是LinearLayout,然后内部多个子TextView展示信息的,下面继续找到展示时间的TextView,这个也比较简单,因为从上面打印字段信息可以知道eNC这个值就是时间戳信息,可以查看代码:eRq就是展示时间戳信息的
把十进制:2131167693转化成16进制,查看public.xml内容:
然后在上面的布局文件中找到b45这个id控件:
看到这个是位于子LinearLayout的第4个子TextView控件,这里一定要注意子控件的顺序和索引值,后面会根据这个索引值来找到对应的TextView控件,下面直接来看代码实现吧:
代码实现比较简单了,主要分为三步:
第一步:hook住getView方法得到列表的item索引值,利用反射调用之前的ix方法得到对应item的数据信息,包括时间戳和id值。
第二步:利用红包的id值去全局的Map结构中检索到红包发送的时间戳值,计算抢包时间差。
第三步:通过方法的返回值View,来检索原来展示时间信息的TextView,这里一定要注意getChildAt这个方法的调用必须依赖于子控件的索引值。
模块编写完成之后,咋们就安装重启设备生效,然后打开一个红包详情页面,看看效果图:
看到了,在这个群里果然有很多挂逼,尽然在2s之内就可以抢到红包,不是挂逼是啥!
六、总结技巧
到这里我们就讲解完了防止自动抢红包插件原理,下面来总结一下本次操作的技巧知识点:
1、对于多dex应用进行hook的时候,会出现找不到类的错误,可以先hook住系统的Application的attach方法,得到Context之后,利用其ClassLoader进行加载类即可。
2、在进行hook的时候想修改界面数据的时候,大致思路是先找到指定的展示控件,一般都是通过id值去public.xml中查找布局文件即可。当然也有些布局可能是代码编写的。那样更容易查找了。然后在利用布局的层级关系找到指定的控件即可。
严重声明:本文的目的只有一个,通过一个案例来分析现在应用逆向分析技巧,如果有人利用本文内容进行任何商业目的和非法牟利,带来的任何法律责任将由操作者本人承担,和本文作者没有任何关系,所以还是由衷的希望大家秉着技术学习的目的阅读此文,非常感谢!
七、总结
本文主要通过WX应用防止抢红包插件的功能作为案例,来介绍了利用Xposed进行hook的时候遇到的一些问题,以及解决方案,在说到抢红包本文的案例解决方法很简单,就是通过抢包时间来判断,但是这个不是百分百的准确,因为有很多不确定因素在里面,比如网速等,都可能决定一个红包被抢的时间。但是在一定抢包时间内我们可以断定是否使用了自动抢包功能插件,如果希望做的更智能,最好是采样多个红包被抢信息来进行简单的数据分析来判定某个人是否真的的确用了自动抢包插件。这个留给感兴趣的读者去实践了,最后写完文章还是很辛苦的,希望大家多多点赞分享,要是有打赏那就最好啦啦!
更多内容:点击这里
关注微信公众号,最新技术干货实时推送
添加时请注明:“编码美丽”非常感谢!