前言: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进行学习。