阅读:58169回复:7
讨论 bushound实现
bushound ,我想大家都用过。它的最大特点是能过滤出usb主机和设备之间通信的数据包。
但这个过程是如何实现的,希望大家能给点意见,帮帮我。 参考教课书上的例子,我可以把win32的IRP请求包的数据过滤出来,显示在另外的win32程序中。 原理:两个win32驱动程序通过系统线程共享数据。 首先在分发例程中对感兴趣的IRP数据保存在一个双向链表中,然后通过内核同步事件,通知 创建的系统线程,系统线程将链表中的数据读取到它的缓冲区中,这样另外的win32程序 发送IRP给它的驱动,就把缓冲区数据读出来了,显示给用户。 但是不知道如何得到USB低层数据,我想情况可能是这样的:在USB类驱动程序和PCI总线驱动程序间 加一层过滤驱动程序,和上面的原理一样,把感兴趣的数据写到链表中,通过系统线程(自己创建的)发给win32。 希望兄弟们发表下意见。 |
|
沙发#
发布于:2008-09-20 11:52
养鸟的地儿!!!!!
|
|
板凳#
发布于:2008-09-22 07:07
BusHound用的是dispatch hooking,截获IRP,实现了bus filter driver的功能。关键点是注册成usb class的LowerFilter/UpperFilter
|
|
|
地板#
发布于:2008-09-26 20:44
现在已完成一个Lower filter driver,注册成usb class。成功截取IRP。截取的IRP大多数为IRP_MJ_INTERNAL_DEVICE_CONTROL,但是我不知道怎么得到该IRP的数据,即Buffer。DDK上说三种方式:METHOD_BUFFERED ,METHOD_IN_DIRECT or METHOD_OUT_DIRECT 或者METHOD_NEITHER 。反解IOCODE,可知其方式为METHOD_NEITHER ,按照DDK上的说法,IN Buffer应该为Parameters.DeviceIoControl.Type3InputBuffer ,Out Buffer为Irp->UserBuffer. IN 长度为:Parameters.DeviceIoControl.InputBufferLength ,Out 长度为:Parameters.DeviceIoControl.OutputBufferLength 。过滤出来的这两格参数
InputBufferLength 总为0,OutputBufferLength为一个很大的数。所以我认为不对,所以我不知道Buffer在哪里,也不知道Buffer的长度。这块感到很迷惑 |
|
地下室#
发布于:2008-09-26 21:30
InputBufferLength 0 ,OutputBufferLength:2249351312 ,IO: METHOD_NEITHER
OutBuffer:00000000,InBuffer:00000000 我得到的结果 |
|
5楼#
发布于:2010-03-08 13:55
其实bushound还可以发送数据的
|
|
6楼#
发布于:2011-07-07 11:08
回 3楼(IoManager) 的帖子
Lower filter driver 怎么实现的,我实现的是用WDM模式的,数据其实在OTHERS1中。但是这样显然不行,只能在设备驱动加载之后截获数据。其实在驱动加载前,就GET_DESCRIPTOR了。用DEVICETREE没发现有新的设备创建,只有一个设备 |
|
7楼#
发布于:2011-07-07 11:11
IRP HOOK 吗?
IRP HOOK 属于未公开技术。有可能不稳定。微软建议这么做吗?在USB 总线下面的设备是什么,是不是挂到它上面。 BUSHOUND 怎么做的? |
|