我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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解压,解压完成后,进入到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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录