欢迎光临散文网 会员登陆 & 注册

MC源码那些事

2019-10-08 15:08 作者:禄存天玑  | 我要投稿

19w36a版本开始,Mojang决定放出自己的代码混淆映射表,不少消息也随之传出:MC开源了?Forge退役了?源码看起来更方便了?本人准备在这篇专栏里进行一定的解释。详细的原理和技术细节不会过于深入,一是自己学艺不精,二是这些领域比我更有发言权的大有人在。这里只算是科普和抛砖引玉。

首先,反混淆表是啥?

首先有必要简单解释一下混淆映射表是什么东西:

我们一般学习编写的代码,是“源代码”,它们对于人来说有易辩识的逻辑结构,也方便计算机处理。

源代码会被计算机分析,再变成可以快速处理执行的“字节码”,这个过程是Java的编译。无关重要的变量名,注释都会舍弃。

在编译的时候,如果要顾及法律层面(例如不想让其它公司知道自己代码的思路),还会对类和方法的名称进行重命名,降低可读性。这一步叫做“混淆”。

字节码被反编译之后,虽然注释和名称都会丢失,但是逻辑关系还在。可以根据常量,外部包的使用,逻辑,文件操作来理解源代码的思路,重新命名成人能快速理解的名字。这是“反混淆”。

混淆映射表可以把反编译后的代码还原回源码的命名风格。一般人们用它保存反混淆的结果。

以上便是粗略的解释。有了官方的映射表以后,反编译者不需要花费精力找出某个代码到底是干啥的,可以专心分析代码产生的效果。这也正是Mojang在官网上所说的:(https://www.minecraft.net/zh-hans/article/minecraft-snapshot-19w36a)

“This means that anyone who is interested may deobfuscate the game and find their way around the code without needing to spend a few months figuring out what’s what.”

所以说,MC开源了?

只关心结果的话,是的。

但是Mojang和微软并没有更改任何代码相关的法律条款。使用者仍然需要承担法律风险。(参见https://www.minecraft.net/zh-hans/article/minecraft-snapshot-19w36a)

不过Mojang对于mod和其它用途的逆向工程一直是默许,甚至欢迎的。之前的minecon邀请了几位知名国外modder,这次又邀请了scicraft成员,不难看出他们的态度。之前也对mc的几个库进行了开源,这次的映射表想必也可以放心使用。

另外,开源是放出源代码,而要使用映射表,则需要先进行反编译,再映射。反编译出来的代码不保证一定能再编译成字节码...

由此看来,开源作为口头上不精确的表达,问题不大。书面使用的时候应该进行注意。

Forge退役了吗?

首先,问出这个问题说明不懂什么是Forge。真正着手源码反编译反混淆的项目叫做MCP(MinecraftCoderPack)。为了给许许多多的mod提供一个兼容高,bug少,做起来方便的平台,于是就有了基于MCP是Forge。以上是MCP和Forg的简单辨析。

就算你知道源代码是啥,这个mod改一点,那个mod改一点,迟早要冲突,那么就要Forge来协调。LiteLoader是做这个的,Fabric(基于Yarn进行反混淆)也是做这个的。

就算是MCP本身也不会退役。它已经采取和官方不同的一套命名规范,大规模改动去迎合官方可能性不高。但是有了官方映射表,新版本的跟进会方便一些。

这么说来,反混淆的放出简化了不少工作,但并不会对现有的社区生态有较大的改变。

个人推测这是mojang为了吸引技术玩家进驻高版本抛出的一个橄榄枝。但是由于每个版本都会改变不少东西,Forge还得辛辛苦苦做API,技术玩家还得重构红石机器研发新思路,此举可能收效甚微。

不过就算这样,技术玩家终于不用对着高版本里奇怪的变量名抓耳挠腮了。虽然一直说着neverupdate,但是能发掘出更多的新特性,也是挺有意思的(然后发掘完了继续neverupdate)

Mojang公开混淆映射表,有意义吗?


MC源码那些事的评论 (共 条)

分享到微博请遵守国家法律