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

Posted 阿龙不是码龙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

手游逆向初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明介绍

     此文由于先发布到了吾爱破解,所以图片带有水印,点我看原文 

     这里找的是一款Himi喜欢的韩国游戏厂商Fincon公司使用Unity3d制作的3DMMORPG 《HelloHeroEpicBattle》(apk并附带obb,附件过大,这里附上下载链接:点我下载  ,google play地址:点我查看

     【第一步】:对安装apk进行取出必要的两个文件(通过解压工具解压、或者直接在双击apk,直接找到两个文件拖拽出来):
     1. apk/assets/bin/Data/Managed/Metadata/global-metadata.dat
     2. apk/lib/armeabi-v7a/ libil2cpp.so  (arm64-v8a下的libil2cpp.so 不用理会)

     

    

     【注】:如果u3d游戏没有使用il2cpp的话:
     我们可以直接到 apk/assets/bin/Data/Managed/ 目录下 将 Assembly-CSharp.dll 取出,使用 dnSpy 工具打开并在想要修改的位置右键进行编辑IL指令,修改值即可,相对简单这里不赘述。
     如果使用il2cpp 我们继续下面的流程:



     【第二步】:利用工具 Il2CppDumper 将so里的所有函数名进行提取
     工具所有版本地址: Il2CppDumper   ,直接下载最新版本 : https://github.com/Perfare/Il2CppDumper/releases/
   (顺便说下哈,最新版本提取出来的是.h 和 .cs 两个文件,早一些的版本才是论坛教程里常见的.py 和 .cs,不论是.h 或 .py 都是给 IDA 工具来对应so中地址所对应函数名的文件)

     打开 Il2CppDumper.exe 然后按照提示选择我们刚在apk里拿出来的两个文件:(打开Il2CppDumper可能需要你电脑环境安装了.netframework 4.x+ 百度即可)
   (新版本不需要你手动输入游戏对应的unity3d版本号,旧版本需要,至于如何游戏用的什么版本,论坛有大神都给出了教程,这里也不赘述)
     最终产生我们所需的 .cs 文件( .py 或 .h 不是必须要用的文件,只是ida 所需)如下图  :
        

     [注]:最新版 Dump 出来的是 .cs 和 .h

     

     
     【第三步】:利用工具UltraEdit  点我去下载  或者其他工具来打开 .cs 函数名集合文件
       (这里使用010editor 原因是 后面我们要打开il2cpp.so文件必须也要用此工具,所以就懒得下载其他工具了)
       我们在此函数文件中找到想要的修改的地方,如果是单机大家肯定想修改的是 Gold/Money/Level/Skill/Hp/Attack/等,搜索感兴趣关键词即可,本文我们只修改显示的等级和技能等级:

       思路:找到获取等级或者技能等级的函数名,然后直接将其函数改成直接返回指定的值即可。

       因此我们优先搜索相关的类,然后定位 等级和技能等级位置,确认其内存地址,如下图:

            

      通过上图看到下面这行代码是获取角色等级的函数,其函数对应内存地址是:0x56E938      

public int get_p_level(); // RVA: 0x56E938 Offset: 0x56E938

 

      通过上图看到下面这行代码是获取角色技能等级的函数,其函数对应内存地址是:0x56FD5C

public int GetSkillLevel(int index); // RVA: 0x56FD5C Offset: 0x56FD5C

 

第四步】:利用工具UltraEdit 打开.so文件进行修改
       (其实这一步之前我们省略了使用IDA工具对il2cpp.so文件分析汇编源码/伪代码的过程,直接暴力返回 10000 )

       1. 由于.so文件内都是汇编指令对应arm机器码,所以我们要首先要编写一段汇编代码
       

Mov R0,0x2710
BX  LR

    以上汇编指令表示:把0x2710 这个值给结果R0,然后直接返回。

    那么0x2710 这个值是什么? 汇编指令中使用的都是十六进制的值,而我们可以经常看到的数字都是十进制,所以我们找个十进制转十六进制的网站或者科学计算器转换一下即可,如下图:

   2.  我们将汇编代码要改成.so一致的机器码,这里推荐一个转换网站: ArmConverter  

       

   得到机器码:100702E3    1EFF2FE1

   3. 打开游戏的 il2cpp.so文件,control + g ,跳转到要修改的两个地址
       a) 首先定位到 获取角色等级的函数,获取角色技能等级的函数,其函数对应内存地址是:0x56FD5C ,将其机器码修改成  100702E3    1EFF2FE1,如下图:

      

  b) 按照上述方法把 定位到 获取角色等级的函数,其函数对应内存地址是:0x56E938 将其机器码修改成  100702E3    1EFF2FE1
           
         c) control + s 保存,最新的修改覆盖掉之前的il2cpp.so文件

 

第五步】:将修改好的.so文件,直接拖入我们的游戏apk对应的文件夹中进行覆盖

 到此,整个修改就完成了,我们看下修改前和修改后的前后对比图:
      
      修改前卡片等级6,技能等级都是1, 修改后都是10000

     

【总结】:
      1.  整体破解思路就是拿到dump出来的cs函数文件,进行搜索关键(关心的)函数,拿到其地址
      2. 然后使用IDA打开.so文件,也是 g 定位到你关心的函数地址上,然后对函数进行修改成你想要的逻辑汇编代码
      (此步骤,需要你对汇编和代码逻辑有一定的理解和熟悉,如果不太懂就可以仿照本文的暴力修改直接返回)
      3.将你修改的汇编代码对应的地址记录好,然后到so中进行定位修改。

     【注】
       你在.cs中拿到的函数地址,其实只是这个函数开始的地址,真正执行的代码地址可以使用IDA进行查看,例如:

上图中是IDA中展示的某一个函数地址为0x003D4864,而假设你修改了正方形圈选的这一行,那么你.so对应修改的内存地址:
       不应该是 0x003D4864,而是箭头指向对应的修改的那一行的地址:0x003D4898
 

 

以上是关于Unity单机手游逆向破解思路(仅供学习参考,禁止用于非法行为)的主要内容,如果未能解决你的问题,请参考以下文章

手游逆向初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明介绍

手游引擎怎么购买?

安卓逆向Unity3D游戏层叠xx破解

手游方舟怎么预防外挂

TYPESDK手游聚合SDK客户端设计思路与架构之四:unity开发平台部分结构设计和思路

验证码逆向专栏某验四代消消乐验证码逆向分析