type
status
date
slug
summary
tags
category
icon
password
🔶
本文参考的是Unity Editor 2022里面的il2cpp源码

global-metadata结构

unity引擎可以使用il2cpp技术来将c#代码转换成cpp代码再编译成native code从而实现AOT,其中c#脚本里面的类的信息和都会存储到global-metadata文件里面,这个文件头结构的定义在GlobalMetadataFileInternals.h 里面。
随便的写个unity工程然后使用UnityMetadata模板运行也能看见结构体的信息
notion image
文件的魔术头是AF 1B B1 FA,后面紧接着的是版本号。这里面是各个元数据段的偏移和数量,具体的各个元数据的定义在il2cpp-metadata.h文件里面。

global-metadata的加载流程

主要参考的是,先看看il2cpp的源码吧。
首先是il2cpp_init位于il2cpp-api.cpp
Runtime::Init函数很长,主要看看g_CodegenRegistrationMetadataCache::Initialize
notion image
首先查看g_CodegenRegistration
函数不在il2cpp源码里面,这个需要在构建项目的时候勾选develop选项然后再il2cppOutput文件夹里面寻找Il2CppCodeRegistration.cpp文件
可以看到g_CodegenRegistration = s_Il2CppCodegenRegistration这句赋值语句,然后s_Il2CppCodegenRegistration又调用了il2cpp_codegen_register,其中传入了三个重要的结构体,g_CodeRegistrations_Il2CppCodeGenOptions结构体就在这个文件中,g_MetadataRegistration在il2cppOutput文件夹下面的Il2CppMetadataRegistration.c文件中
函数il2cpp_codegen_register在il2cpp的源码il2cpp-codegen-il2cpp.cpp文件里面
可以看到这部分就是将三个关键的结构体传递到引擎层。接下来继续看MetadataCache::Initialize函数。
notion image
至此globa-metadata文件加载流程分析完毕,魔改的话可以寻找il2cpp_init函数作为入口点,如果这个函数不存在那么需要到libunity.so里面寻找LoadIl2Cpp函数。
notion image

📎 参考文章

2024年度总结n1ctf-2018 babyUnity3d
Loading...