首页 > 系统 > Android > 正文

Android 微信摇骰子和猜拳作弊器原理解析

2019-10-23 20:03:22
字体:
来源:转载
供稿:网友

一、前言

在之前的一篇文章中我们已经详细介绍了Android中Hook工作的一款神器Xposed工具:Xposed框架原理解析和使用案例分析 在那一篇文章中我们介绍了如何安装Xposed框架,以及如何使用Xposed库编写第一个模块来做到修改系统方法功能的效果,同时也说到了一个非常重要的知识点就是:在Hook过程中最重要的一点就是如何找到Hook点,而对于这一点很多同学都会感觉到非常的困难,因为对于修改系统方法还好,因为可以简单的去查看具体的Android源码即可,但是如果说要去编写一些应用和游戏的外挂的话,那么第一步就得先去破解对应的App找到指定Hook点,这一步是非常困难的。所以只能多尝试多破解慢慢长点经验即可。

二、猜想假设

本文就借助之前的Xposed框架来介绍如何编写微信的一个外挂功能,这个功能就是微信摇色子和剪刀石头布的作弊器,我们用过微信这个功能都知道,是一个比较常用的功能,因为在一个群聊中会很无聊就来这种简单的比赛,谁输了发红吧啥的。那么这个功能肯定伴有随机性,而且我们应该相信这个随机方法肯定是在微信代码中的某个地方,所以如果我们找到这个方法了,那么就可以进行Hook他,然后拦截返回最大的数值即可,也就是我们想要得数值。

三、准备工作

上面大致分析了这个功能的原理使用,下面咋们就不多说了,直接进行操作,本文用了一个微信的老版本做测试的:微信6.3.9.apk ;那么第一步咋们得逆向微信,需要做两个工作:

第一先使用apktools反编译apk,这个不用多说了,微信没有对应用进行加固,所以反编译过程很正常。

第二需要借助可视化反编译工具Jadx来打开微信apk,因为微信应用很大,所以得慢慢等待一会才可以打开。

四、逆向分析

下面在来冷静分析一下如何我们该怎么入手?上面反编译成功了之后,还得寻求入口,这个入口也很简单的,因为我们想得到这个随机函数,那么在我们能看到的效果是色子,我们可以选择一个微信聊天对话框,然后点击一个色子功能:

微信摇骰子作弊器,Android

看到了,我们点击色子之后肯定会调用这个随机函数获取随机值,那么这里就是我们的入口,所以第一步肯定先找到这个点击事件,如果要找到点击事件,那么就得先找到这个控件的定义,那么问题来了,如果能够快速的找到这个控件的定义呢?这个技术在我之前的一篇文章中已经介绍了,就是 微信的自动抢红包功能 当时因为要找到那个红包的点击事件,所以就用同样的方法来得到那个红包的控件定义的地方,而这个方法就是借助AndroidSDK提供的一个工具:uiautomatorviewer.bat 这个工具位于SDK目录的tools目录下,我们可以点击运行,然后就可以看到这个界面了:

微信摇骰子作弊器,Android

我们把设备停在聊天对话框中,然后使用这个工具,点击左上角那个按钮,可以进行当前桌面的界面布局分析,分析结果我们可以看到,这个色子是一个自定义控件:com.tencent.mm.ui.MMImageView,然后他的id是ae7,而这个值非常关键,后面就是用这个值来进行一步一步的跟踪,这里我们再多看一眼,就是这个表情区域的详细布局:

微信摇骰子作弊器,Android

猜也猜到了,表情区域外面应该是一个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文件中找到对应的十六进制值:

微信摇骰子作弊器,Android

注意:

这里在查找ae7的时候,会发现多个匹配项,而我们需要用额外的信息来作区分,那就是type字段了,type字段有很多种值,比如layout,drawable,string,attr,id等,我们这里因为是定义控件的所以type=id。

找到这个项之后,就把后面id的十六进制值转化成对应的十进制值吧:0x7f07060e=2131166734

有了这个值,就好办了,咋们直接在Jadx中打开的微信apk中全局搜索这个值:

微信摇骰子作弊器,Android

哎,可惜的是没有找到,所以到这里就开始蛋疼了,也是这次逆向的最大阻碍了,想了好长时间,最后才突然想起来以前 逆向微信的本地通讯录信息 的时候发现微信采用了分包技术,也就是微信包太大,因为Android系统中有方法数的限制所以需要对apk进行拆包操作,具体可以查看这篇文章:Android中应用拆包技术详解 那么我们会发现反编译之后也没有看到多个dex文件,所以这时候还要猜想他应该是存在本地目录的,在应用启动的时候主dex功能再去加载这个次dex文件,通过查看反编译之后的目录,结果在assets目录下找到了他:

微信摇骰子作弊器,Android

而这个是两个从dex文件,这里他做了dex文件转成jar文件的操作了,所以我们先用解压工具解压这个jar文件,得到对应的dex文件即可。然后咋们在开启一个Jadx窗口打开这个从dex文件,然后在全局搜索上面的那个值:

微信摇骰子作弊器,Android

哈哈哈,所有的操作都在掌控之中,到这里我们也成功的编写了一个微信外挂功能,而这个外挂可能有的同学感觉用途不是那么大,而现在主流的外挂是可以防止撤销功能,分享视频到朋友圈,不过这些功能都会慢慢讲解的,不要着急,而对于本文以及后续的外挂内容文章,我想表达的是,结果并不重要,重要的是整个逆向过程,在每次一逆向之后我们学到了什么,是否涨了逆向经验,这才是我们需要得到的。

补充说明:

第一点:有的同学会发现咋们上面得到的那个方法貌似是混淆之后的,也就说如果哪天微信改了混淆机制,那么这个Hook就失效了,本文中用到的是微信6.3.9的版本,对于其他版本我想这个方法类名应该是变了,也就说如果微信每次出一个版本咋们都得去逆向一次得到方法名,但是这个都不是难事,以为本文已经将整个逆向过程讲解了,所以以后只要按照这个步骤来,查找方法也是分分钟的事!

第二点:本文的用意是分享逆向技巧知识点,所以也请各位同学能够知道结果不重要,重要的是整个逆向的过程,也就是如何寻找到Hook点

严重声明:本文介绍的知识点完全是从一个技术分享角度出发,绝非用于任何商业活动和用途,如果涉及到任何法律问题将由操作者本人负责。本文作者将不负责任何法律责任!也请各位同学秉着技术角度出发的原则,切勿用于商业中!

七、总结

本文主要介绍了一个微信的简单外挂功能,就是摇色子和猜拳作弊器功能,而在整个过程中,我们可以看到找到Hook点才是最关键的,而最难的也是找到这个点。一般都是需要进行逆向分析微信应用找到这个点。在这个过程中我们又学习到了一些新的逆向应用技巧知识点,后续将会继续带大家一起分享其他的外挂功能知识点,敬请期待,同时也要多多支持扩散分享啦,也要多多点赞呢?写这篇文章实属不易呀,因为逆向的我头都炸了!


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表