透明加解密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
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext...
谢谢前辈,你这份代码我之前的思路也是一样,但是一直测试发现我读的长度超过512就一直失败,所以没有采用,今天重写写了一份之后发现可以了,只不过我使用的是FltAllocatePoolAlignedWithTag{:1_893:} 捷豹网络丶贱仔 发表于 2024-7-13 21:16
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext...
目前发现如果出发多次写操作的话,只能成功FltRead成功一次(内容长度512,测试扇区对齐值也是512) 感谢两位大佬分享的源码 捷豹网络丶贱仔 发表于 2024-7-13 23:06
NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContex ...
感谢分享 感谢分享
页:
[1]