作业帮 > 初中作文 > 教育资讯

iusb3mon是什么

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/24 17:10:30 初中作文
iusb3mon是什么初中作文

篇一:i3MON300监控客户端工作站

iMON300监控客户端工作站

■ 产品概述

3

i3MON300是针对通用安防监控应用而开发的监控客户端工作站,由管理客户端和监控客户端组成。管理客户端主要包括:设备管理、用户管理、电子地图管理、计划任务、报警管理、设备巡检等几大管理配置功能;监控客户端主要包括:实时监看、电子地图、检索回放、电视墙服务器控制、日志检索等几大监看控制功能。i3MON300不仅可以作为i3CMS智能安防中心管理平台的监控客户端,还可以作为i3NVR网络视频录像机和i3NVS网络视频服务器的监控客户端。

i3MON300监控客户端工作站具有功能强大、性能卓越、安全稳定、友好易用等特点,并提供实时监看和回放视频的局部放大、报警录像快速查看、关联视频检索回放、即时回放等特色功能,可广泛应用于公安、金融、交通、电力、能源、教育、大型园区、楼宇、医疗等行业。

■ 产品特点

?

?

?

?

? 支持4屏显示,菜单界面友好、便于操作; 支持高清图像的预览和回放; 支持在实时监看窗口内浏览电子地图; 支持实时监看和回放视频的局部放大; 提供基于视频窗的云台控制功能;

?

?

?

?

?

?

? 提供手动添加标签功能; 提供即时回放功能; 提供通过报警日志快速查看报警录像、处理报警、查看报警处理信息等功能; 提供关联视频的同步检索与同步回放功能; 支持0~99级用户等级; 支持设备的批量添加功能; 提供手动方式和自动方式的设备巡检功能。 ■ 产品规格

■ 订货型号

? i3MON300

篇二:GPS-I MON开关与七段管显示器的功能表

篇三:Linux系统通过手机GPRS上网设置

Linux通过手机上网

1.安装相关软件

sudo apt-get install wvdial

2.得到GPRS的IP地址

(1)

手机调整到usblan模式,在手机打开一个网页,让它的GPRS连通

(2)

运行sudo /sbin/ifconfig

确认usb0存在

(3)

运行sudo /sbin/ifconfig usb0 192.168.1.1

配置电脑上的usb0的IP为192.168.1.1

(4)

运行 telnet 192.168.1.2

telnet到手机,其中192.168.1.2为手机usblan的IP,如下

$ telnet 192.168.1.2

Trying 192.168.1.2...

Connected to 192.168.1.2.

Escape character is '^]'.

MontaVista(R) Linux(R) Consumer Electronics Edition 3.1

Linux/armv5tel 2.4.20_mvlcee31-mainstone_pxa27x

(none) login: root

MontaVista(R) Linux(R) Consumer Electronics Edition 3.1

No directory /root!

Logging in with home = "/".

# ifconfig

gprsv2 Link encap:Point-to-Point Protocol

inet addr:10.9.139.175 P-t-P:10.112.112.112 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:50

RX bytes:8991 (8.7 Kb) TX bytes:5117 (4.9 Kb)

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:24 errors:0 dropped:0 overruns:0 frame:0

TX packets:24 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:1392 (1.3 Kb) TX bytes:1392 (1.3 Kb)

gprsv2 Link encap:Point-to-Point Protocol

inet addr:10.10.88.48 P-t-P:10.112.112.112 Mask:255.255.255.255

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:50

RX bytes:1025 (1.0 Kb) TX bytes:1023 (1023.0 b)

# exit

Connection closed by foreign host.

$

(5)

由(4)得到gprsv2的IP为10.10.88.48,记录下来

3.为pppd添加GPRS IP

(1)

运行sudogedit /etc/ppp/options

在options文件的最后一行添加如下两行内容

novj

:10.10.88.48

其中10.10.88.48为2.(5)所得到的GPRS IP地址

4.配置/etc/wvdial.conf并连接上网

(1)

关掉手机的网页,确认手机上的GPRS连接已经断开

(2)

手机调整到usb modem模式

