普段の仕事ではプログラムとか書いてないけど、2か月ほどテストの手伝いをしたことがあったのを思い出して、久々にVSを動かしてみた。
ついでに、普段遊んでる某ブラウザゲームのデータを拾って表示するツールみたいなのが作れないかと思って試してみた。
・何はともあれ、どういうデータが流れてるのかを見る
ということで、久々にWiresharkを立ち上げて、ずらずらとパケットキャプチャをしてみる。
色々と機能を実装してみたいという妄想は膨らむけど、最初から全部やろうとするとつまづくのは目に見えてるし、モチベ維持の意味も込めて、何かゲーム上のパラメータ一つだけをピックアップしてみようと思った。
で、ゲーム内のボスキャラクターのHPが数字で表示されないことと、データ上ではきちんと数字で管理されてるのを見て、HPの具体的な数値を表示するのはどうだろうかと思いつく。
とりあえず、Wiresharkがデータ拾えてるってことは、何とかすればC#でもそういうアプリが作れるはずだな、ということで調べてみる。
・通信系プログラムとかを色々と参考にして調べてみた
結論から言うと、プログラムの書き方よりも、そういうライブラリを追加して機能を増やすって概念がすっぽ抜けていた。
というわけで、WinPcapとSharpPcapを導入することにした。
WinPcapはインストールすればおkなのだが、SharpPcapはzipを展開するだけだったのでちょっと不安だったが、まぁこの後また別の問題が発生するのは確定的に明らか。
サンプル読みながら自分でコメントを書き直せばすぐに理解できた。
・とりあえずデバイスを表示する
仮想とか含めてNICとか複数あることも珍しくないので、とりあえずデバイスを決めるプログラムを書くためにフォームのボタンを押したらリストボックスに表示するみたいなのを書いた。
もちろんこの後に問題が(ry
・とりあえずパケットを表示する
サンプルのおかげでパケットを表示できた。
が、プロミスキャスモードで拾うのでもちろん死ぬほどデータが流れてくるのでフィルターでなんとか。
ip and tcpとかで何とかなる。
・データの型が意味不明
パケットデータの型がいまいち理解できなくて、仕方がないのでデータの配列をforループで一つの変数にコンマ付きでstringとしてぶち込んでいくことにしてみた。
//object型とかいうのがあるみたいですね、と後で知ることになりました。
意外とすんなり上手くいったのだが、今度はそのデータが何なのかということに疑問を持つ。
文字データの31なのか、数字データの31なのか、みたいな。
まぁでも別に動けばいいや、という後のことを考えないソースを書き上げる思考が止まらなくなる。
その場しのぎで解決したのが、「該当箇所のデータだけをフィルターとして設定してやれば、ほかに引っかかったとしてもそこまで大した問題じゃない」ということだった。
例えば、「HPは1000です」みたいに書いてある場所があるとして、「HPは」だけでフィルターをしてやれば拾ってこれるのでは?と考えた。
もちろんこれは上手くいったのだが、さらに問題が発生した。
・HP、ようは数字データは何の文字コード?
文字データとエンコード方式を組み合わせたものが文字コードだけど、じゃあこれ何のエンコードなの?という所にたどり着くのはごく普通だと思うが、それで2時間ぐらい悩んだ後に
「ここ以外で使わないからいいじゃねえか、10個しかないんだし手動エンコードしようか」
となった。0~9の数字はコードが隣り合ってるのが普通なので、そこから逆算すれば0~9のデータがわかるので、手動エンコードした。
・ようやく完成!
ひとまず完成した。問題は山積みだけども、完成までこぎ着けたのはえらいと思う。
そういう精神はモノづくりの世界では必須だ。
かかった時間は、8/22~2/25の20時~深夜1時ぐらいまででした。
ものすごい集中してたから、慣れない分野でもなんとかなった……。
・浮き彫りになった問題点
以下に、プログラマーではないが故に理解してなかった問題を書き出してみる。
・オブジェクト型とか、まだまだ知らない型がたくさんあった。メールアドレスとか、IPとか……。
・フォームアプリで作りたかったのだが、途中でパケットのログをどうやって待ち受けて出力すればいいのかわからなくなった。
・NIC選択をフォーム、ログ出力をコンソールにするというアプリとしては最悪の出来だと思うが、自分が気にしてなさすぎるのでそれでいいやと思った。
・フィルターに設定した「HPは」という部分がデータの一致をすべて拾うので、HPが回復したりしても変なデータを拾ってくる。
・ある程度サンプルが揃ったのでフィルターの例外処理をやってみたら別の問題が(ry
・スレッド処理とか全然知らなかった
・JSONとか全然知らなかった
こんなもんかな。
っていうか、プログラム的な部分は何も書いてないですねこれ……。
ちなみに、前段として一番最初に「通信系PGだしpingでも飛ばすアプリ作るか!」と思って作り始めたので、そもそもWinPcapすら入れてなくてもっとめんどくさいことしてました。
・最後に
JSONを知らなかったんですが、これめっちゃ便利そうですね。
他の分野でも活用されてるみたいなんですが、C#でJSONってあんましメジャーではないのかな?
もうちょっと勉強した方が良さそうですね。
・C#とJSONで参考になりそうなやつ
C#でJSONを読み込むメモ・
http://www2.hatenadiary.jp/entry/2013/12/14/030112
C#でJSONを扱うライブラリ「Json.NET」を使ってみました
http://qiita.com/ta-yamaoka/items/a7ff1d9651310ade4e76
ぐぬぬ……仕事でまだまだインフラ系と基本情報の勉強しなきゃならんのに覚えることがたくさん/(^o^)\