一
前言
unity il2cpp
逆向的题,没有设计游戏内容,只有一个check,单纯的考察il2cpp逆向的知识。因为考虑了是新生赛,所以check部分没有设计的很复杂,并且比赛时长接近一个月,所以目的就是让新生们通过搜索资料学习来解出这两题,并且对游戏引擎逆向有一些了解和经验。事实证明有很多新人师傅们做到了,这里也夸夸师傅们太强了哈哈。二
baby unity
global-metadata.dat
文件中,程序启动时会按需从中读取。GameAssembly.dll
,global-metadata.dat
,然后就可以dump了。DummyDll\Assembly-CSharp.dll
,可以看到有个Check
类,所以我们重点关注OnClick
,CheckkkkkkkkkkFlag
,EEEEEEEEEEEEEncrypt
这三个方法即可,但是Il2CppDumper是无法将代码还原的,不明白的话可以去理解一下IL2CPP(IL to CPP)是什么意思,所以我们要去IDA里去看这个三个方法到底在做什么。GameAssembly.dll
,然后使用il2CppDumper目录下的ida_with_struct_py3.py
脚本,依次选择script.json
和il2cpp.h
,稍等之后就可以恢复符号表。CheckkkkkkkkkkFlag
这个方法了。输入 -> base64编码 -> 异或0xF
,最后和密文进行比较,密文实际上也是一个StringLiteral
,在脚本恢复符号的时候也一起写在注释里了。三
ez unity
global-metadata.dat
文件直接内存中dump即可拿到解密后的文件,感觉有点过于简单,所以考虑直接修改Il2CPP的东西了。但是我尝试了直接修改libil2cpp的源码,结果就是要么编译失败,要么游戏运行直接崩了,不确定具体是什么问题。sanity
,然后在Il2cppGlobalMetadataHeader
中间插入了一个magic
(第一张图里忘记写了,应该还有一个list.Add()的),但貌似这样会导致最后一个成员被挤掉了,但是不影响游戏正常运行我也就没管了,有大佬会这方面的还请提提意见Orz。global-metadata.dat
的结构做了一些特殊修改,所以工具是无法直接使用的。import "frida-il2cpp-bridge"; Il2Cpp.perform(() => {
console.log(Il2Cpp.unityVersion);Il2Cpp.dump("dump.cs", "./")
});
// Assembly-CSharp
class Check : UnityEngine.MonoBehaviour
{
System.Void Start(); // 0x0027d670
System.Void Update(); // 0x0027d670
System.Void OnClick(); // 0x0027d4e0
System.Boolean CheckFlag(System.String input); // 0x0027d460
static System.String AESEncrypt(System.String text, System.String key, System.String iv); // 0x0027d200
static System.String AESDecrypt(System.String text, System.Byte[] key, System.Byte[] iv); // 0x0027d000
System.Void .ctor(); // 0x0027d680
}
CheckFlag
(Imagebase + RVA),根据dump.cs
里的RVA恢复一下符号,可以看到加密只有一个简单的AES,那么只要拿到key和iv就行了,因为字符串信息都是保存在global-metadata.dat
里的,所以在GameAssembly.dll
里是无法得到的,可以直接调试分析得到,也可以使用下面的方法。frida-il2cpp-bridge
的Tracer
来追踪一下String
类。import "frida-il2cpp-bridge"; Il2Cpp.perform(() => {
console.log(Il2Cpp.unityVersion);const String = Il2Cpp.corlib.class("System.String");
Il2Cpp.trace(true).classes(String).and().attach();
});
pNufkEIU9dHjKXYXWiFyrthHYFEfqJAWcPM/t8/zX1w=
❯ python .\main.py 'ez unity.exe'
2022.3.17f1c1
il2cpp:
0x0077b6f0 ┌─System.String::FastAllocateString(length = 24)
0x0077b6f0 └─System.String::FastAllocateString = ""il2cpp:
0x0077afd0 ┌─System.String::op_Equality(a = "arpEeXJzJ5Fh4j+2tx6fIw==", b = "pNufkEIU9dHjKXYXWiFyrthHYFEfqJAWcPM/t8/zX1w=")
0x0077afd0 └─System.String::op_Equality = falseil2cpp:
0x0077afd0 ┌─System.String::op_Equality(a = "Wrong!", b = "Wrong!")
0x0077afd0 └─System.String::op_Equality = true
import "frida-il2cpp-bridge"; Il2Cpp.perform(() => {
console.log(Il2Cpp.unityVersion);const AssemblyCSharp = Il2Cpp.domain.assembly("Assembly-CSharp").image
const Check = AssemblyCSharp.class("Check");
Il2Cpp.trace(true).classes(Check).and().attach();
});
key = "a216d5d34c2723f5", iv = "9f68268f755b1363"。
❯ python .\main.py 'ez unity.exe'
2022.3.17f1c1
il2cpp:
0x0027d4e0 ┌─Check::OnClick(this = Button (Check))
0x0027d200 │ ┌─Check::AESEncrypt(text = "", key = "a216d5d34c2723f5", iv = "9f68268f755b1363")
0x0027d200 │ └─Check::AESEncrypt = "arpEeXJzJ5Fh4j+2tx6fIw=="
0x0027d4e0 └─Check::OnClick
frida-il2cpp-bridge
四
结语
看雪ID:TubituX
https://bbs.kanxue.com/user-home-958990.htm
# 往期推荐
球分享
球点赞
球在看
点击阅读原文查看更多