前言: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)还原各脚本的变量名和函数名,不能还原函数体的源代码。这是最大程度地还原可阅读脚本逻辑。示例其中一个脚本的空函数情况如下
![](https://disc8888.com/wp-content/uploads/2022/12/v2-e822b469e77d860c897771cfe927c660_r.jpg)
函数体可以反编译出来,但是最多只能还原成,混淆后反编译成汇编语言再切换成c语言,可以定位及修改相关变量,不能还原成源码就行学习,具体操作如下。
用il2cppDumper打开libil2cpp.so,接着打开global-metadata.dat,进入反编译进程,导出dump.cs
![](https://disc8888.com/wp-content/uploads/2022/12/v2-49458103c7d7e911246ffa9e5d6453e2_r.jpg)
用编译器(例vs)打开,在里面找到自己所需要的方法名的offset。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-d397045e4888f045b274748a57f062d2_r.jpg)
用IDA导入分析libil2cpp.so,摁g输入offset搜索位置,
![](https://disc8888.com/wp-content/uploads/2022/12/v2-c96af3279210e76570912a9c3c3c4f63_r.jpg)
跳转到(游戏运行时调用方法体的)汇编语言,
![](https://disc8888.com/wp-content/uploads/2022/12/v2-1d5ede2c071c0636c85f9ad370967823_1440w.webp.jpg)
摁f5转成c语言查看。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-af8707375dfca02c03b94dd82bdda14d_r.jpg)
也可继续转到4DDA94方法。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-6fa235fc98cf7f421259d137b9299b3c_r.jpg)
即使还原这样已经是最大程度的可阅读代码了,但看起来也是晦涩难懂,有兴趣的可以继续跳转,最终会抵达unity的各种方法(止步于此,因为作者目的不是修改数据及破解游戏,后续断点调试定位变量不做深入学习与探讨)。
以下是其他反编译方法:
1、用jar2dex反编译classes.dex文件,将classes.dex复制到j2d软件包目录下,win+r输入cmd打开控制台,cd j2d目录进入该目录,
![](https://disc8888.com/wp-content/uploads/2022/12/v2-2f5baa39e18f4e8124ed95be09d78e4a_r.jpg)
然后输入d2j-dex2jar d classes.dex运行并在该目录下导出classes-dex2jar文件。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-3a4c177821d9538263e364e00a5a1fed_r.jpg)
后用jd-gui查看导出的classes-dex2jar,
![](https://disc8888.com/wp-content/uploads/2022/12/v2-12f959e34191e4e1ae009f0f237028e7_r.jpg)
此方法也只能看到空方法体的脚本而已,此方法各函数已混淆为abcd……导致代码可阅读性低。
上述过程已有一条龙软件,例如jadx-gui 。
2、apktool反编译后也只能还原为il2cpp打包后的包,所以方法体的代码已经被加固混淆。
操作如下,将apk及apktool置于同目录下
![](https://disc8888.com/wp-content/uploads/2022/12/v2-b3fae7c6e10aa90cd774c0ecac862faa_r.jpg)
win+r,cmd打开控制台,进入文件夹目录,输入命令执行jar程序
![](https://disc8888.com/wp-content/uploads/2022/12/v2-059d2e0300a9a40a8f7c895718c28655_r.jpg)
在目录下会生成apk名字的文件夹,解包过程结束。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-26b934dc28decb03a88027efb1bd9901_r.jpg)
3、用MetaDataStringEditor软件可以分析并可视化global-metadata.dat文件的字符串,可以作为软件汉化工具。
![](https://disc8888.com/wp-content/uploads/2022/12/v2-cb064ffbf22b94a53544d43c4f7ac5fc_r.jpg)
总结,il2cpp打包后,反编译还原不了方法体的源代码,最多只能还原脚本内声明的变量名及各方法的方法名。最多最多只能还原出剔除方法体(或空方法体或return null)的脚本的工程demo进行学习。
要发表评论,您必须先登录。