3Dプリンターを買ったのでプログラムで制御したいの細かい話
公開日:
前回の記事でC#のライブラリを作ったよという話を書いたのですが、どうやってライブラリにしたのかみたいな話をつらつらと書こうかなと。
めちゃくちゃ技術的な話になるのでそういうのを求めてない方は時間の無駄かもしれません。
※そもそも大前提として場合によっては怒られる内容だと思うのでもし怒られたらライブラリを公開停止にしたりこの記事を消したりするかもしれません
普通こういうライブラリを作るには公式から仕様書を貰うかリバースエンジニアリングするかの2択なのですが、公式が仕様書を出していたらそもそも似たようなライブラリはもう誰かしらが作ってるので当然ありません。
なのでリバースエンジニアリングするしかないというわけですが、幸いHalot Mage ProにはイーサネットポートがあるわけなのでHALOT BOX(独自スライサーソフト)を弄りながらWiresharkでパケットを覗けば大抵のことは分かります。実際大抵のことは分かりました。
192.168.100.12が私のPC、192.168.100.25が3Dプリンター
通信の暗号化もないので全体を把握するのはめちゃくちゃイージーですね。
WebSocketでjsonを投げるとそのレスポンスが返ってくるという感じなのでここまでは割と誰でも辿り着けるのかなと。
問題はリクエストに
cmd
と一緒に付いている
token
。
これはHALOT BOXに入力したプリンターのパスワードによって値が変わるのですがこれをどうやって作成するのかを特定するのが本当に大変でした。
いろいろ弄ってて分かったことはこんな感じ。
- パスワードを長くするとtokenも長くなる → 何らかのハッシュ関数をBASE64エンコードしたものではない (ハッシュ関数ならパスワードを変えても同じ長さになるはず)
- パスワードに9文字以上指定するとプリンターと同じパスワードを指定してもエラーになる → スライサーソフトか3Dプリンターがバグってそう😭
- パスワードをシンプルにBASE64したものではない → これだったらめっちゃ簡単だったが😇
これ以上踏み込むと沼ることは分かっていましたがここまで来ちゃったので徹底的にやってみることに。
もしこのソフトが.NET製のデスクトップアプリだったらdnSpyとかでデコンパイルすればかなり簡単に実装を見ることが出来ますが、これはスライサーソフトで3Dをゴリゴリ弄りますから.NET製の確率はめちゃくちゃ低いです。
実際HALOT BOXはQt製なのでC++です。
ネイティブバイナリのリバースエンジニアリングなんて骨が折れるのが目に見えてますがとりあえずやってみる。
ネイティブバイナリのリバースエンジニアリングといえばIDA。
ホワイトハッカーとかがマルウェア解析とかで使ってるイメージ。
これ、無料版でも結構いろいろ出来るのですごい。昔はもっと機能が制限されてた気がします。
IDAでトークンが関係しそうな処理を頑張って探して見てみます。
C++のクラスの定義などもそれっぽく再現されててすごいですよね。
ここから
token
の作り方をハックするわけですが、x86のアセンブリ言語を愚直に読んでいくのは流石にしんどい。
IDAにはアセンブリからCっぽい疑似言語を生成してくれる機能があるのでそれに頼ります。(Free版でも使えたけど昔は無かったような?)
アセンブリ言語よりは非常にマシですがシフト演算多すぎてハゲそう。
ただ、こんなにシフト演算を多用するということは何かしらの暗号化がされているというのは分かります。
試しにこのコードをGitHub Copilotに解説してもらったら何らかのブロック暗号アルゴリズムの可能性があると言ってきたのでその筋を当たってみることに。GitHub Copilotすごい。
ブロック暗号アルゴリズムといえばAES。ただ、トークンの長さ的にもっと弱いやつかもということでDESも当たってみる。
この辺りで暗号鍵っぽい文字列を見つけた。
試しにパスワードを「1」に設定して出てきたトークンを↑で見つけた暗号鍵っぽい何かを使ってDESで暗号化した後BASE64でエンコードしてみたらなんと一致してしまった。
ここまで分かれば後は時間の問題なのでC#のコードにしておしまい。ここまでたどり着くのに15時間くらいかかったと思います。
皆さんもリバースエンジニアリングでうまくいくとめちゃくちゃ脳汁が出るのでいかがでしょうか。
いい勉強になりました。
タグ: Halot Mage Pro