初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明介绍】
本人技术出身,对ios逆向破解有过1-2年经验。近期闲来无事,看到论坛一些大神unity3d 游戏修改的教程,学习了一下。这里拿个u3d网游做个测试和总结。首先我找的是一款韩国3DMMORPG,《HelloHeroEpicBattle》(apk并附带obb,附件过大,这里附上下载链接:点我下载 (下载的是xapk解压有obb和apk) ,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 ,直接下载最新版本
(顺便说下哈,最新版本提取出来的是.h 和 .cs 两个文件,早一些的版本才是论坛教程里常见的.py 和 .cs,不论是.h 或 .py 都是给IDA工具来对应so中地址所对应函数名的文件)
打开 Il2CppDumper.exe 然后按照提示选择我们刚在apk里拿出来的两个文件:(打开Il2CppDumper可能需要你电脑环境安装了.netframework 4.x+ 百度即可)
(新版本不需要你手动输入游戏对应的unity3d版本号,旧版本需要,至于如何游戏用的什么版本,论坛有大神都给出了教程,这里也不赘述)
最终产生我们所需的 .cs 文件( .py 或 .h 不是必须要用的文件,只是ida 所需)如下图:
【第三步】:利用工具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 BXLR
以上代码表示:把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,技能等级都是10000:
【总结】:
1.整体破解思路就是拿到dump出来的cs函数文件,进行搜索关键(关心的)函数,拿到其地址
2. 然后使用IDA打开.so文件,也是 g 定位到你关心的函数地址上,然后对函数进行修改成你想要的逻辑汇编代码
(此步骤,需要你对汇编和代码逻辑有一定的理解和熟悉,如果不太懂就可以仿照本文的暴力修改直接返回)
3.将你修改的汇编代码对应的地址记录好,然后到so中进行定位修改。
【注】
你在.cs中拿到的函数地址,其实只是这个函数开始的地址,真正执行的代码地址可以使用IDA进行查看,例如:
上图中是IDA中展示的某一个函数地址为0x003D4864,而假设你修改了正方形圈选的这一行,那么你.so对应修改的内存地址:
不应该是 0x003D4864,而是箭头指向对应的修改的那一行的地址:0x003D4898
其实本篇介绍的相对比较初级,对概念和工具简单做的一个介绍,其实本人想修改其攻击力,但是发现此游戏我能搜到的关心的函数,都无法修改掉- -。。
还希望论坛里的大神有时间可以多多指教一下。
文中若有任何说明错误或者不对的地方,希望大家多多指正,头次发帖,望兄弟们多理解~
本帖最后由 涛之雨 于 2020-8-26 15:22 编辑
论坛封装好的ida可以用
keypatch
插件,
ctrl+alt+k
快速打补丁,省了转机器码的步骤了
此外沙发的链接重新编辑一下。
链接格式不对
此外git直接可以下载干嘛要扔到附件里。。。
https://github.com/Perfare/Il2CppDumper/releases/
gayhub最新版下载地址 慵懒丶L先森 发表于 2020-8-27 02:24
论坛有很多此类的教程,但是这篇在操作方面上是我见过对新手最友好的,真正完完整整的一个步骤一个步骤的教 ...
{:1_893:} 过誉了,谢谢 本帖最后由 qianzhen8 于 2020-8-25 21:28 编辑
IDA 工具下载地址,这里导航论坛大神帖 https://www.52pojie.cn/thread-675251-1-1.html
汇编指定转机器码地址: https://armconverter.com/ mark标记,学习了 大佬大佬 这个非常的不错 学习了, 谢谢分享 涛之雨 发表于 2020-8-26 15:20
论坛封装好的ida可以用
keypatch
插件,
gayhub:lol哈哈啊 可以可以 学习了 提供了不错的解决思路,蛮好的教程文章.
关于IL2CPP应对这类修改的解决方案也有,只要通过简单的一个混淆,用ILDumper做分析的难度系数会大幅度增加 很不错,学习了