参考091221-禁止建立,读写,删除,改名文件
发布日期:2021-06-30 22:08:15 浏览次数:2 分类:技术文章

本文共 3736 字,大约阅读时间需要 12 分钟。

弄了好久,才开始对filemon有点理解。今天调试过程中遇到三个问题,请各位大牛解答一下

1.应用程序运行后,驱动加载了,我在DebugView里可以看到调试信息输出,可是为什么在服务管理器里没有FILEMON的服务存在?
2.如果驱动文件sys有更新了,我退出应用程序,然后把sys替换掉,再次运行程序,好象没有加载最新的驱动文件,必须重启机才行呀?
3.我现在想禁止创建新文件,禁止读写文件,禁止删除/重命名文件,禁止访问文件目录。现在禁止删除/重命名文件可以完全实现,但是禁止创建新文件,禁止读写文件的代码会死机。禁止访问文件目录的代码该怎么实现呢?
创建文件操作:在IRP_MJ_CREATE下判断是否为FILE_CREATE或者FILE_OPEN_IF或者FILE_OVERWRITE_IF。//总是重启
读文件:IRP_MJ_READ  //总是重启
写文件:IRP_MJ_WRITE  //总是重启
删除文件:IRP_MJ_SET_INFORMATION下判断FileRenameInformation或者FileDispositionInformation //运行良好
禁止访问目录:不知道该识别哪个IRP
代码如下:
case IRP_MJ_CREATE:
            hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL,
                              "%s/tIRP_MJ_CREATE/t%s/tAttributes: %s Options: %s",
                              name, fullPathName,CreateAttributesString( currentIrpStack->Parameters.Create.FileAttributes,attributeString ),
                              CreateOptionsString( currentIrpStack->Parameters.Create.Options,optionString )); 
   
            nvalue = (currentIrpStack->Parameters.Create.Options >> 24)&0xFF;
DbgPrint(("filemon nvalue=%d",nvalue));;
if(nvalue==FILE_CREATE||nvalue==FILE_OPEN_IF ||nvalue==FILE_OVERWRITE_IF)  //***判断是否为创建文件,如果是的,返回STATUS_ACCESS_DENIED
{
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
// If its an open-by-id we free the hash entry now so that on the next access to
            // the file we'll pick up the file's real name.           
            if( currentIrpStack->Parameters.Create.Options & FILE_OPEN_BY_FILE_ID )
    {
                FilemonFreeHashEntry( FileObject );
            }
            break;
case IRP_MJ_READ:           
if( FilterDef.logreads ) {
hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL,
"%s/tIRP_MJ_R_lower%c/t%s/tOffset: %d Length: %d",
name, (Irp->Flags & IRP_PAGING_IO) || (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) ? '*' : ' ',
fullPathName, currentIrpStack->Parameters.Read.ByteOffset.LowPart,
currentIrpStack->Parameters.Read.Length );
}
DbgPrint(("Read1 zhm forbit"));; //***IRP_MJ_READ,禁止读文件,返回STATUS_ACCESS_DENIED
        Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
case IRP_MJ_WRITE:
if( FilterDef.logreads ) {
hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL,
"%s/tIRP_MJ_W_lowlow%c/t%s/tOffset: %d Length: %d",
name,(Irp->Flags & IRP_PAGING_IO) ||
(Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) ? '*' : ' ',
fullPathName,currentIrpStack->Parameters.Write.ByteOffset.LowPart,
currentIrpStack->Parameters.Write.Length );
}
DbgPrint(("write1 zhm forbit"));; //***IRP_MJ_WRITE,禁止写文件,返回STATUS_ACCESS_DENIED
Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
case IRP_MJ_SET_INFORMATION:
        hookCompletion = LogRecord( TRUE, &seqNum, &dateTime, NULL,
                          "%s/tIRP_MJ_SET_INFORMATION%c/t%s/t%s", name,
                                      (Irp->Flags & IRP_PAGING_IO) ||(Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) ? '*' : ' ',
                                      fullPathName, FileInformation[currentIrpStack->Parameters.SetFile.FileInformationClass] );
           
            if( (strcmp(FileInformation[currentIrpStack->Parameters.SetFile.FileInformationClass],"FileRenameInformation")==0)
|| (strcmp(FileInformation[currentIrpStack->Parameters.SetFile.FileInformationClass],"FileDispositionInformation")==0)
      ) //***禁止删除文件,返回STATUS_ACCESS_DENIED
{
DbgPrint(("Set_Information %s",FileInformation[currentIrpStack->Parameters.SetFile.FileInformationClass]));;
                Irp->IoStatus.Status = STATUS_ACCESS_DENIED;
Irp->IoStatus.Information = 0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
            // If its a rename, cleanup the name association.
  if( currentIrpStack->Parameters.SetFile.FileInformationClass ==FileDispositionInformation ) {
                FilemonFreeHashEntry( FileObject );
            }
            break;

转载地址:https://lostspeed.blog.csdn.net/article/details/5045447 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:C++运行时类型识别
下一篇:计算以2为底的log

发表评论

最新留言

网站不错 人气很旺了 加油
[***.192.178.218]2024年04月25日 23时19分08秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章