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

Posted 李华明Himi

tags:

篇首语:本文由小常识网(cha138.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
 

 

以上是关于手游逆向初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明介绍的主要内容,如果未能解决你的问题,请参考以下文章

unity il2cpp打包安卓打包崩溃原因Unity2020.3 il2cpp.so丢失

JS 逆向百例37网游登录接口参数逆向

如何使用unity3D制作游戏

关于游戏行业

unity3D如何设计一个游戏角色选择界面?

手游产品经理初探从营销角度看loading界面