找回密码
 立即注册
查看: 390|回复: 3

[笔记] 关于unity的il2cpp打包后反编译探索的个人学习成果

[复制链接]
发表于 2022-5-5 14:42 | 显示全部楼层 |阅读模式
前言: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进行学习。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2022-5-5 14:52 | 显示全部楼层
也就是说c#aot了也会被破解吗?
发表于 2022-5-5 15:01 | 显示全部楼层
照样内存查询到具体变量,目前常用的防破解是将全局变量合为一整条二进制数字
发表于 2022-5-5 15:04 | 显示全部楼层
不用全局变量不就行了吗?
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-21 20:54 , Processed in 0.120507 second(s), 27 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表