Minecraftサーバーを動かす知識

1.15から難読化マッピングが公開

投稿:  By: HimaJyun

Minecraft 1.15(正確には19w36a)から難読化マッピングが公開されるようになりました。

サーバーの管理者やプラグイン開発者に直接関係のあるものではありませんが、コミュニティに変化をもたらす可能性があるので解説しておきます。

スポンサーリンク

難読化とは?

ここでは、まず難読化について軽く説明します。

Java版MinecraftはJava版の名の通りJavaで作られています。

通常、JavaはJVMで実行されるため、Javaのソースコードをコンパイルして作られるのはJVMが解釈可能なバイトコードと呼ばれるものになります。(classファイルと呼ばれることもあります)

Javaバイトコードには元のソースコードの情報がほぼそのまま入っているため、C++などの言語に比べるとデコンパイル(プログラムから元のソースコードを復元すること)が非常に容易です。

オープンソースのデコンパイラーにはCFRなどがあります。試しに適当なプログラムをデコンパイルしてみれば分かりますが、ほぼ元通りのソースコードが得られます。

この特性はオープンソースのソフトウェアを製作する際には何ら問題ないのですが、商品としてのソフトウェアを作る際には問題になります。

有料で売っている物なのに内容を解析して無料=割れ版を作られると商売が成り立たなくなるからです。

そのため、商品としてのソフトウェアを作る際にはデコンパイルしても解析しづらいようにする難読化を行うことがあります。

Minecraftも同様で、難読化処理が施されているためデコンパイルして得られたソースコードを読み解くのは非常に困難です。

MOD

MinecraftにはMODの文化があります。

MODはmodificationの略で、文字通りプログラム本体の書き換えが必要になります。

プログラム本体への書き換えが必要、つまり、プログラムをデコンパイルして書き換える必要があります。

難読化はここで問題になります。

デコンパイルして得られるソースコードが難読化されているため、プログラムを書き換えるのに手間が掛かります。

要するにMODが開発しづらくなるのです。

MODフレームワーク

少し余談になりますが、実際にはすべての開発者がMinecraft本体への変更を行うことは不可能なため、ForgeやBukkitのようなMODフレームワークを利用してMODを開発することがほとんどです。

ForgeやBukkitのようなMODフレームワークの役割はMinecraft本体への変更を容易にする(インターフェイス=APIを公開する)こと、MODの適用を簡単にすることなどが挙げられます。

MODフレームワークのおかげでほとんどのMOD開発者は難読化されたソースコードを解読する必要はないのですが、依然としてMODフレームワークそのものの開発者は難読化されたソースコードを解析する必要があります。

(稀ですが、MODフレームワークが実装していない機能を利用するためにリフレクションが必要で、そのために難読化されたソースコードを読み解く必要に迫られることもあります)

今回公開されたもの

今回公開されたのはその難読化を解除し、元のソースコードを復元するための難読化マッピングです。

これを利用すると、難読化されたソースコードを元のソースコードに戻すことができます。

(そもそも難読化しなければ良いじゃん、と思わなくもないのですが、それだと恐らく著作権や法律周りの問題があるのでしょう)

元のソースコードが得られるようになるため、MODの開発者が難読化されたソースコードを解析する手間を省いてMODを開発しやすくなります。

予想される影響

難読化マッピングが公開されるとどのような影響が考えられるでしょうか?

MOD開発者への影響としてまず考えられるのは、リフレクション使用時のメソッド名の変更です。

ForgeやBukkitのようなMODフレームワークが難読化マッピングを使用するようになると、リフレクション経由で利用するメソッド名が変更される可能性は高いでしょう。

たとえば、以前まではgetMethod("a")でアクセスしていたメソッドが、aなどの分かりづらい名前ではなく本来の分かりやすい名前に変更される可能性があります(=メソッド名の変更に対応しないと動作しなくなる)

MOD利用者への影響としては、ForgeやBukkitの新バージョン対応が早くなる、バグが減る、新機能が追加されやすくなる……などの可能性が考えられます。

(もちろんすべて可能性の話なので、今までと何も変わらない可能性も当然ながらにあります)

その他の使い道

既存のMODフレームワークが開発しやすくなるのももちろんですが、より優れた機能を持つ新たなMODフレームワークが開発される可能性もあります。

他にも、Minecraftのソースコードを読み解いてプログラミングの勉強に役立てても良いでしょう。

MinecraftをJava以外の言語で書き直す……なんていうチャレンジングなことを行う人も出てくるかもしれません。

ソースコードから仕様が読み解けるようになるので、Wikiなどの情報が充実してTTの建設が楽になったり、外部ツールなどが制作しやすくなる可能性もあります。

難読化マップの見つけかた

難読化マッピングのダウンロード用URLは.minecraft/versions/(バージョン)/(バージョン).jsonの中に記載されています。

たとえば、1.15の場合は.minecraft/versions/1.15/1.15.jsonです。

jsonの中に、client_mappingsserver_mappingsなどのキーでマッピングファイルのURLが記載されています。

たとえば、19w36aのマッピングは次の通りです。

ほとんどの人には縁のない物ですが、興味のある人は見てみると良いでしょう。

参考