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

如何用一个已编译的 Fabric Mod JAR 重建模组项目

2023-08-06 10:13 作者:ZX夏夜之风  | 我要投稿

各位好,这里是夏夜之风。

前段时间给一个朋友修复了一个不工作的模组,因为第一次接触这种问题,所以把过程写下来,算是一笔宝贵的经验了。


声明: 本人不鼓励滥用反编译技术。请尊重创作者的作品!本文仅提供一个在原项目丢失时重建项目的思路,仅供学习参考。


如果你要跟着这篇文章重建一个模组项目,请务必认真阅读本文,尤其是下文提及的需要注意的点。

(这些坑我可都替各位踩过了)


首先,就 Fabric 而论,玩家拿到的 Mod ,其代码中有关 Minecraft 的类引用均为 SRG 名称 (Searge 半混淆名),

因此,如果要重建模组项目,就必须把模组代码内所有 Minecraft 的类引用重命名为其各自对应的 Tiny 名称。


因此,重建一个 Fabric 模组项目,你将会用到如下工具链:

Yarn

Tiny Remapper

FernFlower

一个 Java IDE (这个可选,但是纠正反编译的错误结果时没有一个 IDE 真的会很痛苦)


过程则分如下几步:

1. 拿到 Mod JAR 文件

2. 使用 Yarn 构建 Mod 所需 Minecraft 版本的映射表 (去 Fabric 的 Maven 仓库下载也可以)

3. 使用 Tiny Remapper 将原始 Mod JAR 文件内的所有 class 文件进行处理,以重命名 Minecraft 类引用

4. 使用 FernFlower 反编译经过 Tiny Remapper 处理的 Mod JAR 文件。

5. 新建一个全新的 Fabric Mod 项目,Minecraft 版本必须与原 Mod 对应

6. 解包 FernFlower 生成的源代码 JAR 包,并将有 Java 代码的文件夹移动到前面创建的新 Mod 项目中

7. 人工纠正反编译结果,如补上被编译器抹去的泛型信息 (在类声明上是必须的,其他地方是可选的),删去一些不必要的 Synthetic 方法 (如枚举中可能存在的 $values() 方法,FernFlower 默认会生成它)

8. 完成,重编译后的结果应当也可以正常运行


工具的仓库链接在下方:

Yarn - https://github.com/FabricMC/yarn

Tiny Remapper - https://github.com/FabricMC/tiny-remapper

FernFlower - https://github.com/fesh0r/fernflower


如果这些工具没有直接可用的预编译成品,可以自行编译。(我就是自己编译的)


需要注意的点:

你将要使用的混淆表应当是 merged 表(我使用的是 merged-v2.tiny),

否则相当一部分的 Minecraft 类引用将仍然不能被反混淆。


Tiny Remapper 的用法是这样的:

java -jar tiny-remapper.jar yourmod.jar output.jar mapping.tiny intermediary named

其中,"yourmod.jar" 是指你的原始模组 JAR 。

"output.jar" 是输出的名称,这个随意。

"mapping.tiny" 是你预先准备好的 Merged Tiny 混淆表。


FernFlower 的用法是这样的:

java -jar fernflower.jar input.jar outputdir/

"input.jar" 是待反编译的 JAR

outputdir 是输出文件夹 (这个必须预先建好,否则 FernFlower 将报告找不到文件夹然后拒绝执行)


已知问题:

被 Mixin 注解的字段与方法不能正确反混淆,需要人工纠正。(也可能是我的 Tiny Remapper 用法有误?欢迎指正)


本文写于 2023.8.4,一次修订于 2023.8.6


本文采用 CC BY-SA 4.0 协议进行许可。

如何用一个已编译的 Fabric Mod JAR 重建模组项目的评论 (共 条)

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