Minecraft混淆方式

Minecraft作为一个商业软件,自然是需要进行混淆的,但是它对Mod较为开放的态度促使了社区对其反混淆,最出名的反混淆项目名为MCP(Mod Coder Pack),这个项目的发起者名为Searge(srg的命名来源),为我们提供了notch、srg、mcp三种混淆方式,FML等主流ModLoader均使用此反混淆映射。 除了MCP之外,FabricMC团队为1.14+提供了名为Yarn的反混淆项目,目前也在逐渐发展中,目前只有FabricMC自己使用。CraftBukkit拥有自己的反混淆项目,目前也由Spigot一同维护。 在19w36a,Mojang宣布了公开官方混淆表,发布了1.14.4以上的官方混淆表,并会随着版本发布一同更新。 目前有以下几种主流的反混淆项目:

  • MCP

    • 最主流的反混淆项目

    • 用于Forge、Sponge、LiteLoader

    • 在1.16.5后停更

  • Yarn

    • 极快的更新速度,支持1.14+的预览版与正式版,完全自由使用

    • 用于Fabric

  • Mojang

    • 1.14.4开始与版本一同发布

    • 用于Minecraft开发、Forge(1.17+),也可以用于Fabric(1.14.4,1.15+)

    • 适合跨平台开发

  • Bukkit

    • 多用于服务端

    • 用于CraftBukkit、Spigot等

很遗憾的是,目前这些反混淆项目由于混淆表不同,使用不同反混淆方式的项目难以兼容,需要进行大量移植工作。

MCP

notch 全混淆

notch混淆方式是Mojang对Minecraft进行的混淆,会使得类名、方法名等均被命名为无意义的字母组合,例如bwna,这种命名方式是毫无意义且难以阅读的,这是游戏本身提供的混淆过的名称,被称为Notch Name(简称notch)。

mcp 无混淆

为了应对notch混淆无法阅读的问题,mcp团队对Minecraft的类名、方法名等提供了一个可以正常阅读的名称,这也是我们平时开发Mod在开发环境中看到的混淆方式,例如net.minecraft.client.resource.SkinManagerloadTexture,被称为MCP Name(简称mcp)。

srg 半混淆

mcp为开发者提供了可读性强的名称,但是mcp名称需要人工进行命名,很难在版本发布时立刻制作完成。同时,mcp名称在同一个版本中也会随着对Minecraft代码理解的深入发生变更,这种不稳定、严重依赖于人工的映射对于开发其实是不利的。半混淆srg应运而生,这是一种在同一版本中和notch命名稳定一一对应的命名方式,在版本发生变化时,同一类、方法一般srg名称也不会发生改变,而mcp名称可以随时更新。FML在1.6之后会在游戏运行时动态反混淆到srg名称,编译完的Mod也会被自动混淆到srg名称,我们看到的诸如field_123456_cfunc_132465_a等均为Srg Name(简称srg)。

1.17后,srg类名使用Mojang混淆映射表的类名,字段和方法名使用类似f_8848_和m_114514_的名称,这些名称是跨版本通用的。由于Mojang的类名本身比较稳定,且字段和方法名不会随着版本迭代而发生改变,“一次编译、到处运行”的跨版本Mod成为可能。

需要注意的是:

  • 类名的srg名称和mcp名称相同。

  • ForgeGradle中的mapping属性指定的是srg-mcp映射表的版本,可以随时通过修改属性并重写建立开发环境来更新开发环境的mcp名称。

  • 每个Minecraft版本的notch-srg映射表是固定的。 在1.16.5及以前,

Mojang

混淆名

混淆名与上文notch一致,例如ctoa,是发布的游戏所使用的命名,无实际意义,也是原版游戏运行时所使用的混淆方式。

无混淆名

无混淆名是Mojang内部在开发游戏过程中使用的名字,例如com.mojang.blaze3d.Blaze3DyouJustLostTheGame,具有实际的意义。

需要注意的是,混淆映射表中的无混淆名只含类名、字段名、方法名的映射,没有参数名映射。不过各大主流ModLoader的开发环境中(Fabric、Forge等),可以根据参数类型自动生成参数名。

Last updated