大江湖-逆向篇-资源提取和代码反编译

逆向篇-资源提取和代码反编译

摘要
​本文介绍了如何使用 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​虚拟机在运行时解释执行这些字节码。其技术特点如下:

    1. 跨平台性Mono​是一个开源的、可在多个平台上运行的框架,可以在 Windows​、MacOS​、Linux​等各种操作系统上运行 Unity​项目。
    2. 垃圾回收功能Mono​虚拟机具有自动垃圾回收功能,可以在运行时自动处理不再使用的对象,减少了手动内存管理的工作量。
    3. 动态编译Mono​​可以在运行时动态编译 C#​脚本,这样可以实现一些灵活的功能,比如代码热更新、动态加载等。
    4. 成熟稳定Mono​已经存在多年,被广泛应用于多个领域,包括 Unity​引擎。因此,其稳定性和可靠性得到了验证。
  • IL2CPP

    工作原理是将 C#​代码编译为 C++​代码,然后通过编译器将 C++​代码编译成目标平台的机器码。其技术特点如下:

    1. 性能优化IL2CPP​​能够将 C#​代码编译为高效的机器码,相比于 Mono​​虚拟机的解释执行方式,可以提高应用的性能和效率。
    2. 安全性:由于 IL2CPP​编译后的代码是原生机器码,相对于 Mono​虚拟机执行字节码的方式,更难以通过反编译等手段获取源代码,提高了应用的安全性。
    3. 平台独立性IL2CPP​​可以将 C#​代码编译为目标平台的机器码,可以运行在不同的平台上,包括 iOS​​、Android​​、Windows​​等。
    4. 较大的包体积:由于 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​编辑器版本号

1
m_EditorVersion: 2017.3.0f3

新建 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​会自动将资源导入

导入完成后,打开场景文件,发现已经能识别了

但是要能够运行还需要进行修复工作

0%