首先,要了解 IL2CPP 如何解析,就需要先了解相关信息以什么格式存在于内存中。以下是 IL2CPP 源码中的部分。由这些代码可以看到是呈现树状结构的。assembly->class->method 而 unity 中有一些导出函数:有了以上的信息,我们就可以通过主动调用 unity 的导出函数来对内存进行解析。(以下代码基于 frida js)仅展示众...
IL2CPP技术的另一部分是运行时库(libil2cpp),它的存在是为了支持IL2CPP虚拟机的运行,运行时库几乎完全由C++代码编写,并作为一个静态库与最终的可执行程序链接。(值得一提的是,IL2CPP技术十分得益于使用了libil2cpp这一更轻便的运行时库) 你可以通过查看 libil2cpp 的头文件了解其的代码构成(Windows 系统下的目录...
IL2cpp Unity在Mono之后又推出了IL2CPP,那它们之间具体有什么区别呢? 一、Mono Wiki:Mono是一个由Xamarin公司(先前是Novell,最早为Ximian)所主持的自由开放源码项目。该项目的目标是创建一系列符合ECMA标准的.NET工具,包括C#编译器和通用语言架构。与微软的.NET Framework不同,Mono项目不仅可以运行于Windows系统上,还...
托管代码中的异常都会被il2cpp转换成C++的异常。如图3-11,所有托管异常都被封装在C++中的IL2CppExcetionWrapper类型,当C++代码捕获异常后,会解析获取对应的托管异常,通过il2cpp_codegen_class_is_assignable_from()判断该异常是否要捕获的异常,如果是则跳转至Catch代码块执行,否则抛出一个C++异常。 (5)goto 如图3-11...
什么是IL2CPP? 从技术层面上来说,我们说的IL2CPP包含了两部分: 一个进行 预先编译的编译器(译注:ahead-of-time,又叫AOT,以下一律使用AOT缩写) 另外一个部分就是对虚拟机提供支持的运行时库。 AOT编译器将由.NET 输出的中间语言(IL)代码生成为C++代码。 运行时库则提供诸如垃圾回收,与平台无关的线程,IO以及...
关于Il2cpp的资料网上有很多,简而言之,Il2cpp就是unity用来代替原来的基于Mono虚拟机的一种新的打包方式,它先生成IL(中间语言),然后再转换成Cpp文件,提高运行效率的同时增加了安全性。原本基于Mono的打包方式极其容易被逆向,现在市面上的新游戏基本上都是用Il2cpp的方式打包的,当然Il2cpp的逆向教程也很多,但...
可以说Mono是Unity3D核心的核心,是Unity3D跨平台的根本。但是在2014年年中的时候,Unity3D官方博客上却发了一篇“The future of scripting in unity”的文章,引出了IL2CPP的概念,感觉有取代Mono之势。那什么是IL2CPP,它能为Unity3D和作为使用Unity3D的我们带来哪些好处和改变?这就是本文尝试说明的。
在开始分析il2cpp之前,首先我们了解一下一个unity app的项目结构: AppName/ ├── Assets/ # 包含所有游戏资源和脚本文件 ├── Library/ # Unity的库文件和缓存,自动生成 ├── ProjectSettings/ # Unity项目设置文件夹 ├── Packages/ # Unity Package Manager (UPM) 的依赖包 ...
il2cpp.exe 是由C#编写的受托管的可执行程序,它接受我们在Unity中通过Mono编译器生成的托管程序集,并生成指定平台下的C++代码。 IL2CPP的工具链如下图所示: il2cpp-toolchain 运行时库 IL2CPP技术的另一部分是运行时库(libil2cpp),它的存在是为了支持IL2CPP虚拟机的运行,运行时库几乎完全由C++代码编写,并作为一...
首先,我们来了解一下,IL2CPP 是如何被破解的。 在Unity IL2CPP 模式下,游戏逻辑是以 Native 代码运行, 但依然存在 C# 某些语言特性(如GC、反射),会将所有的 C# 中的类名/属性名/字符串等信息记录在 global-metadata.dat 文件中,IL2CPP 启动时会从这个文件读取所需要的信息。