一、安卓逆向常用工具
针对安卓单机游戏逆向,尤其是逆向使用Unity引擎开发的安卓游戏,只需了解下面的工具即可。
(1)Android Killer
Android Killer是安卓通用逆向工具,其可以对apk进行反向编译,得到smail代码,用户可以更改smail代码后,对apk重新打包,以实现破解的功能。其还可以将apk转换成等价的java语言,以便分析程序逻辑,来更好的找到对应的smail代码。
(2)ILSpy (针对Unity开发的手游)
ILSpy的作用主要是将Unity封装在apk中的.dll库文件反编译成等价的CSharp代码,以便于观察游戏程序逻辑,从而决定修改位置。
(3)ILDasm (针对Unity开发的手游)
ILDasm的作用主要是将Unity封装在apk中的.dll库文件反编译成等价的可编辑的IL类汇编指令。
(4)ILasm (针对Unity开发的手游)
ILasm的作用是将IL类汇编指令重新编译成.dll文件。
二、逆向案例分析
1、Unity单机手游案例1
以Unity单机手游“模拟生活”为例,说明Unity类手游的破解思路。
(1)解压apk文件
使用解压软件直接将apk解压,解压完成后,进入到assets\bin\Data\Managed目录中(仅限Unity手游),并找到其中的Assembly-CSharp.dll文件(存放了游戏主逻辑),如图所示:
随后以文本方式打开”Assembly-CSharp.dll”文件,查看是否被加密,如图所示:
一般情况下,能解析出如图所示的文本,说明.dll文件未被加密,可以直接进行逆向分析。
(2)使用ILSpy软件查看C#语言等价源码确定修改位置
打开ILSpy软件,选择打开”Assembly-CSharp.dll”文件后,软件会自动进行反编译处理,将.dll文件反编译为C#语言,随后我们可以搜索游戏关键字,比如金钱(money)、等级(level)、血量(HP)和经验(Exp)等等,一般正规的游戏,变量命名都会很规范,如果实在找不到,只能硬啃代码进行分析了。
这里以查找“模拟生活”游戏中的金钱为例,搜索money后出现了很多结果,如图所示
在搜索结果(图中标2所示)中,依次查看最可能有修改金钱操作的代码,这里最后锁定了”EarnMoneyBonus”类,字面意思就是“赚钱奖励”,随后点进去,发现其中有Update()和FixedUpdate()函数,这两个函数,是Unity游戏中的重要函数,其分别表示随着游戏的进行,每一帧都会调用的函数(Update)和每隔固定时间会调用的函数(FixedUpdate)。
先观察Update中的函数,从变量名分析,其中会对一个时间相关的变量进行操作,和金钱关系不大,因此跳转到观察FixedUpdate函数。FixedUpdate函数中,没有看到和money相关的字眼,但是有一个自定义的Finish函数,于是继续查看Finish函数,如图所示。
在里面终于看到和money有关的变量m_moneySum(金钱总数)了,继续观察,还有m_multiplier(倍率),这两个量通过一定的计算关系赋值给num:
num=m_moneySum*(m_multiplier-1),而后的代码(2中),以num作为参数进行了某些操作,再往后看代码3,其中调用了SetText(设置文本)函数,通常此类函数是直接影响显示界面的,也就是说,这个函数改变了某个地方显示的文本,再看里面的参数,还是和m_moneySum和m_multiplier有关,因此可以断定,改变这两个值中的一个,必定会使游戏某个地方的文本产生突变。为了使游戏保留可玩性,从字面意思理解改m_multiplier(倍率)可能会更好(也可以试着改其他变量)。
可以看到,之后m_multiplier被重新赋值为1,这里为了效果明显,将其改为1000000试试(不是直接改C#代码),这里相当于确定了修改的位置为”EarnMoneyBonus”类中”Finsh”函数中的”m_multiplier”变量。
(3)通过ILDasm插件,确定IL汇编指令的修改位置
在Visual Studio 2019及以上版本中,内置了ILDasm插件,先在之前解压的apk的Managed上右键,选择“使用Visual Studio打开(V)”,这个操作的目的是为了使工作目录直接切换到”Assembly-CSharp.dll”文件所在目录,省了很多操作,如图所示。
之后,可以在Visual Studio的“工具”,“命令行(L)”中选择“开发者命令提示(C)”,如图所示:
随后输入如下命令将”Assembly-CSharp.dll”文件反汇编成IL指令文件:
ildasm Assembly-CSharp.dll
效果如图所示:
此时自动弹出了ILDASM插件的GUI界面,并把.dll反汇编成了.il,之后要做的就是定位IL指令文件中需要修改的位置。
根据前面确定的修改位置,先找到”EarnMoneyBonus”类,再找到其中的”Finsh”函数,最后定位给”m_multiplier”变量赋值为1的地方。
最后我们确定了需要修改的地方为IL_00ce: ldc.r4 1,如果改成IL_00ce: ldc.r4 1000000,则意味着每次运行Finish函数后,m_multiplier都会被赋值为1000000,这里不能直接修改,需要等导出文本文件后再修改,因此先复制特征串”IL_00d3: stfld float32 EarnMoneyBonus::m_multiplier”以便于查找到需要修改的位置。
如图,在“文件(F)”中,找到“转储(D)”,随后保存,命名为“Assembly-CSharp.il”,如图所示:
(4)修改“Assembly-CSharp.il”文件
使用任意文本编辑器打开“Assembly-CSharp.il”文件后定位到(3)中确定的修改位置后(直接搜索前面复制的特征串),将其改为1000000,如图所示。
(5)编译“Assembly-CSharp.il”文件
使用ILasm插件将“Assembly-CSharp.il”文件编译为“Assembly-CSharp.dll”文件。和前面步骤一样,在Visual Studio中打开命令提示符后,使用如下命令编译“Assembly-CSharp.il”文件:
ilasm Assembly-CSharp.il /output=Assembly-CSharp_crack.dll /dll
这里为了不覆盖原来的“Assembly-CSharp.dll”文件,将新编译的文件命名为“Assembly-CSharp_crack.dll”文件,该文件就是破解后的Unity游戏主逻辑文件,替换掉原Apk中的“Assembly-CSharp.dll”文件后,重新打包编译apk就能生成破解的游戏安装包了。
(6)使用Android Killer重新编译Apk
使用Android Killer打开“生活模拟器”apk,之后进入到Android Killer该安装包的工程目录projects\安装包名称\Project\assets\bin\Data\Managed中,用Assembly-CSharp_crack.dll替换掉原Assembly-CSharp.dll文件(替换后,将_crack后缀删除),如图所示
随后点击Android Killer中的编译功能,编译生成破解的apk,如图所示:
破解的apk输出的位置为projects\安装包名称\Bin\xxx.apk。
效果如图所示,每点击一次挣钱,获得的是999999金钱,和前面反编译出的C#源码中,num=m_moneySum*(m_multiplier-1)计算结果一致,其中m_multiplier为倍率,被我们修改为1000000了,而m_moneySum为1,因此每点击一次得到999999
三、附录
本文所用的Android Killer和ILSpy软件链接如下:
链接:https://pan.baidu.com/s/1oiecCQkJVFoucLmwSZfJIA
提取码:long
关于ILDasm和ILasm插件,可下载安装Visual Studio 2019及以上版本,其内置了这两个插件,VS官网下载地址如下(其中Community为免费版):
Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器 (microsoft.com)
来源地址:https://blog.csdn.net/qq_41595148/article/details/127583639