Eee note EA800 と Eee Note Sync の対話をキャプチャしてみた (1)

前置き

Eee Note EA800 とは

台湾から ASUS 社の Eee note EA800 (以後 EA800 と呼ぶ)を輸入して三週間ほど経過した。EA800 はモノクロ液晶を使った電子ノート端末である。付属のスタイラスペンを使って、こんな具合にノートを取ることができるすぐれものだ。




Eee Note Sync とは

Eee Note Sync は、EA800 に付属する Windows PC との同期用アプリケーションである。Eee Note Sync を使うことで、電子書籍や電子ノートなどのデータを PC と EA800 との間で送受信できる。しかしその機能は十分とは言い難い。特に電子ノートに関しては、できるのはページデータ(gif)とメタデータ(xml)を CAB で圧縮したもの(.nte という拡張子のファイルになる)を PC へエクスポートして、同 .nte ファイルを EA800 へインポートすることだけ。PC上での閲覧や、ページの差し替え並べ替え、ノートの分割合併など、個人的に欲しかった機能はことごとく無い。せめて .nte ファイルが zip だったらもう少し取り回しが楽なんだけど。

EA800 と直接データのやりとりはできないだろうか

Eee Note Sync に頼ることなく、EA800 との間で自由にノートの送受信がしたい!あわよくば Eee Note Sync に代わるクライアントを自作できないものかと思い、Eee Note Sync と EA800 間の通信プロトコルを調査してみた。幸い、EA800 と PC の間の通信は Ethernet over USB (RNDIS) で行われるようなので Wireshark を使ってキャプチャが可能だ。

EA800 を PC へ接続した際の通信内容

EA800 を PC へ接続した際に、PC (Eee Note Sync) と EA800 の間でどのような通信が行われるかを調べてみた。

EA800 を PC へ接続する

付属の USB ケーブルを使って EA800 を PC へ接続すると、以下のようにして Ethernet ネットワークが構築される。

  • EA800 と Windows XP マシン (以下 PC と呼ぶ) を USB 接続
  • EA800 の画面上に選択肢が表示されるので 「Eee Note Sync同歩模式」(Eee Note Sync との同期)を選択する
  • 初回接続時であれば、ここでドライバや Eee Note Sync が PC へインストールされる (※ドライバや Eee Note Sync のインストールは「安装Eee Note Sync以及…」を選んだときのみ実行されるのでこれは嘘でした)
  • PC が EA800 を RNDIS device として認識する
  • PC と EA800 が(仮想的な) Ethernet ネットワークで接続される
  • EA800 は IP アドレス 169.254.2.1 を名乗る。EA800 内では DHCP サーバが起動している
  • PC が EA800 内の DHCP サーバへ IP アドレスの払出しを要求。EA800 に IP アドレス 169.254.2.3 が与えられる
Eee Note Sync が EA800 を検知する

EA800 が PC に接続されたことを Eee Note Sync が検知する (おそらく Ping を使って)

コネクションの確立開始

Eee Note Sync は EA800 の接続を検知すると、「制御用コネクション」と「データ用コネクション」2つのコネクションの確立を試みる。後述するように、Eee Note Sync と EA800 との通信は「制御用」と「データ用」の2つのコネクションを使って行われる。FTP のようである。

制御用コネクションの確立

まず、制御用コネクション確立までの通信を以下に示す。なお、以降、[->] で PC (Eee Note Sync) から EA800 へのメッセージ送信を示し、[<-] で、EA800 から PC へのメッセージ送信を表すこととする。

  • [->] Eee Note Sync が適当な空きポート(ここでは TCP 1331 とする)から、EA800 の TCP 20000 ポートへ接続を試みる (普通の TCP 3-way Handshake)
  • [<-] EA800 の TCP 20000 ポートから、Eee Note Sync の TCP 1331 ポートへレスポンスが返る
commandconnectreturnvalue
welcome to connect the server. server version 1.0(2010-07-16 10:00:00) version 3.0(2010-7-28 18:00)\n::\n

