fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
阅读:2764回复:18

禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文件???

楼主#
更多 发布于:2005-04-13 11:45
采用文件过滤驱动对请求返回STATUS_ACCESS_DENIED,实现了禁止删除文件。

现在碰到一个问题,就是冰刃(IceSword)删除文件根本就不产生IRP_MJ_SET_INFORMATION请求,直接一个IRP_MJ_CLEANUP就把文件删除掉了。

请问哪位知道IcesSword删除文件的原理,该如何禁止它对文件删除的操作呢?

谢谢!!

最新喜欢:

threebagsthreeb...
在交流中学习。。。
riceworm
驱动小牛
驱动小牛
  • 注册日期2004-10-27
  • 最后登录2008-10-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-14 09:42
怎么会有这种事?关注
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-04-14 10:12
昨天在网上看了eva发的关于拿Icesword出气的帖子,大概有个了解,但是还是没有很好的办法来解决问题。基于IRP过滤和Native API Hook实现的文件保护和进程保护对于Icesword来说,没有任何意义的。
在交流中学习。。。
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
地板#
发布于:2005-04-14 17:25
它是直接向fsd发irp,所以在上面的东东无效
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-04-15 10:40
它是直接向fsd发irp,所以在上面的东东无效

我认为Icesword的驱动Detport.sys也应该是一个文件过滤驱动吧,莫非它在过滤驱动堆栈的最底层,可以绕过所有其它的过滤驱动?

还有,通过hook ZwTerminateProcess来保护了特定进程,一般的工具的kill操作可以被禁止,但这个对于icesword是无效的,哪位知道它是如何处理的?
在交流中学习。。。
duanran
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2015-03-20
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望57点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-04-15 23:01
ICESWORD应该是终止进程中的所有线程,来实现进程的终止的。
不过如果碰上系统线程,或某些用户线程进入内核态后挂在核心态,这样的线程ICESWORD是无法终止的。
kernel_kernel
驱动小牛
驱动小牛
  • 注册日期2002-12-08
  • 最后登录2009-02-06
  • 粉丝0
  • 关注0
  • 积分435分
  • 威望51点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-16 13:59
ICESWORD应该是终止进程中的所有线程,来实现进程的终止的。
不过如果碰上系统线程,或某些用户线程进入内核态后挂在核心态,这样的线程ICESWORD是无法终止的。


应该是?看了pjf那篇帖子随便猜的吧:D
我想不是

试过icesword1.06强制终止系统线程没有?不过试了试好像
核心态挂起的线程弄不掉,当然这种线程已经什么事都不能做,
跟死线程一样
 
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
7楼#
发布于:2005-04-19 17:11
icesword就是pjf开发的嘛.hehe
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2005-04-20 11:54
既然他是直接发IRP的,那么你用标准的过滤就没用了.
但你可以直接挂钩文件系统的DISPATCH例程,这样只要发往,FASTFAT,NTFS,CDFS的IRP,你都拦截还怕不行????
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-04-25 10:48
既然他是直接发IRP的,那么你用标准的过滤就没用了.
但你可以直接挂钩文件系统的DISPATCH例程,这样只要发往,FASTFAT,NTFS,CDFS的IRP,你都拦截还怕不行????


用修订版试了,不行
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2005-04-26 11:20
[quote]既然他是直接发IRP的,那么你用标准的过滤就没用了.
但你可以直接挂钩文件系统的DISPATCH例程,这样只要发往,FASTFAT,NTFS,CDFS的IRP,你都拦截还怕不行????


用修订版试了,不行
 [/quote]

删除文件还有可能是在打开文件的时候指定了delete_on_close标志,所以还需要处理IRP_CREATE,加上这个试试
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2005-04-26 13:43
[quote][quote]既然他是直接发IRP的,那么你用标准的过滤就没用了.
但你可以直接挂钩文件系统的DISPATCH例程,这样只要发往,FASTFAT,NTFS,CDFS的IRP,你都拦截还怕不行????


用修订版试了,不行
 [/quote]

删除文件还有可能是在打开文件的时候指定了delete_on_close标志,所以还需要处理IRP_CREATE,加上这个试试 [/quote]

不是这样的,根本没有请求包通过我的驱动
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2005-04-26 15:52
你直接替换文件系统的dispatch routine,试了吗
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2005-04-26 16:06
你直接替换文件系统的dispatch routine,试了吗

试了,对修订版
tooflat
论坛版主
论坛版主
  • 注册日期2002-07-08
  • 最后登录2014-03-11
  • 粉丝2
  • 关注0
  • 积分1007分
  • 威望551点
  • 贡献值3点
  • 好评度476点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-04-26 17:15
能放一个icesword 修订版上来吗
violin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-02
  • 最后登录2009-08-22
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望83点
  • 贡献值0点
  • 好评度41点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-04-26 17:44
能放一个icesword 修订版上来吗


就在作者blog上呀

http://www.blogcn.com/user17/pjf/blog/20444415.html


