Fabricのソースコード非公開Modの難読化を解除する方法

# はじめに
Modを改造したい、そう思ったときにソースコードが公開されていないことはよくあります。
Modをパクリたいとき、改造したいとき、パッチを作りたいとき色々ありますが、
常に難読化の壁に阻まれることになります。

[Forgeの難読化を解除する方法](https://ci.tterrag.com/job/BON2/)はありますが、Fabricの難読化を解除する方法についての情報がなかったので記事を書きます。

# 0. 2022/11/15追記: もっと簡単な方法がありました

ぶっちゃけGradleで一行書くだけでできました。
以下の手順で難読化解除可能です。

1. IDEAの[Minecraft Development](https://plugins.jetbrains.com/plugin/8327-minecraft-development)を使ってFabricプロジェクトを作成する。
    プロジェクトのFabricバージョンは、難読化解除したいModのFabricバージョンと合わせるとよい。
1. プロジェクト直下に`libs`フォルダを作成して難読化解除したいModを入れる。
1. `build.gradle`に以下の記述を追加する。
    ```gradle:build.gradle
    dependencies {
        // ～(略)～
        // Fabric API. This is technically optional, but you probably want it anyway.
        modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}"
    
        // ↓ 以下を記述するだけ
        modImplementation(fileTree("libs/難読化解除したいMod.jar"))
    }
    ```
1. IDEA内の`Reload All Gradle Projects`を押して読み込めば、Modが難読化解除された状態で`External Libraries`に追加されます。

この方法ができたら以下の記事は読まなくて大丈夫です。

# 1. 前提知識

https://fabricmc.net/wiki/tutorial:migratemappings?s%5B%5D=gradlew&s%5B%5D=migrate

https://fabricmc.net/wiki/tutorial:setup

https://fabricmc.net/versions.html

https://qiita.com/noriokun4649/items/35763e6e35b80c976dfd

# 2. Modを準備する

デコンパイルするFabricで製作されたModを用意します。

今回は例として [OAuth-Fabric](https://www.curseforge.com/minecraft/mc-mods/oauth-fabric) を使用します。
(GitHubに[ソースコード](https://github.com/Sintinium/oauth-fabric)が配布されているためデコンパイルする必要ないですが説明のため使用します)

今回は`C:\example\oauth-fabric-1.0.jar`に配置しました。

# 3. tiny-remapperを準備する

[tiny-remapper](https://github.com/FabricMC/tiny-remapper)は[Fabric Loom](https://github.com/FabricMC/fabric-loom)(FabricのMod環境を構築するツール)に使われている**難読化解除ツール**です。

[Fabricのmavenリポジトリ](https://maven.fabricmc.net/net/fabricmc/tiny-remapper/)よりダウンロードできます。
`-fat`とついているjarファイルをダウンロードしてください。(必要なライブラリがすべて含まれています)
今回は[tiny-remapper-0.6.0-fat.jar](https://maven.fabricmc.net/net/fabricmc/tiny-remapper/0.6.0/)をダウンロードしました。

今回は`C:\example\tiny-remapper-0.6.0-fat.jar`に配置しました。

# 4. 難読化マッピング名を確認する

使用しているFabric Mod開発環境のマッピングを確認します。

build.gradleの中にマッピングが書かれている場所があります。
今回は`1.17.1+build.61`であることが分かりました。

```gradle:build.gradle
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を参照しているようです。
    // ～(略)～
}
```
```properties: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`に配置しました。

# 6. Fabric用のマインクラフトの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`(解除状態)があります。