改行文字には 0x0a (LF) が使われている。また、メッセージの終端を示すための記号には "\n::\n" が使われているようだ。ここで "\n" は文字通り 0x5c ("\") と 0x6e ("n") であって、改行文字 (0x0a) を表すものではないので注意。また、メッセージの末尾には 0x0a (LF) は付かない。

データ用コネクションの確立

続いてデータ用のコネクションが確立される。

  • [->] Eee Note Sync が適当な空きポート(ここでは TCP 1332 とする)から、EA800 の TCP 20001 ポートへ接続を試みる (普通の TCP 3-way Handshake)
  • [<-] EA800 の TCP 20001 ポートから、Eee Note Sync の TCP 1332 ポートへレスポンスが返る

dataconnectreturnvalue
welcome to connect the server data socket. server version 1.0(2010-07-16 10:00:00) version 3.0(2010-7-28 18:00)\n::\n
ログイン

2つのコネクション確立が終わると、制御用のコネクションを使って、Eee Note Sync から EA800 へログイン要求が送信される。

  • [->] Eee Note Sync が制御用コネクション上で EA800 へログイン要求メッセージを送信
login
1
\n::\n

"1" の意味は不明。

  • [<-] EA800 が Eee Note Sync へ応答メッセージを送信
loginreturnvalue
0
username=ASUS EeeNote
passwd=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
version=1.0.1.36
\n::\n

なんとこちらからパスワードを入力する前に、EA800 からパスワードが送られてきた。さすがに平文では無いようだが。

Eee Note Sync 上にパスワードダイアログが表示される

このタイミングで、Eee Note Sync 上にパスワードの入力を促すダイアログが表示される。正しいパスワードを入力すると、特に通信は発生せず次のステップへ進む。このことから察するに、パスワードの検証は EA800 内で行われるのではなく、EA800 からパスワードに関する情報を受けとった Eee Note Sync が代理で検証を行っているようだ。

ちなみに、EA800 のセキュリティ設定でパスワードによる保護を有効にしていない場合は、EA800 から送信される passwd は空となり、Eee Note Sync 上でのパスワードダイアログも表示されない。

システム情報の取得

ログインが成功すると、Eee Note Sync から EA800 に対してシステム情報の取得要求が送信される。

  • [->] Eee Note Sync が制御用コネクション上でシステム情報要求メッセージを送信
systeminfo
-1
\n::\n


ここも "-1" の意味は不明。

  • [<-] EA800 からシステム情報が送信される。
systeminforeturnvalue
Internal SD
181 3049 6%
External SD
N/A 
Device Name
ASUS EeeNote
Device UUID
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
fwboot
 V1.0.1
kernelrom
 V1.0.1.71 TW
0000
\n::\n


key, value, ..., key, value が改行で区切られているだけのようだ。ここで得られた情報が Eee Note Sync の "System Info" タブで表示されるのだろう。

ファイルリストの取得

続いて、EA800 内の DB ファイルリスト(ファイル一覧)が取得される。DB ファイルというのは、ノートとページの関係や作成日時などのメタデータを管理するファイルであり、実体は sqlite の .db ファイルである。このことから EA800 内のデータは sqlite で管理されていると考えられる。

  • [->] Eee Note Sync が制御用コネクション上で DB ファイルリストの取得要求を送信する。
listfile
12
\n::\n

"12" の意味は不明。 "12" はリストの取得対象となるフォルダを示すIDである。後述するように、EA800 内のフォルダには ID が振られていて、"12" は DB ファイルリストを格納するフォルダの ID となっている。イメージ的には shell 上で "ls 12" をしてファイルリストを取得しているのに近いかな。

  • [<-] EA800 から制御用コネクションを使って応答メッセージが返る。このメッセージに DB ファイルリスト自体は含まれない。
listfilereturnvalue
1
257\n::\n


"1" も "257" も何を指すものかは分からない。 "1" はおそらくステータスコード(成功を示す)"。"257" はファイルリストのサイズ。

  • [<-] ファイルリスト自体は *データ用* コネクションを使って EA800 から Eee Note Sync へ送信される。
4096
12
stickymemodata.db

798084\n10240
12
voicedata.db

798084\n285
12
DBVerionInfo.inf

798084\n368640
12
ebookdata.db

798084\n16384
12
phonebookdata.db

798084\n6144
12
tagdata.db

798084\n1046528
12
notedata.db

798084\n62464
12
photodata.db

798084\n

メッセージの中身(ファイルリスト)は、ファイルサイズ、謎の数字(12)、ファイル名、謎の数字(798084)、改行(0x0a)、区切り文字("\n")、の 6 つの値を 1 セットとして、ファイルの数だけ(ここでは 8 つ)のセットが結合されて送られる。

ここで取得されるリストには、以下の 8 つのファイルが掲載された。

  • stickymemodata.db
  • voicedata.db
  • DBVerionInfo.inf
  • ebookdata.db
  • phonebookdata.db
  • tagdata.db
  • notedata.db
  • photodata.db
DBファイルのダウンロード

Eee Note Sync はリストに載っている 8 つの DB ファイルそれぞれについて、ダウンロードを実行する。

  • [->] まず、Eee Note Sync は制御用コネクションを使って、stickymemodata.db のダウンロードを要求する。
downloadfile
12
Path=stickymemodata.db
\n::\n

"12" の意味は不明。 "12" は前述した通り DB フォルダの ID。

  • [<-] EA800 は制御用コネクションを使って応答する。
downloadfilereturnvalue
1
4096
md5=66c9a2dbf2041239700795efe2448c87
\n::\n

ファイル stickymemodata.db のサイズ(4096)とハッシュ値(66c9a...)が含まれている。"1" の意味は不明。 "1" はおそらく成功を示すステータスコード

  • [<-] EA800 はデータ用コネクションを使って、stickymemodata.db の内容を送信する。
    SQLite format 3... [stickymemodata.db ファイルの実体]
  • Eee Note Sync は受信したデータの MD5 ハッシュを計算し、制御用コネクションから受信済みの MD5 値と比較して、ファイルの正当性を確認する(多分)

  • 以下、同様の処理が、残りの 7 つのファイルそれぞれについて繰り返される。
  • voicedata.db のダウンロード
downloadfile
12
Path=voicedata.db
\n::\n

downloadfilereturnvalue
1
10240
md5=7ab5ea8cd345f06f7b44ccf177e970d9
\n::\n

  • DBVerionInfo.inf のダウンロード
downloadfile
12
Path=DBVerionInfo.inf
\n::\n
downloadfilereturnvalue
1
285
md5=b12b4341a96dd901bf5867568a09f5f1
\n::\n
  • ebookdata.db のダウンロード
downloadfile
12
Path=ebookdata.db
\n::\n
downloadfilereturnvalue
1
368640
md5=3199fa4a8e270a352805c3123a7a5aea
\n::\n
  • phonebookdata.db のダウンロード
downloadfile
12
Path=phonebookdata.db
\n::\n
downloadfilereturnvalue
1
16384
md5=488502c85dafbff66cea58dceebb2e76
\n::\n
  • tagdata.db のダウンロード
downloadfile
12
Path=tagdata.db
\n::\n
downloadfilereturnvalue
1
6144
md5=43a5f7851af89ffd1d637c02af4dbc5e
\n::\n
  • notedata.db のダウンロード
downloadfile
12
Path=notedata.db
\n::\n
downloadfilereturnvalue
1
1046528
md5=39202016cf5ee1b30f5ba0f04cf03edd
\n::\n
  • photodata.db のダウンロード
downloadfile
12
Path=photodata.db
\n::\n
downloadfilereturnvalue
1
62464
md5=07156c4dfef0bb9e9d51c1b56b20d4fa
\n::\n
ファイルダウンロード完了

8 つのファイル全てのダウンロードが終わると、Eee Note Sync から EA800 へダウンロード完了を示すメッセージが送信される。

  • [->] Eee Note Sync は制御用コネクションを使って、EA800 へダウンロード完了を示すメッセージを送信する。
downloaddbcompleted
0
13

0001-01-01 00:00:00
-1\n\n::\n

"0", "13", "-1" の意味は不明。日付も謎。

ここまでで、PC 内の C:\Documents and Settings\[ユーザ名]\My Documents\EeeNote\[UUID下12桁]\tempdatabase フォルダに、上記の 8 つのファイルがダウンロードされている。Eee Note Sync も内部で sqlite を使ってこれらのファイルに含まれるメタデータを参照するのだと思う。

とりあえずここまで

引き続き、電子ノートデータのダウンロードとアップロード部分を調べてみたい。