首先我找的是一款韩国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 不用理会)
image.png (103.68 KB, 下载次数: 0)
下载附件
1
2020-8-25 19:22 上传
image.png (74.98 KB, 下载次数: 0)
下载附件
2
2020-8-25 19:23 上传
【注】:如果u3d游戏没有使用il2cpp的话:
我们可以直接到 apk/assets/bin/Data/Managed/ 目录下 将 Assembly-CSharp.dll 取出,使用 dnSpy 工具打开并在想要修改的位置右键进行编辑IL指令,修改值即可,相对简单这里不赘述。
如果使用il2cpp 我们继续下面的流程:
【第二步】:利用工具 Il2CppDumper 将so里的所有函数名进行提取
工具所有版本地址: Il2CppDumper ,直接下载最新版本
Il2CppDumper-v6.zip
(562.92 KB, 下载次数: 157)
2020-8-25 19:18 上传
点击文件名下载附件
3
下载积分: 吾爱币 -1 CB
(顺便说下哈,最新版本提取出来的是.h 和 .cs 两个文件,早一些的版本才是论坛教程里常见的.py 和 .cs,不论是.h 或 .py 都是给IDA工具来对应so中地址所对应函数名的文件)
打开 Il2CppDumper.exe 然后按照提示选择我们刚在apk里拿出来的两个文件:(打开Il2CppDumper可能需要你电脑环境安装了.netframework 4.x+ 百度即可)
(新版本不需要你手动输入游戏对应的unity3d版本号,旧版本需要,至于如何游戏用的什么版本,论坛有大神都给出了教程,这里也不赘述)
最终产生我们所需的 .cs 文件( .py 或 .h 不是必须要用的文件,只是ida 所需)如下图 :
image.png (236.78 KB, 下载次数: 0)
下载附件
4
2020-8-25 19:43 上传
image.png (239.85 KB, 下载次数: 0)
下载附件
2020-8-25 19:44 上传
image.png (107.21 KB, 下载次数: 0)
下载附件
2020-8-25 19:45 上传
【第三步】:利用工具UltraEdit 点我去下载 或者其他工具来打开 .cs 函数名集合文件
(这里使用010editor 原因是 后面我们要打开il2cpp.so文件必须也要用此工具,所以就懒得下载其他工具了)
我们在此函数文件中找到想要的修改的地方,如果是单机大家肯定想修改的是 Gold/Money/Level/Skill/Hp/Attack/等,搜索感兴趣关键词即可,本文我们只修改显示的等级和技能等级:
思路:找到获取等级或者技能等级的函数名,然后直接将其函数改成直接返回指定的值即可。
因此我们优先搜索相关的类,然后定位 等级和技能等级位置,确认其内存地址,如下图:
image.png (1.57 MB, 下载次数: 0)
下载附件
2020-8-25 20:03 上传
通过上图看到下面这行代码是获取角色等级的函数,其函数对应内存地址是:0x56E938
[C#] 纯文本查看 复制代码public int get_p_level(); // RVA: 0x56E938 Offset: 0x56E938
通过上图看到下面这行代码是获取角色技能等级的函数,其函数对应内存地址是:0x56FD5C
[C#] 纯文本查看 复制代码public int GetSkillLevel(int index); // RVA: 0x56FD5C Offset: 0x56FD5C
【第四步】:利用工具UltraEdit 打开.so文件进行修改
(其实这一步之前我们省略了使用IDA工具对il2cpp.so文件分析汇编源码/伪代码的过程,直接暴力返回 10000 )
1. 由于.so文件内都是汇编指令对应arm机器码,所以我们要首先要编写一段汇编代码
[Asm] 纯文本查看 复制代码 Mov R0,0x2710 BX LR
以上代码表示:把0x2710 这个值给结果R0,然后直接返回。
那么0x2710 这个值是什么? 汇编指令中使用的都是十六进制的值,而我们可以经常看到的数字都是十进制,所以我们找个十进制转十六进制的网站或者科学计算器转换一下即可,如下图:
image.png (109.06 KB, 下载次数: 0)
下载附件
2020-8-25 20:14 上传
2. 我们将汇编代码要改成.so一致的机器码,这里推荐一个转换网站: ArmConverter
image.png (120.11 KB, 下载次数: 0)
下载附件
2020-8-25 20:54 上传
得到机器码:100702E3 1EFF2FE1
3. 打开游戏的 il2cpp.so文件,control + g ,跳转到要修改的两个地址
a) 首先定位到 获取角色等级的函数,获取角色技能等级的函数,其函数对应内存地址是:0x56FD5C ,将其机器码修改成 100702E3 1EFF2FE1,如下图:
image.png (399.2 KB, 下载次数: 0)
下载附件
2020-8-25 20:45 上传
image.png (250.01 KB, 下载次数: 0)
下载附件
2020-8-25 20:58 上传
b) 按照上述方法把 定位到 获取角色等级的函数,其函数对应内存地址是:0x56E938 将其机器码修改成 100702E3 1EFF2FE1
c) control + s 保存,最新的修改覆盖掉之前的il2cpp.so文件
【第五步】:将修改好的.so文件,直接拖入我们的游戏apk对应的文件夹中进行覆盖
image.png (157.75 KB, 下载次数: 0)
下载附件
2020-8-25 20:50 上传
到此,整个修改就完成了,我们看下修改前和修改后的前后对比图:
修改前卡片等级6,技能等级都是1 :
1.png (637.99 KB, 下载次数: 0)
下载附件
2020-8-25 21:02 上传
2.png (260.12 KB, 下载次数: 0)
下载附件
2020-8-25 21:02 上传
修改前卡片等级10000,技能等级都是10000:
3.png (631.56 KB, 下载次数: 0)
下载附件
2020-8-25 21:03 上传
4.png (248.06 KB, 下载次数: 0)
下载附件
2020-8-25 21:03 上传
【总结】:
1. 整体破解思路就是拿到dump出来的cs函数文件,进行搜索关键(关心的)函数,拿到其地址
2. 然后使用IDA打开.so文件,也是 g 定位到你关心的函数地址上,然后对函数进行修改成你想要的逻辑汇编代码
(此步骤,需要你对汇编和代码逻辑有一定的理解和熟悉,如果不太懂就可以仿照本文的暴力修改直接返回)
3.将你修改的汇编代码对应的地址记录好,然后到so中进行定位修改。
【注】
你在.cs中拿到的函数地址,其实只是这个函数开始的地址,真正执行的代码地址可以使用IDA进行查看,例如:
image.png (727.06 KB, 下载次数: 0)
下载附件
2020-8-25 21:20 上传
上图中是IDA中展示的某一个函数地址为0x003D4864,而假设你修改了正方形圈选的这一行,那么你.so对应修改的内存地址:
不应该是 0x003D4864,而是箭头指向对应的修改的那一行的地址:0x003D4898
其实本篇介绍的相对比较初级,对概念和工具简单做的一个介绍,其实本人想修改其攻击力,但是发现此游戏我能搜到的关心的函数,都无法修改掉- -。。
还希望论坛里的大神有时间可以多多指教一下。
文中若有任何说明错误或者不对的地方,希望大家多多指正,头次发帖,望兄弟们多理解~