本帖最后由 Panel 于 2024-7-13 17:15 编辑
我在透明加解密实现的prewrite时,如果我对非机密进程进行了拦截,那么将导致整个文件保存后内容消失,通过debug发现是每次写的时候内容是:原文件内容+新写入的内容。请教有类似经验的人指点讨论,代码在下方
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;
}
|