編寫 USB存儲設備使用痕跡檢測和刪除工具
(C# Windows Form編程練習)
[版權所有 邱秋 2014 [email protected],轉載請注明出處]
第一節 准備知識
之前一直都是用Visual Basic .Net來寫Windows Form程序。這幾天,熟悉了一下 C#語言的語法,想練習一下。以前使用過一些 USB存儲設備使用痕跡檢測和刪除工具,於是想寫了一個小工具來模擬這些功能。
USB存儲設備在使用後會在注冊表留下一些記錄,一般是通過檢索相應的注冊表鍵值來檢查使用痕跡。這些鍵值包括:
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Enum\USB
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Enum\USBSTOR
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Control\DeviceClasses\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}
HKEY_LOCAL_MACHINE\SYSTEM\ControlSetXXX(CurrentControSetXXX)\Control\DeviceClasses\{a5dcbf10-6530-11d2-901f-00c04fb951ed}
其中 ControlSetXXX和 CurrentControlSetXXX表示的是注冊表中的類似於ControlSet001、ControlSet002、CurrentControlSet這樣的子鍵(CurrentControlSet子鍵一般只有一個,特殊情況下可能有CurrentControlSet001等多個,同樣的 ControlSet一般只有 ControlSet001和 ControlSet002這兩個,特殊情況下可能會有多個),CurrentControlSet保存的是系統的當前的一些配置信息,而ControlSet001等則是對當前配置信息的備份,一般注冊表都會有兩個以上的備份,有的時候可能會有更多。在ControlSetXXX中的信息和 CurrentControlSet中的信息一般都是一樣的,所以在檢測和刪除 USB存儲設備信息時,不僅要檢測 CurrentControlSet子鍵,也要檢測 ControlSetXXX子鍵。
對於 Enum\USB子鍵,其中存儲的是曾經連接到系統的 USB設備的一些信息,包括 USB鼠標、鍵盤、光驅、手機、移動硬盤、攝像頭、U盤等,所以並不是所有的信息都是 USB存儲設備信息,雖然把這些信息刪除並無大礙(因為刪除的只是這些設備的一些連接信息和相應的驅動信息,並不是刪除系統的實際驅動文件,所以系統會自動重新識別這些設備),但為了提高識別精確性,還是增加一些判斷來得好些。
而對於 Enum\USBSTOR子鍵來說,則相當於把 USB存儲設備的信息單獨分離出來了,該子鍵下存儲的信息都是曾經連接到計算機的 USB存儲設備的相關信息。這些信息詳細列出了該 USB存儲設備的類型、硬件 ID、設備描述、友好名稱等信息。
對於 Control\DeviceClasses來說,該子鍵下存儲的是以 GUID分類的設備信息,其中有幾個是和 USB設備有關的(它們在微軟的 USB和存儲設備輸入輸出控制頭文件USBIODEF.H和NTDDSTOR.H中定義):
{A5DCBF10-6530-11D2-901F-00C04FB951ED} GUID_DEVINTERFACE_USB_DEVICE
{3ABF6F2D-71C4-462A-8A92-1E6861E6AF27} GUID_DEVINTERFACE_USB_HOST_CONTROLLER
{F18A0E88-C30C-11D0-8815-00A0C906BED8} GUID_DEVINTERFACE_USB_HUB
{53F56307-B6BF-11D0-94F2-00A0C91EFB8B} GUID_DEVINTERFACE_DISK
一般檢查{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}和{A5DCBF10-6530-11D2-901F-00C04
FB951ED}這兩個鍵值,其他兩個由於是和 USB控制器有關,一般可不檢查。有的資料介紹說還要檢查 MountedDevices子鍵,但是由於該子鍵和系統的分區信息有關,一般無絕對的把握,不必進行檢查和刪除,到時可能會造成不必要的麻煩。
第二節 檢測 USB存儲設備使用痕跡
1、打開Visual Studio 2010,新建一個空白方案,命名為 USBView。