快乐交友 发表于 2019-6-29 12:33

记录一次Unity3d-il2cpp游戏修改

本帖最后由 快乐交友 于 2019-6-29 13:39 编辑

随着手游技术的不断发展,原先Unity3d引擎mono打包的游戏也向Unity3d IL2cpp机制打包发展,IL2cpp打包机制已经成为了U3D手游引擎的主流。
在一些游戏平台上下载的游戏在拆包时在assets/bin/Data目录下也是很少能看到以前经常熟知的Managed文件夹和Assembly-Csharp.dll的文件了。
论坛也有很多优秀的IL2cpp游戏的修改教程,第一次在论坛发帖子,同时也是记录自己的学习点滴。
IL2cpp游戏修改我主要用到的工具如下:工具也基本上能在论坛上找到。
1.IDA pro7.0(用于载入分析so文件)
2.Il2CppDumper4.4.2(反编译获取游戏函数地址)工具的github地址:https://github.com/Perfare/Il2CppDumper
3.WinHex(十六进制文件编辑器,用于修改so文件)
4.Sublime Text(一款支持语法高亮的文本工具,用于查阅Il2CppDumper反编译后生成的dump.cs文件,当然也可以用Notepad++)
5.AndroidKiller(主要用于对修改后的apk签名)
随便在游戏平台上下载了一个铁x骑士的单机游戏,修改扩展名为.zip,用压缩工具打开,在\lib\armeabi-v7a目录下发现了libil2cpp.so文件,以及在\assets\bin\Data\Managed\Metadata发现了global-metadata.dat文件,所以判定为IL2cpp机制打包的游戏。



步骤一:首先我们把global-metadata.dat和libil2cpp.so文件解压到Il2CppDumper4.4.2的目录下,然后运行Il2CppDumper.exe程序,先选择libil2cpp.so文件再选择global-metadata.dat文件,它会询问我们Unity统一版本是否大于或等于2018年3月份的,这里可以根据自己的情况进行选择,接着会要我们选择模式了,一般选择第四个模式就可以了,如图所示,看到这种提示就说明我们dump完成了。



步骤二:我们安装并运行刚才下载好的游戏,发现商城有各色各样的火车可以购买,但金币为0,火车那么多,想买辆看看,钱包那么小,一辆都买不了{:1_923:},这怎么能行,那就要对金币进行修改了。

步骤三:我们已经确立了要修改的游戏内容,那就是金币,众所周知,IL2cpp机制打包的游戏,游戏的核心逻辑都是在libil2cpp.so中,此时使用IDA pro打开并载入libil2cpp.so文件,载入文件后按下图操作。

再用文本工具Sublime Text工具打开Il2CppDumper4.4.2目录下的dump.cs文件,查找金币的英文关键词gold,coin,以获取关键函数的地址,但是我并未找到有实际意义的方法函数,不过TrainSkinSettings这个class类引起了我的注意,而且下方还有一个私有的price价格字段,所以向下翻。
然后看到了int getPrice()这个返回值为整形的方法,copy它的地址。
在ida中按G键跳转到get_Price()的相应地址,ida还未加载完成的话,可以按下C键快速展开该方法函数的汇编代码,然后Ctrl+X获取该方法被调用的地方,此时可以看到getPrice()在buyskin方法内被调用了。
我们就跳转到buyskin方法的相应地址,看到程序已经跳转到SkinItemAction处了,然后进行了入栈操作。
我们继续往下走,回到0x643380这个地址,该地址就是调用get_Price方法处,可以看到BL调用子程序get_Price后,将获得到的商品价格传入到了R5寄存器。
因此,我们此时重点关注R5寄存器,继续往下走,此时,SUB指令进入了我们的视线,如图所示,LDRR0, 和SUBR9, R0, R5这正是我们要找的关键指令,综合上面可知,LDR存储到R0的数据极有可能是金币的值,知道了这一点就好办了。
此时,我们有以下的修改方法:方法一:对上面R5寄存器的值(商品价格)利用MVN指令进行数据的取反操作,从而让商品的价格变为负数,这样R5寄存器的值就为负数值,负负得正,就能达到购买商品反加金币的效果。
修改前:
BL   TrainSkinSettings$$get_PriceMOVR5, R0
修改后:BL   TrainSkinSettings$$get_PriceMVNR5, R0
方法二:直接将SUBR9, R0, R5修改为ADDR9, R0, R5也能达到购买商品反加金币的效果。
步骤四:这里我用的是第一种方法,打开WinHex,然后打开libil2cpp.so文件,按组合键Alt+G定位到要修改指令的地址,对so文件进行修改。(当然也可以在IDA中按快捷键Ctrl+Alt+K用Patcher插件对指令进行修改)随后进行保存,替换游戏安装包原来armeabi-v7a目录下的 libil2cpp.so,因为修改的是armeabi-v7a的so文件,打包前记得把arm64-v8a 文件夹和arm64-v8a下的so文件全部删除掉,因为arm64-v8a是AArch64架构,之后再打包用AndroidKiller签名,安装运行,修改后的效果图如下:
现在就可以畅快购买,不会陷入囊中羞涩的囧境了,本次修改也就到此结束了,由于是第一次发帖,帖子中如有错误之处,麻烦各位大牛能热心指出,谢谢!

快乐交友 发表于 2021-11-17 10:37

Uni银魅 发表于 2019-7-10 22:21
请教一下,IL2CPP的U3D游戏怎么修改游戏战斗速度

很久没上线了,不好意思。
这个要根据不同的游戏做不同的具体分析,这里我只说下大体相应思路,一般来说:在dump.cs文件内查找Player类下的speed关键字函数或speed实体变量,速度在游戏中数据类型一般是浮点型,通过Hook的方式钩住float xxxSpeed()之类的函数,进行函数重写,如果是实体变量,则需要使用指针去访问修改实体变量,给其重新赋值。

姐夫总 发表于 2019-7-13 14:13

快乐交友 发表于 2019-7-11 20:32
关闭退出ida的时候,点击don't save database 就不会有其他的残留文件了。

最近在破解一款游戏,发现libil2cpp.so被修改后(即使最简单的修改,比如CMP R1, #0改为CMP             R1, #1),应用启动就会奔溃。是不是so做了加壳或者说检测so是否被篡改保护?这类问题有什么办法可以解决吗?

雨夜—伟少 发表于 2019-6-29 12:48

学习学习!

jghdhr 发表于 2019-6-29 13:17

很详细的过程,学习一下

吾爱我的爱 发表于 2019-6-29 15:21

学习思路和方法,感谢,希望多多出点这种教程{:301_997:}

虚心的菜鸡 发表于 2019-6-29 15:21

谢谢分享{:1_919:}{:1_919:}{:1_919:}

wwdzwo 发表于 2019-6-29 17:12

++

谢谢分享{:1_921:}{:1_921:}{:1_921:}

33911628 发表于 2019-6-29 22:15

还能用winhex直接改?长见识了

zhaoby7 发表于 2019-6-29 22:23

学习一下

gg8899mm 发表于 2019-7-1 09:12

好厉害啊大佬!

贾旭sx 发表于 2019-7-1 20:27

好厉害,这是高手!
页: [1] 2 3
查看完整版本: 记录一次Unity3d-il2cpp游戏修改