各位老铁们好,相信很多人对深入解析Android平台微信摇骰子和猜拳作弊器的技术原理都不是特别的了解,因此呢,今天就来为大家分享下关于深入解析Android平台微信摇骰子和猜拳作弊器的技术原理以及的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!
在之前的一篇文章中我们已经详细介绍了一款Android中Hook功能的神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我们介绍了如何安装Xposed框架,以及如何使用Xposed库编写第一个模块来做到修改系统方法功能的效果,同时也说到了一个非常重要的知识点就是:在Hook过程中最重要的一点就是如何找到Hook点,而对于这一点很多同学都会感觉到非常的困难,因为对于修改系统方法还好,因为可以简单的去查看具体的Android源码即可,但是如果说要去编写一些应用和游戏的外挂的话,那么第一步就得先去破解对应的App找到指定Hook点,这一步是非常困难的。所以只能多尝试多破解慢慢长点经验即可。
二、猜想与假设
三、准备工作
第一、先使用apktools反编译apk,这个不用多说了,微信没有对应用进行加固,所以反编译过程很正常。
第二、需要借助可视化反编译工具Jadx来打开微信apk,因为微信应用很大,所以得慢慢等待一会才可以打开。
四、逆向分析
下面在来冷静分析一下如何我们该怎么入手?上面反编译成功了之后,还得寻求入口,这个入口也很简单的,因为我们想得到这个随机函数,那么在我们能看到的效果是色子,我们可以选择一个微信聊天对话框,然后点击一个色子功能:
看到了,我们点击色子之后肯定会调用这个随机函数获取随机值,那么这里就是我们的入口,所以第一步肯定先找到这个点击事件,如果要找到点击事件,那么就得先找到这个控件的定义,那么问题来了,如果能够快速的找到这个控件的定义呢?这个技术在我之前的一篇文章中已经介绍了,就是 微信的自动抢红包功能 当时因为要找到那个红包的点击事件,所以就用同样的方法来得到那个红包的控件定义的地方,而这个方法就是借助AndroidSDK提供的一个工具:uiautomatorviewer.bat 这个工具位于SDK目录的tools目录下,我们可以点击运行,然后就可以看到这个界面了:
我们把设备停在聊天对话框中,然后使用这个工具,点击左上角那个按钮,可以进行当前桌面的界面布局分析,分析结果我们可以看到,这个色子是一个自定义控件:com.tencent.mm.ui.MMImageView,然后他的id是ae7,而这个值非常关键,后面就是用这个值来进行一步一步的跟踪,这里我们再多看一眼,就是这个表情区域的详细布局:
猜也猜到了,表情区域外面应该是一个ViewPager控件可以进行滑动切换,然后是每一页的控件用的是GridView进行卡片分割,那么这里就会给我们一个提醒了:后面的点击事件要么是在GridView的适配器类的getView方法中对view进行setOnClickListener添加的,要么是对GridView添加onItemClick事件的。
好了下面继续跟踪,因为有了那个色子控件的id了,下面咋们可以直接用这个id去全局搜索这个值了,不过这里有个问题就是微信其实本身做了资源的混淆,而这个混淆一方面是加大安全工作,一方面是减小包的大小功能,我们可以使用解压工具简单的查看他的apk文件中的res目录,会发现全是字母文件夹。而且从上面的id命名也可以看到,我相信微信工程师不可能会傻逼的把一个id命名成ae7了吧?到这里我们又要借助一个知识点了,而这个知识点在我之前的一篇文章中介绍了:Android中的应用攻防之战 在这篇文章中介绍了,我们在反编译apk之后,其实apk所有的资源id值都会保存在一个public.xml文件中,而这个文件是放在values目录下的,这个文件主要存放的就是资源的id十六进制值和name,type之间的对应关系,而反编译之后的代码中一般不会用R.id.xxx这种样式来访问控件,而是用转化之后的id值,这个值是十进制的,所以我们得先用上面那个ae7的id值去public.xml文件中找到对应的十六进制值:
注意:
这里在查找ae7的时候,会发现多个匹配项,而我们需要用额外的信息来作区分,那就是type字段了,type字段有很多种值,比如layout,drawable,string,id等,我们这里因为是定义控件的所以type=id。
找到这个项之后,就把后面id的十六进制值转化成对应的十进制值吧:0x7f07060e=2131166734
有了这个值,就好办了,咋们直接在Jadx中打开的微信apk中全局搜索这个值:
哎,可惜的是没有找到,所以到这里就开始蛋疼了,也是这次逆向的最大阻碍了,想了好长时间,最后才突然想起来以前 逆向微信的本地通讯录信息 的时候发现微信采用了分包技术,也就是微信包太大,因为Android系统中有方法数的限制所以需要对apk进行拆包操作,具体可以查看这篇文章:Android中应用拆包技术详解 那么我们会发现反编译之后也没有看到多个dex文件,所以这时候还要猜想他应该是存在本地目录的,在应用启动的时候主dex功能再去加载这个次dex文件,通过查看反编译之后的目录,结果在assets目录下找到了他:
而这个是两个从dex文件,这里他做了dex文件转成jar文件的操作了,所以我们先用解压工具解压这个jar文件,得到对应的dex文件即可。然后咋们在开启一个Jadx窗口打开这个从dex文件,然后在全局搜索上面的那个值:
看到了,终于找到了这个控件的定义的地方了,点击第一个进去查看:
我们在往下面看这个类的信息,会发现到有一个getView方法:
看到这个就可以判定了,这个类其实是一个BaseAdapter类型了,而在getView中没有看到控件的点击事件,所以猜想应该是外部给GridView添加的onItemClick事件了,咋们继续选中这个类名,然后右击进行跟踪这个类在哪些地方被调用了,这个功能的确很实用的:
点击查找之后,会有很多地方调用:
这里从第一项的那个参数命令可以猜想到了应该就是GridView类型,而到这里我们貌似看到了胜利的曙光了:
然后查看这个smileyGrid变量的定义:
这里是一个SmileyGrid类型的,咋们可以全局搜索这个类,看看他的定义:
果然不出所料,这里是一个GridView类型,然后也看到了我们非常期待的onItemClick方法了,下面就开始分析这个onItemClick方法的逻辑了:
这里我没有找到一个好的办法,也不想去深入跟踪了,因为这里的判断分之不是很多,所以就顺序的尝试了每个方法,结果找到了最后一个a方法,然后点进去查看逻辑:
这里我们就需要多想点了,从我们点击色子之后的效果看,没有对话框和toast提示,那么这里就只有两个分支是最有可能执行的了,通过顺序尝试之后,发现是第一处分支的逻辑了,也就是h.a.aMZ.b()这个方法执行了,通过import导入的类,得到这个类的路径定义:
但是在这个dex中没有找到这个类,所以猜想应该是在主dex中,果然找到了这个类定义,然后进入这个类进行想详细查看:
继续进入看看b方法的定义:
擦,这里的b方法尽然返回的是null,那么到这里就要思考了,如果返回null的话,之前的点击事件肯定是无效的,而这个又不符合实际情况,所以猜想还有哪个地方对这个iop进行赋值操作了。我们看看这个iop定义:
从定义上可以看到,极大可能在其他地方进行了赋值操作,所以咋们全局搜索这个变量值iop:
发现搜索结果还是我们刚刚看到的返回null的代码,所以咋们又得继续去另外一个dex中进行搜索了:
这里搜到了一个赋值操作,立马点击进入查看:
然后查看PD方法的定义:
继续查看这个g类定义:
看到他的b方法,这里有一个bb.pu这个方法比较可疑,因为最终返回的值都是和他相关的,而这个方法在这个dex中又没有找到,所以咋们看一下他的import找到全局定义路径,然后去另外一个dex中查看定义:
到这里,就会非常激动了,因为我们看到了胜利了,这个非常明显的随机方法终于找到了,而通过这个随机公式可以看到,这个方法的功能是返回一个0-i之间的随机值,而对于色子应该是0-6之间的值,猜拳是0-3之间的值。所以这个方法百分百是用于随机功能的。
五、掌握逆向技能
第一、对于逆向中想得到控件点击事件入口,可以通过以下步骤来进行
1、使用界面分析工具得到指定控件的id名称
2、通过id名称去反编译之后的values/public.xml中查找到指定的值,转化成十进制
3、通过Jadx自带的全局所有功能,查找这个十进制值即可
对于这个步骤将适用于想得到一个应用中某个控件的点击事件逻辑入口是非常有效的,而且也是通用的方法。
第二、对于微信来说,因为工程的庞大,所以肯定会存在拆包现象,所以他不止一个dex文件。肯定是包含多个dex文件的,所以后面还需继续写微信的外挂,到时候分析都是要注意这一点
额外说明:
合并之后咋们在用工具将其转化成一个dex文件,也就完成了多个dex文件合并工作了。在这个工程中,我们可以非常巧妙的借助Jadx的另外一个强大功能,就是可以把反编译之后的内容保存到本地:
他有个好处就是,把apk中的dex保存成java文件,资源全部解码保存指定xml文件,而最终的保存样式是一个gradle工程,而这个工程咋们就可以直接导入到一个开发工具中了非常方便了。特别是资源文件,我们在之前会发现apktools工具并没有反编译xml文件出来。而在这里就可以了。
六、开始拦截实验
下面咋们就来进行Hook操作了,上面已经得到了这个随机函数的名称了:
com.tencent.mm.sdk.platformtools.bb.pu(int i)
Hook工作就非常简单了,咋们拦截这个方法之后根据传入的值做一次判断是摇骰子还是猜拳操作:
首先咋们得做一次过滤操作,就是只会Hook微信应用,然后到拦截操作中,通过传递的参数做判断是摇色子还是猜拳,如果是摇色子就返回一点,猜拳就返回剪刀。
编写成功之后,就进行编译成模块,然后重启设备生效,点开微信打开一个聊天框,开始摇色子:
通过打印值可以看到,我们的猜想是正确的,看一下实际效果:
补充说明:
七、总结
手机看文章有点费劲,可以进入网页版:http://www.wjdiankong.cn
用户评论
终于找到了解释这些工具原理的文章!一直好奇 微信摇骰子或者猜拳怎么就能“精准”预测结果,原来是利用了Android系统漏洞加上一些巧妙的代码实现。看完感觉还是蛮牛的!
有13位网友表示赞同!
我一直觉得微信摇摇乐和猜拳都是纯靠运气,谁说不是?这篇文章分析的原理很详细,让我更加了解技术的原理,但同时也增加了对游戏公平性的担忧,毕竟太多作弊器在使用的话,真的会破坏游戏乐趣。
有6位网友表示赞同!
作为一名程序员,看到这篇文章感觉非常赞!代码写的很有逻辑,而且还讲解了各种相关概念,特别是利用 Binder 接口做数据读取的部分,我受益匪浅。希望作者能继续分享更多黑客技术方面的文章!
有11位网友表示赞同!
我一直觉得微信玩骰子猜拳作弊器应该被ban掉,这样游戏才公平公正,不是吗?这篇文章说的是安卓系统漏洞的利用,感觉更复杂了,其实最重要的是维护游戏的公平性。
有19位网友表示赞同!
看完这篇博客才发现原来微信摇骰子和猜拳这么好玩的游戏背后竟然隐藏着这么多技术门道!以前觉得这种作弊器只是好玩的小工具,现在看来背后的原理非常深奥而且很有意思。
有16位网友表示赞同!
我更担心的是那些利用作弊器进行非法交易或者牟取利益的玩家,他们会对游戏中其他玩家造成伤害,也破坏了游戏的生态环境。这篇文章虽然分析了作弊器的原理,但并没有探讨这些道德层面问题,这才是我们需要更加重视和关注的部分。
有7位网友表示赞同!
我对Android系统以及应用程序的开发原理并不了解,看完这篇文章我收获很大,原来一些看似简单的小工具背后竟然有这么复杂的技术逻辑支撑!
有20位网友表示赞同!
这篇博文写的非常详细,不仅讲解了作弊器的原理,还总结了常见的检测方法,对于想要学习Android黑客技术的同学非常有参考价值。但我还是建议大家不要使用这些作弊器,保持游戏道德和公平性才是最重要的。
有17位网友表示赞同!
微信摇骰子和猜拳都是娱乐性的游戏,应该以娱乐为主,如果过于注重技术细节和胜利失败,反而失去了游戏的乐趣。希望大家能够理性对待这种类型的游戏。
有10位网友表示赞同!
这篇文章让我对Android系统有了更深入的了解,原来系统中的一些接口是可以被利用来实现作弊行为的。但这也提醒我们要加强安全防护意识,避免类似漏洞被恶意攻击。
有14位网友表示赞同!
作者分析得很细致,把各种概念和技术点都解释得很清楚,读起来像是在看一堂课。受益匪浅! 我自己也有研究Android系统的项目,这篇博文给了我很多思路和借鉴。
有12位网友表示赞同!
我觉得这种作弊器虽然能够实现快速获胜,但对于长远来说,它会让玩家失去学习进步的机会,也会破坏游戏的公平性,最终不利于玩家长期体验游戏的乐趣。
有19位网友表示赞同!
这篇文章分析的非常到位!原来微信摇骰子猜拳可以用代码直接读系统数据结果,真是太厉害了!我一直在玩这种游戏,现在感觉更加清晰的游戏背后技术原理了。
有17位网友表示赞同!
虽然文章详细讲解了作弊器的原理,但我更想了解这些漏洞是如何被发现和修复的?希望作者能够分享更多关于Android安全防护方面的知识。
有17位网友表示赞同!
这篇文章有点超出我的认知水平 , 毕竟我对计算机编程方面不太了解, 但博主还是把复杂的技术用通俗易懂的方式解释得很清楚. 学习的到很多新知识!
有12位网友表示赞同!
我觉得这种作弊器虽然很厉害,但是使用它就等于是在玩弄规则。破坏了游戏的公平性,不利于玩家之间的良性竞争和互动。更希望大家都能尊重游戏规则,享受游戏带来的乐趣。
有13位网友表示赞同!
我很佩服作者对Android系统的深入研究!这篇文章不仅提供了大量信息,还引导读者思考系统漏洞的安全性问题。希望更多开发者能够关注安全问题,提高软件的安全性
有14位网友表示赞同!