关于unity的il2cpp打包后反编译探索的个人学习成果
前言:1、本人反编译仅作学习用途。 2、应相关要求,下文所提及的有关所有软件及程序的下载不附地址仅提供名字(包含模糊化名字)。 3、以下内容仅为作者个人理解用语,不专业表达请谅解!il2cpp后端打包包含c#转c++的过程,除方法名以外全部代码混淆,即,通过函数抽取对代码进行加固,打包后各脚本打包在apk包目录下的classes.dex,il2cpp打包格式及调用逻辑在apk\lib\游戏名\libil2cpp.so,各脚本的方法体在apk\assets\bin\Data\Managed\Metadata\global-metadata.dat。
il2cpp打包后端的游戏,最多只能用反编译软件(例asset studio)还原各脚本的变量名和函数名,不能还原函数体的源代码。这是最大程度地还原可阅读脚本逻辑。示例其中一个脚本的空函数情况如下
函数体可以反编译出来,但是最多只能还原成,混淆后反编译成汇编语言再切换成c语言,可以定位及修改相关变量,不能还原成源码就行学习,具体操作如下。
用il2cppDumper打开libil2cpp.so,接着打开global-metadata.dat,进入反编译进程,导出dump.cs
用编译器(例vs)打开,在里面找到自己所需要的方法名的offset。
用IDA导入分析libil2cpp.so,摁g输入offset搜索位置,
跳转到(游戏运行时调用方法体的)汇编语言,
摁f5转成c语言查看。
也可继续转到4DDA94方法。
即使还原这样已经是最大程度的可阅读代码了,但看起来也是晦涩难懂,有兴趣的可以继续跳转,最终会抵达unity的各种方法(止步于此,因为作者目的不是修改数据及破解游戏,后续断点调试定位变量不做深入学习与探讨)。
以下是其他反编译方法:
1、用jar2dex反编译classes.dex文件,将classes.dex复制到j2d软件包目录下,win+r输入cmd打开控制台,cd j2d目录进入该目录,
然后输入d2j-dex2jar d classes.dex运行并在该目录下导出classes-dex2jar文件。
后用jd-gui查看导出的classes-dex2jar,
此方法也只能看到空方法体的脚本而已,此方法各函数已混淆为abcd……导致代码可阅读性低。
上述过程已有一条龙软件,例如jadx-gui 。
2、apktool反编译后也只能还原为il2cpp打包后的包,所以方法体的代码已经被加固混淆。
操作如下,将apk及apktool置于同目录下
win+r,cmd打开控制台,进入文件夹目录,输入命令执行jar程序
在目录下会生成apk名字的文件夹,解包过程结束。
3、用MetaDataStringEditor软件可以分析并可视化global-metadata.dat文件的字符串,可以作为软件汉化工具。
总结,il2cpp打包后,反编译还原不了方法体的源代码,最多只能还原脚本内声明的变量名及各方法的方法名。最多最多只能还原出剔除方法体(或空方法体或return null)的脚本的工程demo进行学习。 也就是说c#aot了也会被破解吗? 照样内存查询到具体变量,目前常用的防破解是将全局变量合为一整条二进制数字 不用全局变量不就行了吗?
页:
[1]