刺身の上にたんぽぽ乗せる日記

プログラミングしたり、自販機の下に落ちてる小銭を集めたりしてます

blackdog詳解

自分なりに整理してみた。

外観

まず外観から。

タバコより一回りくらい小さい。iPod miniを縦に小さくした感じ。
真ん中にあるのが指紋認証指紋認証しなくてもログインできるので意味無い。
トゲトゲなのは付属品の首輪モジュール。意味は全く無い。
インターフェースはUSB。小さいポートがあるので、ケーブルでPCにつなぐと利用できる。

利用方法

  1. USBでPCに挿す
  2. PCでblackdogがCD-ROMとして認識される
  3. PCでCD-ROM(に見えるもの)の中にあるXServerや中のネットワークのプロキシ(後述)が起動。
  4. PCからCD-ROMが抜けたように見える。
  5. (多分この間にblackdog側のカーネルがブートしてる)
  6. PCでblackdogがlinksysのethernet adapterとして認識される
  7. Xで指紋認証アプリが起動
  8. 指紋認証(又は指紋認証スキップ)でランチャが立ち上がる

後はランチャからターミナルを開くなり、好き勝手できる。
ちなみに、厳密にはBlackdogはUSBハブ+USB-CD-ROM+USB-Ethernet Adapterに見える。

ネットワーク構成

XのやりとりはPCから認識されているEthernet Adapter経由でやればいいんだけど、blackdog内で動くアプリの通信がどうやってPCのネットワークを利用するかが、実際見るまでよくわかんなかった。

多分下図のような構成になってる(左側がPC、右側がblackdog)。

kernelとuserの構成は多分これで正しい。
physicalレイヤだけはあんまり調べてないからよくわかんない。PCからはUsb-ethernetとして見えるけど、linux側は別にmacがあんのか単純にlinksysっぽい動きをしてんのか、とか色々やり方ありそうだけどわかんない。とりあえずIP/USBとだけ書いたけど。

実際の流れとしては、以下のような感じ。

例:http://google.comにアクセス

  1. 一般アプリがgoogle.comにconnect()
  2. ルーティングテーブルではtap0がdefaultルートなため、パケットがtap0から送出される。
  3. tap0に書き込まれたパケットは/dev/net/tunからイーサフレーム以上の部分が読み込み可能。vtunがtap0から読み込む
  4. vtunはtap0から読み込んだパケットをudpカプセル化して、PC側で動作するRealm-networking.exeに送る
  5. Realm-networking.exeはカプセル化されているパケットを読み出し、適切な動作を行う

pingをblackdogからgoogleなどに送ると、ICMPではなく、代わりにgoogleのecho(UDP)ポート宛てのパケットが送出される。この動作からして、Realm-networking.exeはraw socketなどを使って単純にパケットを右から左へ流すだけではなく、ペイロードの内容をパースして、synだったらconnect()呼び出したり、rst/finだったらclose()呼んだりと、大分面倒臭いuser-mode IP Masquerade的な動作をしていることが想像できる。まじ地獄。
じゃあなんでraw socket使わないの?っつーと、多分権限の問題だと思うけど。っつーか、CD-ROMとかネットワークアダプタって非adminで使えるのか?今度漫画喫茶で試してみよう。