(3)

运行wvdialconf

检测手机的modem连接是否正常,程序自动创建/etc/wvdial.conf文件,正确情况如下

$ wvdialconf

Editing `/etc/wvdial.conf'.

Scanning your serial ports for a modem.

WvModem<*1>: Cannot set information for serial port.

ttyS0<*1>: ATQ0 V1 E1 -- failed with 2400 baud, next try: 9600 baud

ttyS0<*1>: ATQ0 V1 E1 -- failed with 9600 baud, next try: 115200 baud

ttyS0<*1>: ATQ0 V1 E1 -- and failed too at 115200, giving up.

Modem Port Scan<*1>: S1 S2 S3

WvModem<*1>: Cannot get information for serial port.

ttyACM0<*1>: ATQ0 V1 E1 -- OK

ttyACM0<*1>: ATQ0 V1 E1 Z -- OK

ttyACM0<*1>: ATQ0 V1 E1 S0=0 -- O

iusb3mon是什么

K

ttyACM0<*1>: ATQ0 V1 E1 S0=0 &C1 -- OK

ttyACM0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 -- OK

ttyACM0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

ttyACM0<*1>: Modem Identifier: ATI -- ERROR

ttyACM0<*1>: Speed 4800: AT -- OK

ttyACM0<*1>: Speed 9600: AT -- OK

ttyACM0<*1>: Speed 19200: AT -- OK

ttyACM0<*1>: Speed 38400: AT -- OK

ttyACM0<*1>: Speed 57600: AT -- OK

ttyACM0<*1>: Speed 115200: AT -- OK

ttyACM0<*1>: Speed 230400: AT -- OK

ttyACM0<*1>: Speed 460800: AT -- OK

ttyACM0<*1>: Max speed is 460800; that should be safe.

ttyACM0<*1>: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 -- OK

Found an USB modem on /dev/ttyACM0.

Modem configuration written to /etc/wvdial.conf.

/etc/wvdial.conf: Can't write '/etc/wvdial.conf.tmp8517': Permission denied

/etc/wvdial.conf: Can't write '/etc/wvdial.conf' ('/etc/wvdial.conf'): Bad file descriptor ttyACM0: Speed 460800; init "ATQ0 V1 E1 S0=0 &C1 & D2 +FCLASS=0"

$

(4)

运行sudogedit /etc/wvdial.conf

修改其内容,Baud保持4.(3)中程序自动创建的值,Username和Password的值到手机的网络设置查看

本例使用CMNET连接,文件内容如下

[Dialer Defaults]

Init1 = ATZ

Init2 = AT&FE0V1&C1S0=0

Init3 = AT+cgdcont=1,"IP","CMNET","",0,0

Modem Type = USB Modem

ISDN = 0

Phone = *99***2#

New PPPD = yes

Modem = /dev/ttyACM0

Username = 172

Password = 172

Baud = 460800

Idle Seconds = 3000

Auto DNS = 1

Stupid Mode = 1

Dial Command = ATD

Ask Password = 0

FlowControl = NOFLOW

(5)

禁用eth0等网络联连接

另:如果是在Debian Gnome环境下,右上角的网络连接工具,“启用联网”一项反选

(6)

运行sudowvdial

让Linux通过手机上网,正常情况如下

$ sudowvdial

-->WvDial: Internet dialer version 1.60

-->Cannot get information for serial port.

--> Initializing modem.

--> Sending: ATZ

ATZ

OK

--> Sending: AT&FE0V1&C1S0=0

AT&FE0V1&C1S0=0

OK

--> Sending: AT+cgdcont=1,"IP","CMNET","",0,0

OK

--> Modem initialized.

--> Idle Seconds = 3000, disabling automatic reconnect.

--> Sending: ATD*99***2#

--> Waiting for carrier.

CONNECT

--> Carrier detected. Starting PPP immediately.

--> Starting pppd at Mon May 18 21:16:57 2009

-->Pid of pppd: 8931

--> Using interface ppp0

-->pppd: [10][18]1

-->pppd: [10][18]1

-->pppd: [10][18]1

-->pppd: [10][18]1

-->pppd: [10][18]1

--> local IP address 10.55.0.37

-->pppd: [10][18]1

--> remote IP address 10.10.88.48

-->pppd: [10][18]1

--> primary DNS address 211.136.20.203

-->pppd: [10][18]1

--> secondary DNS address 211.136.17.107

-->pppd: [10][18]1

收到local IP address说明网络连接成功,终端里按Ctrl+C终止网络连接

(7)

验证上网效果

$ sudo /sbin/ifconfig

eth0 Link encap:EthernetHWaddr 00:F0:CF:81:F7:00

inet6 addr: 2001:da8:2004:2009:2f0:cfff:fe81:f700/64 Scope:Global inet6 addr: fe80::2f0:cfff:fe81:f700/64 Scope:Link

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:79280 errors:0 dropped:0 overruns:0 frame:0

TX packets:9418 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:14814054 (14.1 MiB) TX bytes:1465054 (1.3 MiB) Interrupt:16 Base address:0xc000

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

inet6 addr: ::1/128 Scope:Host

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:875 errors:0 dropped:0 overruns:0 frame:0

篇四:USB监控

《电信交换》2009年 第1期

●安全与保密

内部局域网中USB设备分类

监控系统的设计与实现

蒲堪峰

(电信科学技术第十研究所 陕西 .西安 710061)

摘 要:分析了Windows 2000 操作系统下采用HOOK系统IRP消息的方式实现

对USB设备分类监控,可对用户的USB设备操作行为进行实时监控。该系统采用集

中式管理,分布式控制架构,具有动态的USB设备变更检测、类型检测、敏感USB

设备控制,安全警报,日志审计等功能。作为内网一体化安全防护系统的一个子系

统,通过实际使用表明,该系统能够有效地控制和降低 USB 设备对内部网造成的

信息安全风险。

关键词:USB IRP WDM 设备监控 HOOK

在我国,国家政府部门、企事业单位已经越来越多地使用计算机网络开展日常工作和业务,利用计算机网络发送和处理大量的内部秘密文件。越来越庞大的计算机网络及其不断更新的相关技术也带来了不断增长的安全隐患,网络安全已经成为了一个国际化的问题。防病毒、防黑客、物理隔离、数据备份、防火墙等是人们常用的防止外部网络侵害的信息保护手段。然而更大的安全隐患来源于网络内部,据统计,大约有80% 的安全破坏是在网络内部发生的。所以防范来自内部的攻击更为重要、更为迫切,一旦因为各种原因导致内部涉密文件泄漏,将对国家稳定和社会安全造成巨大威胁。因此,针对内部网络终端使用者行为、移动存储设备、用户身份认证管理等开发的“内网一体化安全防护系统”,将从技术上解决这个问题,使已发生的事件不再是无法追查,并能够做到有理有据。

USB接口是计算机网络信息传输的一个重要途径,同时也是内部网病毒的传播源,因此很多保密单位都在物理上禁用 USB端口。但由于USB设备种类众多且使用广泛,仅仅简单地禁用 USB 接口会使无威胁的外围设备如USB 鼠标、键盘和USBKEY 等无法使用,给用户带来很多不便。本文讲述了“内网一体化安全防护系统”中基于微软Windows 2000操作系统下的USB设备监控系统USBMon的实现。该子系统可以根据管理员制定的策略分类管理USB设备,方便管理员对网络中各主机的USB设备进行细粒度的管理。

一、USBMon监控系统的基本原理

1.Windows 2000系统结构

[1 ]Windows 2000操作系统使用IRP与内核模式驱动程序(NT4和WDM)通信。图1是以

用户视点所看到的Windows 2000操作系统,该图描述了驱动程序开发者所关心的特征。当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile。Win32子系统模块(如Kernel32.dll)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。

在ReadFile调用中,调用先到达系统DLL(Ntdll.dll)中的一个入口NtReadFile函数,然后这个用户模式的 NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。系统中还有许多与NtReadFile相似的服务例程运行在内核模式中,为应用程序请求提供服务,并以某种方式与设备交互。它们首先检查传递给它们的参数,以保护系统安全或防止用户模式程序非法存取数据,然后创建一个称为“I/O请求包(IRP) ”的数据结构,并把这个数据结构送到某个驱动程序的入口点;NtReadFile将创建一个主功能代码为IRP_MJ_READ的IRP,执行IRP的设备驱动程序最后可能会访问硬件;驱动程序完成一个I/O操作后,通过调用一个特殊的内核模式服务例程来完成该IRP。完成操作是处理IRP的最后动作,它使等待的应用程序恢复运行。

同样,对于USB设备的所有操作都是通过向USB设备发送相应的IRP 完成的。USBMon拦截所有发往USB设备的IRP,并对其中的内容进行分析。如果发现USB设备处于配置阶段,说明新插入USB设备,这时,USBMon会通过发送相应的IRP得到新插入USB设备的设备类型,如存储类设备、USB集线器类设备或者厂商自定义设备等,再根据策略文件来决定是否启用这个设备。USBMon中的关键问题是IRP拦截、判断新设备的加入以及对厂商自定义类设备的管理。

2.HOOK 系统的IRP消息

Windows 2000下,设备和驱动程序的有着明显的堆栈式层次结构:处于堆栈最底层的设备对象称为物理设备对象,或简称为PDO,与其对应的驱动程序称为总线驱动程序;在设备对象堆栈的中间某处有一个对象称为功能设备对象(FDO),其对应的驱动程序称为功能驱动程序;在FDO的上面和下面还会有一些过滤器设备对象(FiDO);位于FDO上面的过滤器设备对象称为上层过滤器,其对应的驱动程序称为上层过滤器驱动程序;位于FDO下面( 但仍在PDO之上)的过滤器设备对象称为下层过滤器,其对应的驱动程序称为下层过滤器驱动程序。这种栈式结构可以使I/O请求过程更加明了。每个影响到设备的操作都使用IRP,通常IRP先被送到设备堆栈的最上层驱动程序,然后逐渐过滤到下面的驱动程序。根据设备以及该IRP所携带的内容,每一层驱动程序都可以决定如何处理IRP,有时驱动程序不做任何事,只是向下层传递该IRP;有时驱动程序直接处理完该IRP不再向下传递;有时驱动程序既处理了该IRP又把该IRP传递下去。

USB设备驱动程序在与硬件设备进行通信时,一般使用USB总线驱动程序接口(USBDI,USB Driver Interface),而不直接使用HAL函数与硬件通信。USB驱动程序为了向其硬件设

备发送一个请求,先创建一个USB请求块(URB),再把 URB提交到总线驱动程序。例如:为了配置一个USB设备,USB设备的驱动程序需要提交几个URB来读取各种描述符或发送命令,向USBD的调用被转化为带有主功能代码为IRP_MJ_INTERNAL_DEVICE_CONTROL的IRP;然后,这个IRP会被发往由USB集线器驱动为USB设备创建的PDO对象。

微软提倡的IRP拦截方法是创建一个上层过滤设备对象,并将它加到要拦截设备所在的设备堆栈中,其过程为:先通过IoCreateDevice创建自己的设备对象;然后获得要拦截设备的设备对象指针;最后通过IoAttachDeviceToDeviceObject将自己的设备放到设备堆栈上成为一个过滤器。这种方法是最可靠,也是最常用的。但是,在USBMon中使用这种方法会有些问题。假如有一个USB存储设备接到USB Hub上,USB Hub的驱动程序会为这个USB存储设备创建一个PDO,然后由USB存储设备的驱动程序(Windows 2000下为usbstor.sys)创建FDO对象并加到PDO上。此时如果把过滤设备对象加入设备堆栈,过滤设备将在设备堆栈的最上层,I/O管理器发给USB设备的IRP 将先经过过滤设备;而如果先加好了过滤驱动,再插入闪存时就会形成图2所示的设备堆栈结构。绝大多数的IRP都是由USB Hub驱动建立的PDO对象完成,此时根本达不到过滤的效果,因而这种方法只有在USB设备加入后才能拦截IRP,这就使它无法检测到设备的动态插入。如果仅仅是对设备的操作进行记录,而不需要检测设备的动态插入,这到不失为一种理想的方法。

USBMon使用了HOOK驱动设备对象派遣函数的方法来拦截IRP,对于发往设备的IRP,I/O管理器会使用DeviceObject中的DriverObject反向指针来定位相应的驱动程序对象,然后根据IRP和IRP堆栈中的参数调用相应的驱动程序例程。从IRP处理过程可看出,只要将驱动程序例程指针用相应的钩子函数来代替就可达到拦截IRP的目的。这种方法最简单直接,而且拦截IRP时不会受到过滤设备必须在设备堆栈栈顶的限制。这里选择了HOOK USB集线器驱动程序的分发例程。

通过动态调试发现,驱动程序开发中,经常使用的IRPTrace工具,通过HOOK IoCallDriver等IRP处理过程中必须使用的I/O服务例程来达到拦截IRP的目的,它使用的方法类似上层截获API调用的方法,直接改写ntokrnl.exe的PE头导出节。这种方法可以截获到系统内所有的IRP,适用面很广,与上面的方法相比,只是实现的难度和系统开销稍微大了一点。

另一种方法是通过给USB集线设备添加过滤驱动程序来拦截IRP。这种方法最保险且稳定。

3.通过分析IRP获取设备加入通知

USBMon要完成的功能是根据设备策略禁用USB设备,并不关心USB设备的具体操作,因此钩子函数的工作仅仅是监控新设备的加入并根据策略及时对设备的启用进行控制。所有新加

入的设备都要通过配置才能使用,USBMon通过设备配置过程中的某些特殊操作来获得新设备加入的通知,并根据策略及时阻止。以下是USB设备连接时的总线列举过程。

(1)USB集线器发现有USB设备插入时,会向主机报告其下行端口上有 USB设备连接。主机接到该通知后,会向集线器发出GetPortStatus请求,以了解更多信息;

(2)主机向该集线器发出GetPortStatus请求(集线器设备类请求),以复位这个USB设备;

(3)主机使用默认地址向USB设备发出GetDescriptor请求,以取得其缺省控制管道所支持的最大包长度;

(4)主机向USB设备发出SetAddress请求,为其分配一个唯一的设备地址;

(5)主机使用新地址向USB设备发出GetDescriptor请求,以读取其设备描述符的全部字段,以了解该设备的总体信息,如供应商ID、产品ID等;

(6)主机向USB设备循环发出GetDescriptor请求,以读取其全部配置信息;

(7)主机根据USB设备的配置信息如供应商ID、产品ID等,为其选择一个合适的驱动程序;

(8)加载USB设备驱动程序以后,主机发出SetConfiguration(x)请求为该设备选择一个合适的配置(x代表非0的配置值)。

以上过程都是配置USB设备必不可少的。在钩子函数中阻止上面任?a href="http://www.zw2.cn/zhuanti/guanyuwozuowen/" target="_blank" class="keylink">我徊降恼吠瓿桑伎梢源锏浇蒙璞傅哪康摹5玌SBMon是需要获得一些设备信息来判断新加入的设备是否应该被禁用,获取信息的过程只能在主机分配设备地址之后才能完成,因此选择将SetConfiguration(x)请求作为有新设备加入的标志。SetConfiguration请求并不是配置过程特有的,或许在某些情况下也要使用这个请求(测试中暂时还没发现这种情况),但只要有设备加入就一定会有 SetConfiguration(x)请求。一旦USBMon拦截到SetConfiguration(x)请求,说明有新设备加入,这时它将会去获取设备类型信息。如果此类设备是被禁用的, USBMon直接完成这个请求并返回状态NTSTATUS_UNSUCCESSFUL;否则将请求交给正常的驱动程序服务例程。

二、USBMon监控系统的设计实现

USBMon监控系统采用C/S 模式、分布式控制技术,整个系统由一个监管控制台(Console)和若干监管代理(Agent)组成,Console和Agent之间采用socket 进行通信,如图3所示。管理员通过监管控制台统一设置和分发各个节点的安全策略,监管代理驻留在各个受控主机的节点上,以安全中间件的方式嵌入到系统内核,按照安全策略对本机节点上接入的各种USB 设备进行管理,并对用户行为进行监视,一旦发现用户有违规操作USB设备的行为,立即加以阻断,并向控制台发出报警信号。同时,违规行为的相关信息被记录在日志文件中,作为

[1- 2]

追究违规者责任的依据和凭证。

图3 USBMonitor系统监控模型

客户端程序 Agent 由 Ring 0 级和 Ring 3 级2个部分组成,如图4所示。Ring 0 级

模块是注入到设备堆栈的监控驱动程序,负责新设备插入和设备状态变更的监视;Ring 3 级是监控进程,在收到监控驱动后进行设备识别和设备控制。监控驱动通过一个信号量与监控进程进行通信,当监控进程收到监控驱动的消息有新USB 设备接入时,会对设备进行识别,然后根据识别出的设备类型,进行策略匹配。如不符合管理员设定的设备控制策略,则将本设备禁用。

图4 Agent 监控模型

当管理员更新了安全策略,Agent 会枚举所有USB 设备并依次进行策略匹配。如果用户在客户端试图启用违禁设备,Agent 就会报警,重新对所有USB 设备进行一次策略匹配,将用户非法启用的设备禁用。在某些特殊情况下,如策略文件丢失或被破坏,Agent 将按照默认策略实施控制,以防违禁设备被非法使用。Agent由应用层程序和驱动程序两部分组成。应用程序负责从服务器下载策略文件并在必要时通知管理员对策略进行更新。驱动程序主要由初始化过程、钩子函数的实现及策略控制构成。

1.初始化过程

应用程序传递驱动程序使用的信息,驱动程序禁用监控系统启动前就插入的违规设备。

(1)应用程序创建一个Event对象并将句柄发给驱动程序用于两者间的通信;

(2)应用程序通过SetupDiEnumDeviceInterfaces API获得USB Hub设备的句柄并发给驱动程序,驱动程序通过这个句柄获得USB Hub设备对象,然后获得相应的驱动对象指针;

(3)HOOK USB Hub驱动程序的分发例程;

(4)应用程序读取策略并将策略发送给驱动程序;

(5)驱动程序通过USB Hub驱动对象中的设备链表枚举设备,如果设备对象中的AttachedDevice域不为空,说明有USB设备在设备堆栈上,这时进行策略匹配。对于被禁止的USB设备,向设备对象发送副功能码为IRP_MN_QUERY_STOP_DEVICE和IRP_MN_ STOP_DEVICE的PnP IRP,达到禁用设备的目的。

2.HOOK IRP流程

图5给出了钩子函数的流程图

篇五:USB透明加解密驱动

USB透明加解密驱动

By

一、使用说明

该驱动基于hook技术实现了USB指定目录透明加解密功能,在windows2000、XP、以及windows2003下测试通过,由于使用了fsd hook技术,可能会与一些安全软件冲突。测试步骤如下:

1、启动bin\usbmon.sys

2、插入U盘【FAT32格式】,建立一个测试文件夹@test[@为加解密标识符],从硬盘拷贝一个文档到该目录,拔出U盘。

3、在另一台未安装驱动的机器上插入U盘,文件已加密。

4、插回原机器,文件被解密,卸载驱动。

源代码位于codes目录,v920是完整的版本,但是由于一些问题我没有很好的解决,所以你可以帮忙完善下,你可以使用2000DDK直接编译,也可以使用VC6直接编译。你可以自由修改代码,我有空也可以一起帮忙改进,如果你打算在商业代码中使用它,请开放代码,因为我痛恨它。

二、基本思路

插入U盘我们用DevView看一下设备情况

Root Driver:System32\DRIVERS\usbhub20.sys \Driver\usbhub20 -

\Device\USBPDO-6 FILE_DEVICE_UNKNOWN

usbhub20

USB通用驱动 System32\DRIVERS\USBSTOR.SYS

\Driver\USBSTOR

\Device\0000036 ->Pdo =\Device\USBPDO-6

\Device\0000037 ->Pdo =\Device\USBPDO-6

因此初步的设想是Hook USBSTOR的数据读写处理函数,但是USBSTOR并不常驻内存,因此我们要先顺便把它下层USBHUB的PNP事件也HOOK掉,代码如下:

Usbmon.c DriverEntry Line34:

Globals.PnpHookHandle = SetupInlineHook(usbRoot->MajorFunction[IRP_MJ_PNP], HookPnpDevice, NULL);

Usbmon.c HookPnpDevice Line83:

case IRP_MN_START_DEVICE:

if (KeGetCurrentIrql() == PASSIVE_LEVEL)

{ //HOOK USBSTOR IRP_MJ_SCSI RtlInitUnicodeString(&usbStorName, USB_STOR_DRIVER_NAME);

if (NT_SUCCESS(ObReferenceObjectByName(&usbStorName, OBJ_CASE_INSENSITIVE, NULL, 0, *IoDriverObjectType, 0, 0, &usbStor))) { ObDereferenceObject(usbStor); KdPrint(("Usb device %08x %08x %08x started...\n", DeviceObject, usbStor, irpStack->FileObject)); if (Globals.UsbStorDriver && Globals.UsbStorDriver != usbStor) { ASSERT(Globals.ScsiHookHandle); KdPrint(("RE_HOOK USBSTOR SCSI!!!!"));

ClearInlineHook(Globals.ScsiHookHandle); Globals.ScsiHookHandle = NULL; Globals.ScsiReadCompletionHandle = NULL;

Globals.UsbStorDriver = usbStor;

} if (!Globals.ScsiHookHandle) {

KdPrint(("Hook UsbStor ...\n")); Globals.ScsiHookHandle = SetupInlineHook(usbStor->MajorFunction[IRP_MJ_SCSI], HookUsbScsi, NULL);

}

}

}

这样我们就可以得到所有的USB读写消息了,由于我们处理的相当底层了,因此这一层实际上已经是SCSI接口标准了,当然如果

你要做全盘透明加密的话,还是可以考虑在这里处理加解密,但是会有一些很麻烦的小问题,比方说文件缓存的问题,我在驱动开发网上发了相关的问题,但是至今没有人回答。也许是这个比较难搞吧,如果你了解scsi以及windows内核,你可以看看v920,里面有更多好玩的东西。

这里我们的目标是加解密指定的文件夹,但是在usbstor这一层已经没有任何的文件对象了,这点你可以用windbg验证。所以我们需要一个更上层的hook,也就是hook windows文件系统,因为Mj告诉我Irp到那一层还是有文件对象的。fsd——hook网上流传的多是hook ntfs,但是一般的U盘都是Fat格式的,hoho。不过原理是一样的,只是hook fastfat而已。 Usbmon.c DriverEntry Line213: Globals.fsdReadHookHandle = SetupInlineHook(Globals.FastFatDriver->MajorFunction[IRP_MJ_READ], HookFsdReadWrite, NULL);

Globals.fsdWriteHookHandle = SetupInlineHook(Globals.FastFatDriver->MajorFunction[IRP_MJ_WRITE], HookFsdReadWrite, NULL);

这样所有的文件数据都会在HookFsdReadWrite中流过,而且你也有一个文件对象。相关代码太简单了,注意的一点就是加密的时候记得最后要恢复原始数据到Mdl。至于SetupInlineHook,也很简单,稍微了解一点汇编,在图上画几下应该可以明白。

三、后记

220行代码的USB透明加密复杂吗?为什么google不到任何资料?很是郁闷。也许一些关键技术是要保密吧,但是我痛恨没有资料。痛恨那些个从互联网上找来东西,还自己捂着。其实只要E文稍微好点,可以找到很多东西的,学好英语吧!一点点忠告,因为你在中文网上别想找到什么。我也许唯一能做的就是大声的反抗几句,呐喊几下,但是我还是要反抗。因为我就是传说中的VB SUPER MAN!拯救这个世界是我的责任...

初中作文