大江湖-逆向篇-资源提取和代码反编译
逆向篇-资源提取和代码反编译
UnityRipper
工具对游戏资源进行提取和使用 Reflector
工具对代码进行反编译,并创建 Unity2D 工程导入资源和代码资源解包
使用 UnityRipper
进行游戏资源提取,UnityRipper 是一个强大的开源 Unity
资源解包工具,它支持 Texure2D
、Sprite
等多种资源的还原,并且能够将其还原成 Unity
源码工程的目录结构,可导入 Unity
编辑器中进行查看。
Export features
Scenes
Prefabs (GameObjects with transform components)
AnimationClips (legacy, generic, humanoid)
Meshes
Shaders (native listing)
Textures
Audio
Fonts
Movie textures
Materials
AnimatorControllers
Avatars
Terrains
TextAssets
Components:
- MeshRenderer
- SkinnedMeshRenderer
- Animation
- Animator
- Canvas
- Light
- ParticleSystem
- Colliders
- Rigidbody
- AudioSource
- Camera
- MonoBehaviour (Mono only)
- MonoScript (Mono only)
打开 UnityRipper
工具,将整个游戏目录拖到界面中,点击 export
,选择要导出的目录
等待导出完成
导出目录下出现了一个 TheWorldOfKongFu
目录,里面的文件夹结构跟 Unity
的源码工程一致
这个工具只能解包资源文件,所有代码文件只有文件名称和引用信息
文件内容均为空
代码反编译
Unity 代码编译方式
Unity
编译代码时有两种 Scripting Backend
,分别是MONO
和 IL2CPP
MONO
其工作原理是将
C#
代码编译成Mono
的字节码,然后通过Mono
虚拟机在运行时解释执行这些字节码。其技术特点如下:- 跨平台性:
Mono
是一个开源的、可在多个平台上运行的框架,可以在Windows
、MacOS
、Linux
等各种操作系统上运行Unity
项目。 - 垃圾回收功能:
Mono
虚拟机具有自动垃圾回收功能,可以在运行时自动处理不再使用的对象,减少了手动内存管理的工作量。 - 动态编译:
Mono
可以在运行时动态编译C#
脚本,这样可以实现一些灵活的功能,比如代码热更新、动态加载等。 - 成熟稳定:
Mono
已经存在多年,被广泛应用于多个领域,包括Unity
引擎。因此,其稳定性和可靠性得到了验证。
- 跨平台性:
IL2CPP
工作原理是将
C#
代码编译为C++
代码,然后通过编译器将C++
代码编译成目标平台的机器码。其技术特点如下:- 性能优化:
IL2CPP
能够将C#
代码编译为高效的机器码,相比于Mono
虚拟机的解释执行方式,可以提高应用的性能和效率。 - 安全性:由于
IL2CPP
编译后的代码是原生机器码,相对于Mono
虚拟机执行字节码的方式,更难以通过反编译等手段获取源代码,提高了应用的安全性。 - 平台独立性:
IL2CPP
可以将C#
代码编译为目标平台的机器码,可以运行在不同的平台上,包括iOS
、Android
、Windows
等。 - 较大的包体积:由于
IL2CPP
编译后的代码是机器码,相比于Mono
虚拟机解释执行字节码的方式,会占用更多的存储空间,导致构建出的应用包体积较大。
- 性能优化:
从反编译的角度来说,MONO
编译的 dll
可以通过使用 .Net Reflector
等工具较为轻松的还原为源码,只需要进行简单的修复即可。而通过 IL2CPP
编译后只能使用 IDA
等工具反汇编后查看,分析难度较大。
使用.Net Reflector反编译
大江湖使用的是 MONO
进行编译,反编译比较简单。
.Net Reflector 工具,它是一款非常知名且实用的 .net
反编译工具,由微软员工 Lutz Roeder
编写,允许用户查看和调试所使用的所有 .NET
代码的源代码。
打开 TWOKFDEMO\TheWorldOfKongFu_Data\Managed
目录,编译后游戏逻辑都在 Assembly-CSharp.dll
中,其它 dll
为 Unity
库或第三方库,我们只需要反编译 Assembly-CSharp.dll
即可。
将 Assembly-CSharp.dll
拖入工具中,此时所有代码已经可以直接查看
右键选择 Export Source Code
,目录选择刚刚导出的工程目录 Assets\Scripts\Assembly-CSharp
导出成功后,所有 cs
源文件都有内容了,且生成了 Assembly-CSharp.csproj
文件
导入 Unity 工程
接下来要将反编译的资源文件和代码导入 Unity
工程中
查看 Unity 编辑器版本号
打开 ProjectSettings\ProjectVersion.txt
文件查看 Unity
编辑器版本号
|
|
新建 2D 工程
Unity Hub
打开导出的工程,Unity Editor
会闪退,需要新建一个 Unity 2D
工程后,再将资源文件复制过来导入创建一个 2D
工程,取名为 TWOKF
工程创建好后,随便创建一个 C# Script
文件,并双击自动打开 visual studio
,此时目录下会自动创建 Assembly-CSharp.csproj
和 TWOKF.sln
文件
Unity
,记得将 edit
-> preferences
-> External Tools
-> external script editor
选项设置为使用的 VS 版本,否则不会自动生成 sln
工程文件
导入资源文件
将前面导出的 TheWorldOfKongFu/Assets
下的所有目录拖到新建的工程 Assets
目录中,Unity
会自动将资源导入
导入完成后,打开场景文件,发现已经能识别了
但是要能够运行还需要进行修复工作