LoginSignup
11
0

More than 1 year has passed since last update.

Minecraft:Bedrock Editionのパケットを解析するためのクライアントソフトウェアを開発した話

Last updated at Posted at 2021-12-16

はじめましてHmy2001です。

約3年前にMinecraft:Bedrock Editionのパケットを解析するためのクライアントソフトウェアを
開発したのですが、そこでいろいろあったことを紹介したいと思います。

クライアントソフトウェアはJavaで開発し、GitHubにて公開されています。

Minecraft:Bedrock Editionのパケット

Minecraft:Pocket Edition v0.15.0 alpha (リリース日時:2016年6月 とても昔!)から
パケットの暗号化機能が追加されました。
楕円曲線暗号とAESアルゴリズムを用いています。

楕円曲線ディフィー・ヘルマン鍵共有(ECDH)でお互いの公開鍵を共有し、
得られた共有鍵を用いてAESアルゴリズムでパケットを暗号化し通信するといった感じです。

Javaの採用

楕円曲線暗号とAESアルゴリズムが言語ライブラリでサポートされていて、高速で動作するJavaを採用しました。
あと、いちばんキレイに書けそうだったので採用しました。

JRakNetの採用

開発初期の方は言語ライブラリであるDatagramSocketやDatagramPacketを用いて開発していましたが、
RakNetプロトコルのEncapsulatedPacketの管理が難しく、
完成まで時間がかかると感じたためJava用RakNetライブラリを探しました。
GithubでリサーチしたらJRakNetというものがあったため採用しました。

しかし、JRakNetはサーバーに接続することができてもBedrock Editionのパケットをやり取り出来ないという
致命的な不具合を抱えていました。
この問題を修正し、接続できるようにしました。
(もちろんPull-Requestを出し、無事マージされています)

Gsonの採用

BedrockEditionのクライアントデータはJsonを用いて送信するため、Goggle製のJsonライブラリのGsonを採用しました。
Jacksonもあったんですが、イマイチ扱い方がわからなかったので不採用となりました。

開発中にあったこと

ECDSA証明のJavaライブラリ出力形式とサーバー側(実機)の受入形式のアンマッチによる通信不可能の発生

  • Javaライブラリ出力形式はDER(ASN.1)形式(100-101 Bytes)
  • サーバー側(実機)の受入形式はプレーン形式(96 bytes) 上記の形式アンマッチにより、通信が不可能だということがわかったので、DER(ASN.1)形式からプレーン形式となる96 bytes分を 抜き出すことにしました。 これによりうまく通信が行えるようになりました。

(他にも色々あった気がするけど忘れちゃった)

最後に

Githubにて公開してますのでぜひ使ってみてください。
オフラインモードのサーバーに接続する際のみ使えます。(パケット解析目的で使用してください)
なお、最新バージョンには対応していないので、コントリビュートは大歓迎です!

11
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
0