2007年6月29日

USB Sniffer試用心得

又好陣子沒發文了,最近的新聞是,我決定延畢,按部就班的來做論文。

這次要介紹的是USB Sniffer。

前言:
說到USB,USB在最近十分的熱門,尤其是嵌入式的領域,有不少USB的專書,分析背後的原因其實很簡單。
USB因為非常普及也非常方便,所以現在十分的熱門,可是USB的架構並不簡單,這樣想吧~USB只有4根接頭,扣掉2根電源(+和-),傳輸資料就只有2根,可是USB卻支援了包括隨身磁碟、鍵盤/滑鼠、webcam/攝影機、印表機、麥克風、喇叭...等,每種的傳輸協定都不同,USB卻只靠2根接頭全部搞定,它的設計並不容易。
稍微看它的架構更誇張,USB本身是硬體的匯流排介面,根據我們所學,匯流排介面不是串聯就是並聯,它只有2根,硬體連接必定是串列介面,然而它的flow和model卻是以網路的架構去設計的,因此還有HUB這樣的介面,要搞懂它老實說,是需要網路架構的概念的,這在1995年設計時,要理解真的不容易,畢竟會搞匯流排的,多半是硬體的工程師,要他們理解網路架構,是有難度的。
至此USB介紹到一段落,這次因為想要在Linux上使用HP PSC 1315的事務機,雖然掃描/列印都已經有driver,都可以動作了,但是上面的「SCAN按鍵」卻不支援,因此打算自己來搞搞看。
看了討論後,發現要搞這個,要知道「SCAN按鍵」的溝通訊息,而這個訊息目前只有HP的應用程式知道,因此我們需要想辦法知道這些溝通的「密語」,因此開始找USB Sniffer的軟體並練習使用它,也就是這篇了。

USB Sniffer:
在Windows上使用USB Sniffer,看起來大家都推SnoopyPro,這是一套OpenSource軟體,使用方式很容易,如下即可:

1.
下載SnifferPro軟體,目前為0.22版
它只有一個檔案,找個喜歡的地方放置即可
接著執行它

2.
執行後可以按「F2」或從選單「View->USB Device」執行(第一次執行時,會自動開啟USB Device視窗)

3.
在USB Device視窗中,會看到一大堆裝置,我們先不管它,因為還有更重要的事情要做
執行選單「File->Unpack Drivers」,正常會出現「Driver were successfully unpacked...
這步驟非常重要,它會把USB Sniffer的Driver解壓縮到目錄,目錄我猜想是WINDOWS目錄下的system32吧,目前不清楚

4.
接著要準備「竊聽」USB裝置了,首先要知道要竊聽的USB裝置是誰
以我的隨身碟為例:
我把隨身碟插入之後,到「裝置」去看看(我的電腦按右鍵選內容->硬體->裝置管理員)(這是WinXP的位置)
在「通用序列匯流排控制器」中,會看到「USB Mass Storage Device」,在「USB Mass Storage Device按右鍵選內容->詳細資料

在詳細資料中,我們可以看的是「裝置例項識別碼」或「硬體識別碼
以我的隨身碟來說,它們是:
裝置例項識別碼:
USB\VID_0CF2&PID_6220\606569746801

硬體識別碼:
USB\Vid_0cf2&Pid_6220&Rev_0100
USB\Vid_0cf2&Pid_6220


回到剛剛SnoopyPro的USB Device,找找看「USB\Vid_0cf2&Pid_6220」,BINGO~就是它了~

5.
這時候在它上面按右鍵,點「Install Service」(目前不清楚作用如何,但建議第一次要操作它)
接著再在它上面按右鍵,點「Install and Restart」,它會做兩個動作:
1.安裝Sniffer在這個裝置上(還沒開始竊聽它)
2.執行移除/插入的動作(插入後開始竊聽)

6.
此時順利的話,按下右上角的「X」把「USB Device」關閉
SnoopyPro的主視窗應該會有個「USBLog1」的視窗開起來,然後packet的數值慢慢跳,這就是擷取到的封包數量
此時可以按下停止,它就會顯示出所有封包的順序、方向、時間、function的名稱、資料內容。

參考資料:
SourceForge.net: SnoopyPro - Some info to get started
SnoopyPro-HOWTO

3 則留言:

匿名 提到...

Very helpful notes. Thank you for share!

匿名 提到...

請問這樣的工具有for Linux的嗎?
謝謝您!^^

Cody 提到...

您好。
現在有比較好的方式可以Sniffer USB。
在Linux上,kernel直接有提供usbmon(USB Sniffer)的功能,可以直接做到Sniffer USB。
簡單的作法是:
1. 先確定Linux上有支援usbmon
2. 在Linux上安裝wireshark
3. 用root執行,介面可以直接選到USB Interface number
4. 開始Sniffer

事實上,因為wireshark在閱讀擷取後的資料比較方便,我前陣子在網路上有找到有人提到。
在Linux上安裝VirtualBox,在VM裡面安裝Windows,在VM裡面的Windows動作操作USB,在Linux端用wireshark來擷取和看USB資料內容。