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