编写 USB 存储设备使用痕迹检测和删除工具

2019-03-04 12:08

编写 USB 存储设备使用痕迹检测和删除工具

(C# Windows Form 编程练习)

第一节 准备知识

之前一直都是用 Visual Basic .Net 来写 Windows Form 程序。这几天,熟悉了一下 C# 语言的语法,想练习一下。以前使用过一些 USB 存储设备使用痕迹检测和删除工具,于是想写了一个小工具来模拟这些功能。

USB 存储设备在使用后会在注册表留下一些记录,一般是通过检索相应的注册表键值来检查使用痕迹。这些键值包括:

[csharp] view plain copy print?

1. HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSetXXX(CurrentControSetXXX)\\Enum\\USB 2. HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSetXXX(CurrentControSetXXX)\\Enum\\USBSTOR

3. HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSetXXX(CurrentControSetXXX)\\Control\\Devi

ceClasses\\{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

4. HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSetXXX(CurrentControSetXXX)\\Control\\Devi

ceClasses\\{a5dcbf10-6530-11d2-901f-00c04fb951ed}

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 中定义):

[csharp] view plain copy print?

1. {A5DCBF10-6530-11D2-901F-00C04FB951ED} GUID_DEVINTERFACE_USB_DEVICE 2. {3ABF6F2D-71C4-462A-8A92-1E6861E6AF27} GUID_DEVINTERFACE_USB_HOST_CONTROL

LER

3. {F18A0E88-C30C-11D0-8815-00A0C906BED8} GUID_DEVINTERFACE_USB_HUB 4. {53F56307-B6BF-11D0-94F2-00A0C91EFB8B} GUID_DEVINTERFACE_DISK

{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-00C04FB951ED} 这两个键值,其他两个由于是和 USB 控制器有关,一般可不检查。有的资料介绍说还要检查 MountedDevices 子键,但是由于该子键和系统的分区信息有关,一般无绝对的把握,不必进行检查和删除,到时可能会造成不必要的麻烦。

第二节 检测 USB 存储设备使用痕迹

1、打开 Visual Studio 2010,新建一个空白方案,命名为 USBView。

2、在解决方案下新建一个类型为“Windows 窗体应用程序”的项目,命名为 USBViewer。将主窗体命名为 MainForm。并添加一些图标和 PNG 图像资源,美化一下程序界面。

资源文件包含了一个文本文件,名称为 VendorIDs.txt,保存的是 USB 设备厂家的 ID 号及厂家名称值对,用于显示在注册表中搜索到的 USB 设备的厂家名称(该文件内容来源于微软的 USBView 示例程序中的头文件vndrlist.h,该示例程序使用 C++ 编码,需要使用 Visual Studio 2013打开,并要求安装 Windows Driver Kit (WDK)8.1,下载链接地址

http://code.msdn.microsoft.com/windowshardware/USBView-sample-application-e3241039)。

在建立必要的按钮后,开始编写检测代码。因为要读取注册表,有必要使用 .Net 框架提供的 RegistryKey 类。这需要引用 Microsoft.Win32 命名空间,注册表类都在该命名空间中。

[csharp] view plain copy print?

1. using Microsoft.Win32;

using Microsoft.Win32;

之后便是获取我们感兴趣的注册表的基项 HKEY_LOCAL_MACHINE,接着使用RegistryKey 类的 OpenSubKey 方法以只读方式打开 SYSTEM 子键。

[csharp] view plain copy print?

1. RegistryKey hklm = Registry.LocalMachine;

2. RegistryKey systemKey = hklm.OpenSubKey(\

RegistryKey hklm = Registry.LocalMachine;

RegistryKey systemKey = hklm.OpenSubKey(\

这里顺带说一下,.Net 框架已经将注册表中的数据封装成了 Registry 类(注意 Registry 类和 RegistryKey 类是不一样的),并公布了几个只读属性,它们是:

RegistryKey 类是用于在注册表中检索数据用的类。以下是本文中用到的 RegistryKey 类的几个属性和方法:

[csharp] view plain copy print?

1. SubKeyCount // 检索当前项的子项数目。

2. OpenSubKey(string) // 以只读方式检索 string 标识的子项。 3. OpenSubKey(string, bool) // 以 bool 指定的方式检索 string 标识的子项,

若 bool 值为 true,表示以可读写方式打开,否则为只读方式。

4. DeleteSubKeyTree(string) // 递归删除 string 标识的子项和任何子级子

项。

5. GetValue(string) // 检索 string 标识的名称所关联的值,若该标识

的名称不存在,则返回 null。

6. GetSubKeyNames() // 返回一个包含所有子项名称的字符串数组。

7. Close() // 关闭该键,如果有更改,则将更改刷新到磁盘

上。

SubKeyCount // 检索当前项的子项数目。

OpenSubKey(string) // 以只读方式检索 string 标识的子项。 OpenSubKey(string, bool) // 以 bool 指定的方式检索 string 标识的子项,若 bool 值为 true,表示以可读写方式打开,否则为只读方式。 DeleteSubKeyTree(string) // 递归删除 string 标识的子项和任何子级子项。

GetValue(string) // 检索 string 标识的名称所关联的值,若该标识的名称不存在,则返回 null。

GetSubKeyNames() // 返回一个包含所有子项名称的字符串数组。

Close() // 关闭该键,如果有更改,则将更改刷新到磁盘上。

需要注意的是若想用可写方式打开某个子项进行删除或写入操作,一定要具有相应的权限,否则会抛出 SecurityException 异常。在检测阶段,由于只需要只读权限,可以使用方法 OpenSubKey(string)。在打开了 Local_Machine\\SYSTEM 子键后,开始检索该键下类似于 ControlSetXXX 和 CurrentControlSetXXX 的键。

[csharp] view plain copy print?

1. if (!sysKey.ToUpper().StartsWith(\2. !sysKey.ToUpper().StartsWith(\3. continue;

if (!sysKey.ToUpper().StartsWith(\ !sysKey.ToUpper().StartsWith(\ continue;

找到这样的子键后,就在其中检索 Enum\\USB、Enum\\USBSTOR、

Control\\DeviceClasses 等子键。由于 Enum\\USB 子键中的信息并不都是 USB 存储设备的信息,所以要加以判断。观察一下 Enum\\USB 子键下的项:


编写 USB 存储设备使用痕迹检测和删除工具.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:三年级班级管理制度

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: