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

人走茶凉 提交于 2020-09-26 12:17:02
 此文由于先发布到了吾爱破解,所以图片带有水印,[点我看原文 请添加链接描述](https://www.52pojie.cn/forum.php?mod=viewthread&tid=1254037&page=1#pid33827230)

 这里找的是一款Himi喜欢的韩国游戏厂商Fincon公司使用Unity3d制作的3DMMORPG 《HelloHeroEpicBattle》(apk并附带obb,附件过大,这里附上下载链接:[点我下载请添加链接描述](https://apkmody.io/games/hello-hero-epic-battle/download)  ,google play地址:[点我查看请添加链接描述](https://play.google.com/store/apps/details?id=com.fincon.hh2) )

 【第一步】:对安装apk进行取出必要的两个文件(通过解压工具解压、或者直接在双击apk,直接找到两个文件拖拽出来):
 1. apk/assets/bin/Data/Managed/Metadata/global-metadata.dat
 2. apk/lib/armeabi-v7a/ libil2cpp.so  (arm64-v8a下的libil2cpp.so 不用理会)
 ![](https://s4.51cto.com/images/blog/202008/26/b5b62bd32924a14a18ffc372acbad4cf.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

![](https://s4.51cto.com/images/blog/202008/26/b067251e139f56bbcc4f7df66e085ee4.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)
 【注】:如果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 所需)如下图 :

  ![](https://s4.51cto.com/images/blog/202008/26/5120c56f6f208fd6645ef441fddc5b62.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

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

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

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

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

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

        ![](https://s4.51cto.com/images/blog/202008/26/683260af84214d2c912625ad77c78aff.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

  通过上图看到下面这行代码是获取角色等级的函数,其函数对应内存地址是: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 这个值是什么? 汇编指令中使用的都是十六进制的值,而我们可以经常看到的数字都是十进制,所以我们找个十进制转十六进制的网站或者科学计算器转换一下即可,如下图:

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

  1. 我们将汇编代码要改成.so一致的机器码,这里推荐一个转换网站: ArmConverter请添加链接描述

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

    得到机器码:100702E3 1EFF2FE1

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

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

    b) 按照上述方法把 定位到 获取角色等级的函数,其函数对应内存地址是:0x56E938 将其机器码修改成 100702E3 1EFF2FE1

     c) control + s 保存,最新的修改覆盖掉之前的il2cpp.so文件

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

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

到此,整个修改就完成了,我们看下修改前和修改后的前后对比图:

  修改前卡片等级6,技能等级都是1, 修改后都是10000

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

【总结】:

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

    【注】
    你在.cs中拿到的函数地址,其实只是这个函数开始的地址,真正执行的代码地址可以使用IDA进行查看,例如:
    【手游逆向】初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!