Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
阅读:1321回复:4

sfilter能改造得简单一点吗?

楼主#
更多 发布于:2007-02-05 17:02
我看了SFilter的代码,觉得它attatch的过程太复杂了,把我弄得神经混乱,心想能不能把它弄得简
单一点。它目前的情况下,把所有的文件系统的所有卷都hook住了,笼罩式的。假如我没有这么大的要
求,而只要hook一个指定的C:盘,我能不能做得简单一点呢?

    我看了FileMon里面的实现,它可以直接从一个文件句柄,取得所对应的DeviceObject,然后调用
IoAttachDeviceToDeviceStack函数,将创建的设备对象Attach到找到的设备栈上去。这可简洁多啦!
 
    我想依filemon的葫芦,画我Sfilter的瓢。我在寻找C:盘设备对象的时候,用了方法IoGetDeviceObjectPointer,
然后去attach,跟踪发现是成功了的。最后打开Devicetree察看,发现我的sfiter驱动加到了
\\driver\\ftdisk下面去了。真是不幸,我失败了,我并不能hook住我对c:盘文件的操作!

    问题就在于取得C:盘的ntfs设备对象的方法,我的方法错了。不知道有人肯教我否?

最新喜欢:

linshierlinshi...
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2007-02-05 18:18
如果你想在sfilter的基础上修改,让他只attach到c:上,那么你在IRP_MJ_FILE_SYSTEM_CONTROL中的IRP_MN_MOUNT_VOLUME的时候判断进入的deviceobject的名字,然后ZwQuerySymbolicLink得到他的连接名,然后判断就可以了。filemon是一个动态加载的驱动,他attach的动作就非常简单,找到设备指针,attach到设备栈就可以了,如果你可以保证他在设备栈的顶层,你还可以动态卸载,实乃居家旅行,杀人放火之必备驱动。
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
板凳#
发布于:2007-02-06 13:35
好的,谢谢你。我用FileMon的动态加载,似乎也可以了。方法是在SFilter的DriverEntry最后调用一个函数,里面实现Attach。

BOOLEAN Attach2C_Volume()
{
    UNICODE_STRING nameString;
    PDEVICE_OBJECT VolumeDeviceObject;
    PFILE_OBJECT fileObject;
    NTSTATUS ntStatus;
    PSFILTER_DEVICE_EXTENSION sfExtention;

    PDEVICE_OBJECT      fileSysDevice;
    IO_STATUS_BLOCK     ioStatus;
    HANDLE              ntFileHandle;  
    OBJECT_ATTRIBUTES   objectAttributes;

    PAGED_CODE();
    RtlInitUnicodeString( &nameString, L"\\DosDevices\\C:\\" );

    InitializeObjectAttributes( &objectAttributes, &nameString,
        OBJ_CASE_INSENSITIVE, NULL, NULL );
    ntStatus = ZwCreateFile( &ntFileHandle, SYNCHRONIZE|FILE_ANY_ACCESS,
        &objectAttributes, &ioStatus, NULL, 0, FILE_SHARE_READ|FILE_SHARE_WRITE,
        FILE_OPEN,
        FILE_SYNCHRONOUS_IO_NONALERT|FILE_DIRECTORY_FILE,
        NULL, 0 );

    if( !NT_SUCCESS( ntStatus ) )
    {
        //DbgPrint(("Filemon: Could not open drive %c: \n", 'C'+0));
        return FALSE;
    }

    DbgPrint(("Filemon:  opened the root directory!!! handle: %x\n", ntFileHandle));  

    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;
    }

    ntStatus = IoCreateDevice( gSFilterDriverObject,
        sizeof(SFILTER_DEVICE_EXTENSION),
        NULL,
        fileSysDevice->DeviceType,
        0,
        FALSE,
        &VolumeDeviceObject );
    if( !NT_SUCCESS(ntStatus) ) {
        ObDereferenceObject( fileObject );
        ZwClose( ntFileHandle );

        return FALSE;
    }

    VolumeDeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;

    sfExtention = VolumeDeviceObject->DeviceExtension;
    sfExtention->AttachedToDeviceObject = fileSysDevice;
    RtlInitUnicodeString(&sfExtention->DeviceName, sfExtention->DeviceNameBuffer);
    RtlCopyUnicodeString(&sfExtention->DeviceName, &nameString);

    ntStatus = IoAttachDeviceByPointer( VolumeDeviceObject, fileSysDevice );
    if( !NT_SUCCESS(ntStatus) )  
    {
        ObDereferenceObject( fileObject );
        ZwClose( ntFileHandle );

        return FALSE;
    }

    ObDereferenceObject( fileObject );

    ZwClose( ntFileHandle );
    return TRUE;
}
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
xx_qiang
驱动小牛
驱动小牛
  • 注册日期2004-07-30
  • 最后登录2017-02-27
  • 粉丝2
  • 关注1
  • 积分31分
  • 威望249点
  • 贡献值0点
  • 好评度171点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2007-02-06 13:55
你确定这种方法好用?你判断这个函数的返回值为false的时候,你的driverentry返回的是什么?你把sfilter得attach的函数都去掉了么?
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
地下室#
发布于:2007-02-08 11:10
可以用的,我在虚拟机xp系统上测试通过了的。返回false就不管了,attach失败,driverentry正常结束。
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
游客

返回顶部