[编辑 -  4/27/05 by  violin]
SafeArrow
驱动牛犊
驱动牛犊
  • 注册日期2004-08-08
  • 最后登录2009-04-09
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-06-21 16:16
有进展吗啊?
carwin
驱动牛犊
驱动牛犊
  • 注册日期2007-05-27
  • 最后登录2010-03-15
  • 粉丝0
  • 关注0
  • 积分304分
  • 威望71点
  • 贡献值0点
  • 好评度30点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-05-29 20:58
Re:禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文
确实,直接挂Dispatch还是不能挂到irp包,难道它是直接发到ftdisk的吗?
那的irp包根本不一样了。
test001
驱动小牛
驱动小牛
  • 注册日期2006-11-12
  • 最后登录2008-11-07
  • 粉丝0
  • 关注0
  • 积分990分
  • 威望170点
  • 贡献值0点
  • 好评度169点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-05-29 22:44
引用第0楼fslife于2005-04-13 11:45发表的 禁止IRP_MJ_SET_INFORMATION无效,如何禁止IceSword删除文件??? :
采用文件过滤驱动对请求返回STATUS_ACCESS_DENIED,实现了禁止删除文件

现在碰到一个问题,就是冰刃(IceSword)删除文件根本就不产生IRP_MJ_SET_INFORMATION请求,直接一个IRP_MJ_CLEANUP就把文件删除掉了。

请问哪位知道IcesSword删除文件的原理,该如何禁止它对文件删除的操作呢?
.......


fslife大侠,你好!
你实现的禁止删除文件的方法是什么样的?
能否帮我看看我的代码?谢谢!
NTSTATUS
SfCreate (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp)
{
  NTSTATUS status;
  KEVENT waitEvent;  
  PUNICODE_STRING name;
  GET_NAME_CONTROL nameControl;
  int cmpresult;
  PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation( Irp );
  wchar_t* testmyProtectPath = L"\\Device\\HarddiskVolume1\\user\\";    

    PAGED_CODE();
    if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
    {
    Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;        
        IoCompleteRequest( Irp, IO_NO_INCREMENT );        
        return STATUS_SUCCESS;
    }
    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

    /////////////////////////////////////////////////////////////////////////////////////////
    KeInitializeEvent( &waitEvent, NotificationEvent, FALSE );
    IoCopyCurrentIrpStackLocationToNext( Irp );
    IoSetCompletionRoutine(Irp,SfCreateCompletion,&waitEvent,TRUE,TRUE,TRUE );
    status = IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp );
    name = SfGetFileName( irpSp->FileObject, Irp->IoStatus.Status, &nameControl );
    cmpresult = wcsncmp(name->Buffer, testmyProtectPath,wcslen(testmyProtectPath));
    if(cmpresult == 0)
    {
        if( (irpSp->FileObject != NULL) &&(irpSp->FileObject->FileName.Buffer != NULL) &&(wcsstr(irpSp->FileObject->FileName.Buffer, L"新建") != NULL) )
        {
            DbgPrint("==================当前是一个新建文件的操作!!!======================\n");
            Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
            Irp->IoStatus.Information = 0;
            IoCompleteRequest(Irp, IO_NO_INCREMENT);
            return STATUS_ACCESS_DENIED;
        }
    }
    
    //////////////////////////////////////////////////////////////////////////////////////////

    if (STATUS_PENDING == status)
    {
        NTSTATUS localStatus = KeWaitForSingleObject(&waitEvent, Executive, KernelMode, FALSE, NULL);
        ASSERT(STATUS_SUCCESS == localStatus);
    }

    ASSERT(KeReadStateEvent(&waitEvent) || !NT_SUCCESS(Irp->IoStatus.Status));

    if (FlagOn(SfDebug, (SFDEBUG_GET_CREATE_NAMES|SFDEBUG_DISPLAY_CREATE_NAMES)))
    {
        SfDisplayCreateFileName( Irp );
    }
    status = Irp->IoStatus.Status;
    IoCompleteRequest( Irp, IO_NO_INCREMENT );
    return status;
}


NTSTATUS
SfCreateCompletion (IN PDEVICE_OBJECT DeviceObject,IN PIRP Irp,IN PVOID Context)
{
    PKEVENT event = Context;

    UNREFERENCED_PARAMETER( DeviceObject );
    UNREFERENCED_PARAMETER( Irp );

    ASSERT(IS_MY_DEVICE_OBJECT( DeviceObject ));

    KeSetEvent(event, IO_NO_INCREMENT, FALSE);

    return STATUS_MORE_PROCESSING_REQUIRED;
}

这段代码是在sfilter的基础上修改的,驱动加载后,会出现以下的问题:
(1)在指定的文件夹新建文件夹时,系统也提示“无法创建文件夹,拒绝访问”,但是系统还是会新建文件夹,而且新建的文件夹无法访问;
(2)在指定的文件夹新建文件时,系统也提示“无法创建文件,文件存在”,但是系统还是会999个新建文件,而且新建的文件无法访问。
  不知道是什么原因?
  期待你的解答!!!
游客

返回顶部