Panel 发表于 2024-7-13 17:05

透明加解密prewrite该如何处理

本帖最后由 Panel 于 2024-7-13 17:15 编辑

我在透明加解密实现的prewrite时,如果我对非机密进程进行了拦截,那么将导致整个文件保存后内容消失,通过debug发现是每次写的时候内容是:原文件内容+新写入的内容。请教有类似经验的人指点讨论,代码在下方

```c
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    PFILE_STREAM_CONTEX pFileStreamContex = NULL;
    PCALLBACK_CONTEX pCallBackContex = NULL;
    PUCHAR pWriteBuffer = NULL;
    ULONG uNewWriteLocation = 0;
    ULONG uNewWriteLen = 0;
    LARGE_INTEGER largeWriteOffset = { 0 };
    LONGLONG llFileSize = 0;


    llFileSize = QueryFileSize(FltObjects->Instance, FltObjects->FileObject);

    if (-1 == llFileSize)
    {
      return FLT_PREOP_COMPLETE;
    }

    //没有流则代表是非机密文件,所以我们直接放行
    status = FltGetStreamContext(FltObjects->Instance,FltObjects->FileObject,&pFileStreamContex);

    //没有流就可以初步证明不是机密文件
    if (!NT_SUCCESS(status))
    {
      return FLT_PREOP_SUCCESS_WITH_CALLBACK;
    }
   
    //非机密文件
    if (!pFileStreamContex->bIsCiphertext)
    {
      FltReleaseContext(pFileStreamContex);
      return FLT_PREOP_SUCCESS_WITH_CALLBACK;
    }

    //我们只能处理以下三种
    if (!BooleanFlagOn(Data->Iopb->IrpFlags, (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
      FltReleaseContext(pFileStreamContex);
      Data->IoStatus.Status = STATUS_SUCCESS;
      Data->IoStatus.Information = llFileSize;
      return FLT_PREOP_COMPLETE;
    }

    //是机密文件我们才禁用
    if (FLT_IS_FASTIO_OPERATION(Data))
    {
      FltReleaseContext(pFileStreamContex);
      return FLT_PREOP_DISALLOW_FSFILTER_IO;
    }

   
    //不是机密进程在操作机密文件,我们直接拒绝操作也就是此时拒绝后导致文件内容为空
    if (!pFileStreamContex->bIsSecProcess)
    {
      FltReleaseContext(pFileStreamContex);
      Data->IoStatus.Status = STATUS_SUCCESS;
      Data->IoStatus.Information = llFileSize;
      return FLT_PREOP_COMPLETE;
    }
```


捷豹网络丶贱仔 发表于 2024-7-13 21:16

Panel 发表于 2024-7-13 22:10

捷豹网络丶贱仔 发表于 2024-7-13 21:16
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext...

谢谢前辈,你这份代码我之前的思路也是一样,但是一直测试发现我读的长度超过512就一直失败,所以没有采用,今天重写写了一份之后发现可以了,只不过我使用的是FltAllocatePoolAlignedWithTag{:1_893:}

Panel 发表于 2024-7-13 22:16

捷豹网络丶贱仔 发表于 2024-7-13 21:16
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext...

目前发现如果出发多次写操作的话,只能成功FltRead成功一次(内容长度512,测试扇区对齐值也是512)

捷豹网络丶贱仔 发表于 2024-7-13 23:06

willgoon 发表于 2024-7-14 13:15

感谢两位大佬分享的源码

Panel 发表于 2024-7-14 15:26

捷豹网络丶贱仔 发表于 2024-7-13 23:06
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContex ...

感谢分享

yoga2joker 发表于 2024-7-14 21:10

感谢分享
页: [1]
查看完整版本: 透明加解密prewrite该如何处理