riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1254回复:10

贴源码,请大虾指正、答疑

楼主#
更多 发布于:2004-11-24 16:51
在看完filemon的源码后,我尝试修改其中的HookDrive
我想直接将设备对象绑定到文件目录或某一个具体的文件,可是试了以后还是不行,设备对象还是以磁盘为主,
WCHAR   filename[] = L"\\DosDevices\\D:\\TEST\\USB_SD.doc"
WCHAR   filename[] = L"\\DosDevices\\D:\\TEST\\"
WCHAR   filename[] = L"\\DosDevices\\D:\\"
的定义结果都是一样,没有区别,下面是我的修改代码,我已经编译运行过了,可以正常hook和unhook,

问题1:怎样才可以直接绑定到文件目录或某一个具体的文件???

问题2:HookDrive函数和DriverEntry函数中的IoCreateDevice有什么不同啊?

问题3:HookDrive中的IoAttachDeviceByPointer干什么用的啊?为什么不在DriverEntry中实现呢?

问题4:创建设备扩展对象可以不创建吗???
//----------------------------------------------------------//          H O O K / U N H O O K   R O U T I N E S
//----------------------------------------------------------
BOOLEAN myHook(IN PDRIVER_OBJECT DriverObject )
{
    IO_STATUS_BLOCK     ioStatus;
    HANDLE              ntFileHandle;  
    OBJECT_ATTRIBUTES   objectAttributes;
    PDEVICE_OBJECT      fileSysDevice;
    PDEVICE_OBJECT      hookDevice;
    UNICODE_STRING      fileNameUnicodeString;
    WCHAR               filename[] =  L"\\DosDevices\\D:\\TEST\\USB_SD.doc";
    NTSTATUS            ntStatus;
    ULONG               i;
    PFILE_OBJECT        fileObject;
    PHOOK_EXTENSION     hookExtension;
    
    // Has this drive already been hooked?
if(myDevices == NULL){
RtlInitUnicodeString( &fileNameUnicodeString, filename );
        InitializeObjectAttributes( &objectAttributes, &fileNameUnicodeString,  OBJ_CASE_INSENSITIVE, NULL, NULL );  
ntStatus = ZwCreateFile(&ntFileHandle,
         GENERIC_READ|GENERIC_WRITE|GENERIC_EXECUTE,
     &objectAttributes,
      &ioStatus,
        0,
     FILE_ATTRIBUTE_NORMAL,
     FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
     FILE_OPEN,
     FILE_SYNCHRONOUS_IO_NONALERT,
     NULL,    
     0 );

        if( !NT_SUCCESS( ntStatus ) ) {
            DbgPrint(("Filemon: Could not open drive!!!\n"));
            return FALSE;
        }

// Got the file handle, so now look-up the file-object it refers to
        ntStatus = ObReferenceObjectByHandle( ntFileHandle, FILE_READ_DATA,  NULL, KernelMode, &fileObject, NULL );
        if( !NT_SUCCESS( ntStatus )) {
            ZwClose( ntFileHandle );
            return FALSE;
        }
        //
        fileSysDevice = IoGetRelatedDeviceObject( fileObject );
        if ( ! fileSysDevice ) {
            ObDereferenceObject( fileObject );
            ZwClose( ntFileHandle );
            return FALSE;
        }
        if( myDevices == fileSysDevice ) {
ObDereferenceObject( fileObject );
             ZwClose( ntFileHandle );
             myDevices = fileSysDevice;
             return TRUE;
        }
        ntStatus = IoCreateDevice( DriverObject,
                    sizeof(HOOK_EXTENSION),
                    NULL,
                    fileSysDevice->DeviceType,
                    0,
                    FALSE,
                    &hookDevice );

        if ( !NT_SUCCESS(ntStatus) ) {
            ObDereferenceObject( fileObject );
            ZwClose( ntFileHandle );
            return FALSE;
        }
        hookDevice->Flags &= ~DO_DEVICE_INITIALIZING;

        //
        hookExtension = hookDevice->DeviceExtension;
        hookExtension->LogicalDrive = 'A';
        hookExtension->FileSystem   = fileSysDevice;

        ntStatus = IoAttachDeviceByPointer( hookDevice, fileSysDevice );
        if ( !NT_SUCCESS(ntStatus) )  {
            ObDereferenceObject( fileObject );
            ZwClose( ntFileHandle );
            return FALSE;
        }
        //
        ObDereferenceObject( fileObject );
        ZwClose( ntFileHandle );
        myDevices = hookDevice;
}
    return TRUE;
}

