解除Fabric的闭源Mod源代码的混淆方法
首先
当想要修改Mod时,往往会遇到源代码未公开的情况。无论是想复制Mod,修改Mod,还是制作补丁,我们都会不断受到混淆代码的阻碍。
虽然有方法可以解除Forge的混淆,但是关于解除Fabric混淆的方法没有相关信息,所以我会写一篇文章。
2022/11/15补充:也有更简单的方法可供选择。
坦白说,只需要一行Gradle代码就能实现。
按照以下步骤可以解除混淆:
-
- 使用IDEA的Minecraft Development,创建一个Fabric项目。
-
- Fabric版本应与想要解密的Mod的Fabric版本相匹配。
-
- 在项目的根目录下创建一个libs文件夹,并将想要解密的Mod放入其中。
在build.gradle文件中添加以下内容。
build.gradle
dependencies {
// ~(略)~
// Fabric API。这个其实是可选的,但你可能还是想要它。
modImplementation “net.fabricmc.fabric-api:fabric-api:${project.fabric_version}”
// ↓ 只需添加以下内容
modImplementation(fileTree(“libs/想要解密的Mod.jar”))
}
在IDEA中点击Reload All Gradle Projects即可加载,在External Libraries中将以解密的状态添加Mod。
如果能够使用这种方法,以下的文章就不需要阅读了。
前提的知識
准备Mod
我会提供用Fabric制作的Mod的反编译版本。
本次使用 OAuth-Fabric 作为示例。
(为了说明,我们会使用 GitHub 上分发的源代码,无需进行反向编译。)
这次将其放置在C:\example\oauth-fabric-1.0.jar中。
准备tiny-remapper
tiny-remapper是用于Fabric Loom(构建Fabric Mod环境的工具)的反混淆工具。
可以在Fabric的Maven库中下载。
请下载带有“-fat”的jar文件(包含了所有所需的库)。
本次下载的是tiny-remapper-0.6.0-fat.jar。
这次我把文件放在C盘的example目录下的tiny-remapper-0.6.0-fat.jar。
确认混淆映射的名称
确认正在使用的 Fabric Mod 开发环境的映射。
在 build.gradle 文件中有一个映射的位置。
我们现在知道它是在 1.17.1+build.61 版本。
dependencies {
// To change the versions see the gradle.properties file
minecraft "com.mojang:minecraft:${project.minecraft_version}"
mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2" // ← ここがマッピング名です。gradle.propertiesを参照しているようです。
// ~(略)~
}
minecraft_version=1.17.1
yarn_mappings=1.17.1+build.61
# ↑ ありました。これがマッピング名です。
5. 准备混淆映射
在Gradle的缓存目录中存在一个名为tiny的文件。
这次针对1.17.1+build.61的tiny文件位于以下位置:
C:\ Users \<名字> \ .gradle \ caches \ fabric-loom \ 1.17.1 \ net.fabricmc.yarn.1_17_1.1.17.1+build.61-v2
这次我们将它放在C:\ example \ mappings.tiny中。
获取适用于Fabric的Minecraft的jar文件。
尽管没有这个也可以改变一些地方,但是一些覆盖了的函数名等部分仍会保持原样。通过正确指定类路径,即可正确解密覆盖的函数名等内容。
在Gradle的缓存目录中存在minecraft-intermediary.jar文件。
这次的1.17.1+build.61版本所需的minecraft-intermediary.jar文件可以在以下位置找到:
C:\Users\<名字>\.gradle\caches\fabric-loom\1.17.1\net.fabricmc.yarn.1_17_1.1.17.1+build.61-v2。
这次我把它放在了C:\example\minecraft-intermediary.jar。
2022/11/15 更新:
在1.19.2+build.28版本中,使用以下文件成功实现了:
C:\Users\<名字>\.gradle\caches\fabric-loom\1.19.2\minecraft-merged-intermediary.jar
7. 取消混淆讀取
必要なファイルが整いました。
必要なファイルは以下の3つです。
C:\example>tree C:\example /f
C:\EXAMPLE
mappings.tiny ← 手順5で用意したマッピングファイル
minecraft-intermediary.jar ← 手順6で用意したマインクラフトのファイル
oauth-fabric-1.0.jar ← 手順2で用意したModファイル
tiny-remapper-0.6.0-fat.jar ← 手順3で用意したtiny-remapper
ファイルがあるディレクトリでコマンドプロンプトを開き以下のコマンドを打ちます。
C:\example>java -jar tiny-remapper-0.6.0-fat.jar oauth-fabric-1.0.jar oauth-fabric-1.0.dev.jar mappings.tiny intermediary named minecraft-intermediary.jar
Finished after 645.38 ms.
将已解密的jar文件 oauth-fabric-1.0.dev.jar 生成。
これをIntellij IDEAや、JD-GUIで開くことでソースコードを読むことができるようになります。
お疲れさまでした。
补充:关于tiny-remapper的命令。
先程のコマンドは
java -jar tiny-remapper-0.6.0-fat.jar oauth-fabric-1.0.jar oauth-fabric-1.0.dev.jar mappings.tiny intermediary named
java -jar tiny-remapper-0.6.0-fat.jar <入力ファイル名.jar> <出力ファイル名.jar> <マッピングファイル.tiny> <変換前マッピングタイプ> <変換後マッピングタイプ> [クラスパス]...
java -jar tiny-remapper-0.6.0-fat.jar でヘルプが見れます。追加オプションがいくつかあります。
转换映射类型有两种:intermediary(混淆状态)和named(解封状态)。