【ETH链游】阿蟹Axie Infinity模拟器运行及多开

Axie Infinity

在这里插入图片描述

众所周知,阿蟹【Axie Infinity】是去年最火的一款GameFi游戏,由越南团队Sky Mavis开发,短短几个月内就红遍东南亚,最大市场在菲律宾,其次是越南、马来西亚、印尼与美国等。

去年6月,该游戏单日平均收入就和《王者荣耀》并列全球第一;去年7月近30日平均收入也有3.34亿美元,超过王者荣耀2.31亿美元,拿下宝座。

自疫情以来,东南亚经济深受打击,菲律宾有高达730万人失业,马来西亚失业率也创1993年以来高峰,失业族群更遍及各领域:大学应届毕业生、三轮车司机,以及到海外当移工赚钱的人士。当他们因封城或无法出国失去收入,能在线上赚钱的Axie自然成最好机会,让游戏迅速走红。

但随着潮水和泡沫的褪去,从去年12开始GameFi板块的全面暴跌,我们应该谨慎对待P2E链游,小小娱乐即可,切勿投入过多,毕竟风险巨大。

模拟器检测

阿蟹【Axie Infinity】官方提供的Android APK在PC端的Android模拟器上无法正常运行,相信我们大家已经发现了。以雷电模拟器为例,安装后运行,屏幕一片空白。请添加图片描述
首先想到的是可能官方做了模拟器检测。
在这里插入图片描述
我们查看APK的lib目录,果然看到了【libemulator_check.so】这样明显用于模拟器检测的库。可见官方也是下了一定的工夫,在本机代码层做了检测,而不仅仅是在Java代码层来做检测,这样仅仅凭借Xposed之类的Java层Hook技术就很难搞定了。

但无论他的【libemulator_check.so】如何检测,哪怕他用了无数种检测手段,哪怕这个.so他再使用vmp加壳,但只要我想办法让他的Java代码不去调用【libemulator_check.so】不就行了吗?

一番研究和搜索,发现这个【libemulator_check.so】实际上来自一个开源项目:
https://github.com/happylishang/AntiFakerAndroidChecker
在这里插入图片描述
果然,使用【jadx】反编译后,我们看到它Java代码中调用了

 EmulatorDetectUtil.isEmulator(context);

进行模拟器检测,于是我们通过【apktool】对其反编译后,修改smali代码,去掉这些调用,然后重新打包。

可是,悲剧的事情发生了,我们重新打包后APK无法运行了,哪怕是在正常的小米手机真机上也无法运行了,看来它除了做模拟器检测,还做了签名校验。
在这里插入图片描述
果不其然,我们在反编译的代码中发现他在【libglvnftpb.so】中做了签名校验的事情

不过对于签名校验的破解,我们有万能的大杀器:

扫描二维码关注公众号,回复: 13715548 查看本文章

《Android逆向【4】:暴力破解APK签名校验,愉快的重新打包微信支付宝APK》
https://blog.csdn.net/CharlesSimonyi/article/details/122184098

当然我们也可以不重新打包他的APK,而是直接通过Xposed来Hook【 EmulatorDetectUtil.isEmulator()】

不过最后搞了一通,我们还是失败了,游戏在模拟上运行还是一片空白。

于是我们直接在反编译的代码中搜索【System.loadLibrary】看它究竟加载了哪些so
在这里插入图片描述
至此我们发现了【C0010.m9(485)】这个神奇的函数,这个函数来自于【libglvnftpb.so】的本机代码。
在这里插入图片描述
好家伙,我们发现他为数不多的Java代码居然调用了【C0010.m9】这个函数多达531次!原来他是把整个APK的Java代码部分所需要的字符串,全部压缩放到了【libglvnftpb.so】里,APP运行起来后,会通过System.loadLibrary(“glvnftpb”);
加载【libglvnftpb.so】,这个时候【libglvnftpb.so】会进行签名校验、模拟器检测等操作,自检通过以后,这些字符串才会释放到内存中,接下来调用【libglvnftpb.so】的【C0010.m9】方法,传递不同的数字以查表的方式获取正确的字符串。

那么如果仅仅是把【libglvnftpb.so】干掉,让它不加载【libglvnftpb.so】那是不行的,因为整个APP的Java代码到处都在依赖【libglvnftpb.so】的【C0010.m9】以获取必须的字符串。

解决思路

可以从两条路子下手:

  1. 先把原版【Axie Infinity】在Android真机上跑起来,然后借助frida,编写脚本,反复调用【C0010.m9】并枚举int参数,把其内部的所有字符串和int值的对应关系一一套出来,然后编写一个【libglvnftpb.so】替换它,当然我们自己编写的【libglvnftpb.so】不做任何检测动作,直接返回正确的字符串。当然,这还有很多细节需要处理。

  2. 收集老版本的APK,这点对于游戏APP逆向来说非常重要,如果你关注一个游戏APP,最好写个脚本从一开始就盯着官方的每一个新版本的发布,尽可能搜集多的老版本APK。因为官方和工作室做对抗,也是循序渐进的,在【Axie Infinity】较早的时候,不仅没有做模拟器检测和签名校验,甚至连其il2cpp代码都是未做混淆的,所有函数和变量一目了然,但是随着官方和工作室对抗了近一年之久,各种检测和混淆手段层出不穷。收集尽可能多的历史版本,我们可以对比两个连续的新旧版本之间的差异,比较容易的发现官方做了哪些改动。同理,解决模拟器检测的另一个思路就是,我们仍然使用老版本的Java代码,但整合新版本的unity文件,老版本用于启动unity环境的Java代码可是没有调用so做模拟器检测的,同时游戏类APP每个新版本的改动主要还是其中的unity文件,这样套用以后使得APP的Java代码不做模拟器检测,但是unity却是最新版本,可以正常游戏。当然这取决于APP的具体实现,好在【Axie Infinity】的检测逻辑基本都在so中,而游戏逻辑全在【libil2cpp.so】中,至于Java部分,新老版本变化不大,使得我们做新老套用成为可能。

修改版

由于时间精力有限以及其它一些原因,我们暂时不能详细给出修改阿蟹【Axie Infinity】模拟器检测的具体步骤和代码,所以目前先给出一个修改好的APK文件,并且会随着官方新版本的更新而更新,目前修改版的APK可以到这里下载(右侧的【Releases】处下载):
https://github.com/encoderlee/cracked_axie_infinity

运行效果

目前最新的1.1.3.3版本在雷电模拟器中运行的效果
在这里插入图片描述
在这里插入图片描述

一些好的开源项目

在实现了在雷电模拟器上运行以后,我们很容易在一台电脑上多开N个号,并且给每个客户端设置不同的代理,同时我们也可以借助以下开源项目,实现Android设备的自动化,从而实现一些自动化操作:
Android自动化测试工具:https://github.com/openatx/uiautomator2
网易开发的手游自动化测试工具:https://airtest.netease.com

猜你喜欢

转载自blog.csdn.net/CharlesSimonyi/article/details/123066079