myDevices是我自己定义的设备对象
PDEVICE_OBJECT      myDevices;

在unhook中释放myDevices就可以了,初学driver,多多包涵
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-11-25 09:17
请大虾伸出援助之手。。。
cicada
驱动小牛
驱动小牛
  • 注册日期2003-12-09
  • 最后登录2008-07-11
  • 粉丝1
  • 关注0
  • 积分74分
  • 威望15点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-11-25 09:30
问题1:怎样才可以直接绑定到文件目录或某一个具体的文件???
我也不知道,望高手解题。

问题2:HookDrive函数和DriverEntry函数中的IoCreateDevice有什么不同啊?
创建的设备类型不一样。DriverEntry中只是一个简单的filemon设备对象,而HookDrive中则创建的是要过滤的目标设备的设备对象。

问题3:HookDrive中的IoAttachDeviceByPointer干什么用的啊?为什么不在DriverEntry中实现呢?
过滤设备加载的目标设备堆栈时要调用的函数。

问题4:创建设备扩展对象可以不创建吗???
设备扩展中存储的很多判断的信息。应该不行。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-11-25 09:39
问题1:根据filemon的方法,只能绑定一个分区,因为只有一个分区才是一个设备(DeviceObject),只有对设备的驱动绑定过滤驱动才能完成文件系统过滤。要绑定一个文件或者文件夹,只能通过即时分析了,如果是目标文件(夹)就处理,否则丢弃。
在交流中学习。。。
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-11-25 11:20
通过即时分析来判断是目录或文件,可是这样系统的效率不就很低了吗?因为IRP的包太多了。

非常感谢两位的回答,还请来客继续讨论。
newkey
驱动小牛
驱动小牛
  • 注册日期2002-10-03
  • 最后登录2013-10-13
  • 粉丝1
  • 关注0
  • 积分45分
  • 威望392点
  • 贡献值1点
  • 好评度90点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-11-25 11:31
只能绑定分区

过虑规则定位到具体的目录或文件
www.xDrv.com
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-11-25 14:07
只能绑定分区

过虑规则定位到具体的目录或文件

好象目前只能那样.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-11-26 09:33
问题1看来也只能这样啦

问题2:我的理解是DriverEntry中只是创建filemon设备对象
HookDrive中是打开而不是创建要过滤的目标设备的设备对象
 
不知道大虾们有何见解

问题4:设备扩展对象是自己定义创建的,那它里面的数据结构应该可以随意定义吧,既然这样,那我把它设置为空可不可以啊?

请大虾答疑

wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2004-11-26 10:08
问题2:我的理解是DriverEntry中只是创建filemon设备对象,
用来表示FILEMON本身,,除了和应用交互外不处理任何其他IRP
HookDrive中是创建要过滤设备对象,有多少个设备要过滤,你就创建多少个该对象.
题4:设备扩展对象是自己定义创建的,那它里面的数据结构应该可以随意定义吧,既然这样,那我把它设置为空可不可以啊?
可以,不过一般对于CDO而言可以为空,但对过滤设备对象而言,可以存放些特定的东西,也可以用来区别CDO和过滤设备对象.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
toadwolf
驱动牛犊
驱动牛犊
  • 注册日期2003-11-30
  • 最后登录2013-11-12
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望67点
  • 贡献值0点
  • 好评度26点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-11-26 14:09
设备扩展对象当然可以为空. 可是如果你需要创建许多自己的过滤对象的话, 你就需要一个设备扩展对象来存储一些标志信息来帮助你识别每一个过滤对象.

toad
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-11-26 15:32
看来功夫不负有心人啊,大虾们总算解决了俺几个疑问。
游客

返回顶部