1.背景
体验版游戏进行到某一关即显示体验结束,程序自动退出,注意到同样系列正式版与体验版体量相差无几,开始猜测体验版包含正式版所有内容,只是关键逻辑被限制,因此展开后续逆向分析。
2.环境装备
本次实战采用apktool+Il2CppDumper+dnspy+UABEA工具
3.分析过程
3.1.解包apk
用apktool解包apk
apktool d apk路径 -o 输出文件夹路径
3.2.静态分析&动态调试
查看内部文件,区分是Il2cpp还是Mono,根据不同构建进行相应处理后分析
mono:
找到assets\bin\Data\Managed\Assembly-CSharp.dll文件,用dnspy工具打开,进行静态分析
Il2cpp:
分别找到lib\arm64-v8a\libil2cpp.so文件和assets\bin\Data\Managed\Metadata\global-metadata.dat文件,使用Il2CppDumper工具进行处理得到Assembly-CSharp.dll,dump.cs文件及脚本相关文件。执行命令:
Il2CppDumper libil2cpp.so文件路径 global-metadata.dat文件路径 输出文件夹路径
在得到Assembly-CSharp.dll文件后,可用dnspy工具进行静态分析,但由于没有方法实现代码,只能看到类,方法名称等信息,因此需要通过Il2CppInspector生成IDA脚本,导入到IDA中使用。打开Il2CppInspector图图形界面,选择libil2cpp.so和global-metadata.dat生成script.py脚本文件。
使用IDA打开Assembly-CSharp.dll文件,加载完成后导入script.py脚本文件即可进行分析。
3.3.修改逻辑
通过搜索相关关键词找到关键逻辑所在,确认关键逻辑后,可进一步进行动态调试分析,实战中未进行此步。通过分析得知关键点在于某一类成员序列化赋值,需要在资源文件中修改其赋值从而进行破解。
使用UABEA工具打开assets文件夹中的资源文件进行查找,然后修改关键值,经典文件为level0~9,data.unity3d文件等。
注意:在打开新版软件中data.unity3d文件时,需要将Il2CppDumper生成的dll文件均拷贝到assets\bin\Data\Managed文件下后进行,否则可能出现错误。
3.4.封包
修改完成后,即可通过apktool进行打包使用了,重新打包的apk需要重新签名才可以正常安装使用,操作顺序为打包-对齐-签名-安装
对齐是为了对齐资源,减少apk体积,提高运行效率,此处需要zipalign,apksigner和keytool 工具。zipalign,apksigner均为 Andorid Build Tools工具,keytool为java JDK自带工具
打包,执行命令:
apktool b 文件夹路径 -o 名称.apk
对齐,执行命令:
zipalign -v -p 4 名称.apk 名称_aligned.apk
生成签名文件,得到my.keystore文件,执行命令:
keytool -genkey -v -keystore my.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000
签名,执行命令:
apksigner sign --ks my.keystore --ks-pass pass:123456 名称_aligned.apk
完成后即可安装了,到此实战结束
4.实战总结
本实战由于同系列新软件和旧软件采用同一核心代码逻辑,因此新软件在使用Il2CPP构建时,分析过程并未在IDA中进行,IDA分析较难基本上是指令,还需要后续学习,本次算是投机取巧成功,通过对旧版本代码分析得知了软件基本逻辑。
5.尾言
由于涉及资源较为敏感,因此本篇文章中没有展示任何相关图片和操作细节,望诸位海涵,此外,这是我初学者时进行的操作和学习,工具没有问题,对于封包和签名等操作亦可使用工具进行,更方便快捷。
注意!完成此实战需要一定的知识前提,需要了解Unity游戏文件结构和核心所在,该文中虽然已经提及,若要精于逆向技术,还望诸君勉之。此程序关键在于序列化赋值隐藏,逻辑方面静态分析即可完成。
