jar-analysis

約5分で読めます

Jar ファイル(マインクラフト MOD)の解析をしてみた

背景

友人からマインクラフト Mod の紹介を受けた.どうやら Mod からマルチプレイ可能のホストを作成でき,NAT 越えも可能らしい.

うちのルータだと Port 解放できないしどうせ無理だろうなぁ..

できるらしい.その中身を記す.

e4mc

e4mc.link

解析

概要

CFR を利用してデコンパイルする. brew を用いる場合,cfr-decompiler を使う.

CFR のインストール

brew install cfr-decompiler

デコンパイル

# デコンパイルしたソースコードを保存するディレクトリを作成
mkdir -p decompiled_source

# デコンパイル
cfr-decompiler e4mc_minecraft-fabric-5.3.1.jar --outputdir decompiled_source

デコンパイルしたソースコードの確認

HTTP リクエストを送信する QuiclimeSession.java

HttpRequest request = HttpRequest.newBuilder(new URI(Config.INSTANCE.brokerUrl.value()))
    .header("Accept", "application/json")
    .build();

対象を決定する

BrokerResponse resp = new BrokerResponse();
resp.id = "custom";
resp.host = Config.INSTANCE.relayHost.value();
resp.port = Config.INSTANCE.relayPort.value();

config.java

public class Config
extends ReflectiveConfig {
    public static final Config INSTANCE = (Config)Config.createToml((Path)Agnos.configDir(), (String)"e4mc", (String)"e4mc", Config.class);
    @Comment(value={"Whether to use the broker to get the best relay based on location or use a hard-coded relay."})
    public final TrackedValue<Boolean> useBroker = this.value(true);
    public final TrackedValue<String> brokerUrl = this.value("https://broker.e4mc.link/getBestRelay");
    public final TrackedValue<String> relayHost = this.value("test.e4mc.link");
    public final TrackedValue<Integer> relayPort = this.value(25575);
}

https://broker.e4mc.link/getBestRelayにアクセスすると,その地域で一番良いサーバ名が帰ってくる.

調査結果

誰かがリレーサーバを運用してくれているッ…!!

ようするに誰かが AWS の VPC みたいなものを無料で使わせてくれている.
似ている技術としては,Ngrok があげられる

仕組みの構成図

sequenceDiagram
    participant H as ホスト(サーバー)
    participant R as リレーサーバー
    participant B as ブローカー
    participant C as クライアント

    Note over H,R: 1. ホスト側の接続開始
    H->>B: 1.1 最適なリレーサーバーを要求
    B-->>H: 1.2 リレーサーバー情報を返却
    H->>R: 1.3 QUIC接続を確立
    R-->>H: 1.4 一意のドメインを割り当て

    Note over C,R: 2. クライアント側の接続
    C->>R: 2.1 割り当てられたドメインで接続
    R->>H: 2.2 接続を中継
    H-->>R: 2.3 レスポンス
    R-->>C: 2.4 レスポンスを中継

    Note over H,C: 3. 以降の通信
    H->>R: 3.1 ゲームデータ
    R->>C: 3.2 ゲームデータを中継
    C->>R: 3.3 プレイヤー入力
    R->>H: 3.4 プレイヤー入力を中継

余談

マンション済が NFS サーバ使うのにリレーサーバとか使われるよなぁ

最後に

ほんとにありがとうございます.使いたくなったら使います.どうか有料にしないでください.