XYCTF2024 RE ez unity 复现

dll依然有加壳

但是这次global-metadata.dat也加密了,原工具没办法用了,不过依然是可以修复的

a. 法一:frida-il2cpp-bridge

可以用frida-il2cpp-bridge

GitHub - vfsfitvnm/frida-il2cpp-bridge: A Frida module to dump, trace or hijack any Il2Cpp application at runtime, without needing the global-metadata.dat file.

记frida-il2cpp-bridge的使用-CSDN博客

一定要用第二种方法编译,不然那后面的脚本不好注入

(编译找不到python包就放到C盘去)

  • npm run watch 启动编译
bash 复制代码
{
  "main": "index.ts",
  "scripts": {
    "prepare": "npm run build",
    "watch": "frida-compile index.ts -w -o hook.js"
  },
  "dependencies": {
    "frida-il2cpp-bridge": "^0.8.5"
  }
}

脚本写在这里

TypeScript 复制代码
import "frida-il2cpp-bridge";

Il2Cpp.perform(() => {
    console.log(Il2Cpp.unityVersion);
    Il2Cpp.dump("dump.cs", "./")
});

hook.js会自动生成

启动ez unity.exe

然后cmd命令注入,pid号可以在任务管理器查看

frida -l C:\frida-il2cpp-bridge\hook.js -p 4572

dump.cs就会保存在exe同目录下

搜索Assembly-CSharp得到关键函数,注释里是相对虚拟地址(Relative Virual Address,RVA)

我们用IDA打开脱壳的GameAssembly.dll,IDA显示的都是虚拟地址(VA)

VA = Imagebase(基地址) + RVA

可以用CFF Explorer查一下

由此可以算出上面几个函数的VA,然后手动G跳转过去就可以找到函数,进行命名

不过字符串信息都在global-metadata.dat里,所以dll里也搞不到需要的参数(其实注释里能找到)

所以frida-il2cpp-bridge跟踪字符串

TypeScript 复制代码
import "frida-il2cpp-bridge";
Il2Cpp.perform(() => {
    console.log(Il2Cpp.unityVersion); //打印出 Unity 游戏的版本
    const String = Il2Cpp.corlib.class("System.String");
    //从 Unity 游戏的 mscorlib(即 Unity 的 C# 运行库)中获取了 System.String 类的引用,
    //并将其存储在 String 常量中
    Il2Cpp.trace(true).classes(String).and().attach();
    //设置跟踪为启用状态 指定您想要跟踪的类 链式调用方法 启动跟踪
});

点击一下Check键

可以看到被调用的参数

这里应该是输入的加密和原密文的对比,所以得到密文 pNufkEIU9dHjKXYXWiFyrthHYFEfqJAWcPM/t8/zX1w=

然后追踪Check类

TypeScript 复制代码
import "frida-il2cpp-bridge";
Il2Cpp.perform(() => {
    console.log(Il2Cpp.unityVersion);
    const AssemblyCSharp = Il2Cpp.domain.assembly("Assembly-CSharp").image //默认的 C# 脚本编译目标, 返回该程序集的实际内存镜像
    const Check = AssemblyCSharp.class("Check"); //查找该程序集中名为 Check 的类
    Il2Cpp.trace(true).classes(Check).and().attach();
});

点一下

key = "a216d5d34c2723f5", iv = "9f68268f755b1363"

也可以这样写

TypeScript 复制代码
import "frida-il2cpp-bridge";
let ass = Il2Cpp.domain.assembly("Assembly-CSharp");
//从 Unity 游戏的 IL2CPP 运行时域中获取 Assembly-CSharp 程序集的引用
Il2Cpp.trace(true).assemblies(ass).and().attach();

(woc frida真好用)

b. 法二:global-metadata.dat解密

实际上是文件头被改了

先看看正常的文件头

改一下

跑一下(记得脱壳)

之后同baby unity恢复符号表

Check__AESEncrypt(input, StringLiteral_5611, StringLiteral_5124, 0i64)的参数点开来看看

因为都是明文存储的字符串,脚本添加的注释里可以找到AES的所有参数,然后同上用厨子解一下即可

c. 法三:CE的Mono dissector

【CheatEngine基础教程】四、Unity3D游戏《晚上nano好》修改实战 - 哔哩哔哩

附加进程后激活Mono并分析

函数符号表全看到了,地址是动态的没啥用,之后还是frida钩子分析参数

相关推荐
ellis19701 小时前
C#/Unity清理非托管资源
unity·c#
玖玥拾18 小时前
Unity 3D 笔记(十四)Unity/C# Socket 网络笔记3
服务器·网络·unity·c#
Python私教20 小时前
Godot图片怎么导入?PNG、压缩、Mipmap与Reimport一次讲清
游戏引擎·godot
玖玥拾20 小时前
Unity 3D 笔记(十七)Unity/C# Socket 网络笔记6
服务器·网络·unity·c#
寒水馨1 天前
Linux下载、安装godot-4.7.1-stable(附安装包Godot_v4.7.1-stable_linux.x86_64.zip)
linux·游戏引擎·godot·游戏开发·2d游戏·3d游戏·godot engine
寒水馨1 天前
macOS下载、安装godot-4.7.1-stable(附安装包Godot_v4.7.1-stable_macos.universal.zip)
macos·3d·游戏引擎·godot·跨平台·游戏开发·2d
Irene19911 天前
怎么设置 PyCharm 使用 VSCode 的快捷键,推荐保留的原生快捷键(特色功能不建议覆盖,否则丧失效率优势)Ctrl+Alt+L:代码格式化
vscode·pycharm·快捷键
放学校门口见2 天前
vscode部署stm32开发调试环境
ide·vscode·stm32
电子云与长程纠缠2 天前
UE中使用TGuardValue与TInlineComponentArray数据结构
开发语言·数据结构·学习·ue5·游戏引擎
玖玥拾2 天前
Unity 3D 笔记(十二)Unity/C# Socket 网络笔记1
网络·unity·c#