Unity单机手游逆向破解思路(仅供学习参考,禁止用于非法行为)

一、安卓逆向常用工具

针对安卓单机游戏逆向,尤其是逆向使用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解压,解压完成后,进入到assetsbinDataManaged目录中(仅限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安装包名称ProjectassetsbinDataManaged中,用Assembly-CSharp_crack.dll替换掉原Assembly-CSharp.dll文件(替换后,将_crack后缀删除),如图所示

       随后点击Android Killer中的编译功能,编译生成破解的apk,如图所示:

        破解的apk输出的位置为projects安装包名称Binxxx.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)

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>