今回は、USBマスストレージクラスのパケットを解析する上で前提となる「USBプロトコル」の基礎を理解し、解析作業を進める。果たして、Androidをリムーバブルディスクではなく、“CD-ROMドライブ”として認識させるための改造ポイントはどこか?
通常、AndroidをホストPCにUSB接続すると、“リムーバブルディスク”として認識されますが、われわれの目的は、これを“CD-ROMドライブ”として認識させることす。
前回は、「UDK(USB Device driver development Kit)」を使用して、AndroidとPCとの間に流れるUSB通信パケットを解析することで、“CD-ROMドライブとして認識させるための手掛かり”を得ようと考えました。しかし、流れているUSB通信パケットを理解するためには、プロトコル仕様の理解が欠かせません。
そこで今回は、USBマスストレージ(UMS:USB Mass Storage)クラスのパケットを理解する上で必要となる「USBプロトコル(Ver. 2.0)」の基礎的な内容について概説した上で、解析を進めていきます。
なお、本稿では細かなプロトコル仕様の解説を割愛しています。詳細な仕様を知りたい方は、以下の参考資料をご覧ください。
参考資料 | 場所 | |
---|---|---|
USB 2.0仕様 | http://www.usb.org/developers/docs/ | Universal Serial Bus Revision 2.0 specification |
UMS(バルク転送)仕様 | http://www.usb.org/developers/devclass_docs/ | Mass Storage Bulk Only 1.0 |
UMSのSCSIコマンド | Mass Storage UFI Command Specification 1.0 | |
Mass Storage Bootability Specification 1.0 | ||
参考 USBプロトコル仕様に関する参考資料 |
USBの通信層は、図1のように3階層に分類されています。われわれが解析したいデータは、最上層にいるUMSクラスドライバが発行するものですが、一般的に、パケットキャプチャーが表示するデータは、その下の中間層(赤色の点線枠内)のUSBパケットになります。
そのため、USBパケットを解析するには、少なくとも以下に示す中間層のUSB通信仕様を理解する必要があります。
また、最上位層のUMSクラスでは、以下に示したSCSIコマンドを転送するための通信仕様を理解しておく必要があります。
USB通信の最小単位は“パケット”であり、USBホストとデバイスは、このパケットをUSBバスに投入し、データのやりとりを行います。USBパケットキャプチャーで観測する対象は、まさにこのパケットであり、その種類は全部で16種類あります(表1)。ここで、UMSが使用するパケットは9種類あり、このうち正常系のデータ入出力シーケンスを理解するためには、「OUT」「IN」「DATA0」「ACK」の4種類を把握しておけば十分です。
パケットがUSB通信の最小単位であることは分かりました。しかし、ホストとデバイスが個々のUSBパケットをバラバラっとUSBバスに投入しても、そのパケットを送られた側は何が何だか分かりません。適切に通信相手にデータ転送を行うためには、USBが定める手順(プロトコル)に従い、ホストとデバイスが協調してパケットの送受信を行う必要があります。それらのパケットの送受信の最小単位が“トランザクション”と呼ばれるものです。
USBトランザクションでは、必ずホストが主体となって通信を開始することになっています(注1)。USBホストとデバイスは、お互いにUSBバスを監視しており、USBホストがトークンパケットをUSBバスに投入したところからトランザクションが開始されます。
3.2.1.ホストからデバイスへのデータ転送
ホストがデバイスへデータ転送する場合は、必ず最初にOUTパケットをUSBバスに投入します。デバイス側ではOUTパケットの投入に気が付くと、次にホスト側からのDATAパケットの到着を待ちます。ホスト側では、送りたいデータをDATAパケットに包み込んでUSBバスに投入します。デバイス側ではそのDATAパケットを受け取り、データ受け取り確認として、ACKパケットをUSBバスに投入します。USBパケット解析で、デバイスへ転送されたデータの内容を確認するためには、このトランザクションを見つけて、DATAパケットの中身を見ればよいことになります。
3.2.2.デバイスからホストへのデータ転送
デバイスがホストへデータ転送する場合は、デバイスはホストからのINパケットを待ちます。デバイス側は、ホスト側がINパケットをUSBバスに投入したことに気が付くと、送りたいデータをDATAパケットに包み込んでUSBバスに投入します。ホスト側ではそのDATAパケットを受け取り、データ受け取り確認として、ACKパケットをUSBバスに投入します。USBパケット解析で、ホストへ転送されたデータの内容を確認するためには、このトランザクションを見つけて、DATAパケットの中身を見ればよいことになります。
Copyright © ITmedia, Inc. All Rights Reserved.