本帖最后由 快乐交友 于 2019-6-29 13:39 编辑
随着手游技术的不断发展,原先Unity3d引擎mono打包的游戏也向Unity3d IL2cpp机制打包发展,IL2cpp打包机制已经成为了U3D手游引擎的主流。
在一些游戏平台上下载的游戏在拆包时在assets/bin/Data目录下也是很少能看到以前经常熟知的Managed文件夹和Assembly-Csharp.dll的文件了。
论坛也有很多优秀的IL2cpp游戏的修改教程,第一次在论坛发帖子,同时也是记录自己的学习点滴。
IL2cpp游戏修改我主要用到的工具如下:工具也基本上能在论坛上找到。
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,火车那么多,想买辆看看,钱包那么小,一辆都买不了,这怎么能行,那就要对金币进行修改了。
步骤三:我们已经确立了要修改的游戏内容,那就是金币,众所周知,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指令进入了我们的视线,如图所示,LDR R0, [R6,#0x10]和SUB R9, R0, R5 这正是我们要找的关键指令,综合上面可知,LDR存储到R0的数据极有可能是金币的值,知道了这一点就好办了。
此时,我们有以下的修改方法: 方法一:对上面R5寄存器的值(商品价格)利用MVN指令进行数据的取反操作,从而让商品的价格变为负数,这样R5寄存器的值就为负数值,负负得正,就能达到购买商品反加金币的效果。
修改前:
BL TrainSkinSettings$$get_Price MOV R5, R0
修改后: BL TrainSkinSettings$$get_Price 方法二:直接将SUB R9, R0, R5修改为ADD R9, 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签名,安装运行,修改后的效果图如下:
现在就可以畅快购买,不会陷入囊中羞涩的囧境了,本次修改也就到此结束了,由于是第一次发帖,帖子中如有错误之处,麻烦各位大牛能热心指出,谢谢!
|