阅读:2095回复:4
minifilter 读错误,要隐藏的加密头隐藏不了
加密头写在文件头部,但是不知道为什么,读的时候隐藏不了,写的时候就把加密头覆盖拉,麻烦高手解决,怎样才不读出加密头,而且我已经偏移拉,还能显示加密头的,为什么?代码如下:
FLT_PREOP_CALLBACK_STATUS NPPreRead ( __inout PFLT_CALLBACK_DATA CallbackData, __in PCFLT_RELATED_OBJECTS FltObjects, __deref_out_opt PVOID *CompletionContext ) { PFile_node node; PLARGE_INTEGER offset=NULL,filesize; ULONG readLen = CallbackData->Iopb->Parameters.Read.Length; PFILE_OBJECT file=CallbackData->Iopb->TargetFileObject ; offset = &CallbackData->Iopb->Parameters.Read.ByteOffset; do { if(readLen==0) { break; return FLT_PREOP_SUCCESS_NO_CALLBACK; } if(FLT_IS_FASTIO_OPERATION(CallbackData)) { return FLT_PREOP_DISALLOW_FASTIO; } AddLock(); node= NPIsFileNeedCrypt(file); //判断是否在加密表中 ReleaseLock(); if(node==NULL) { return FLT_PREOP_SUCCESS_NO_CALLBACK; } DbgPrint("读出前的长度为 %u",readLen); offset->QuadPart += CF_FILE_HEADER_SIZE; if (!FlagOn((IRP_PAGING_IO |IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE),CallbackData->Iopb->IrpFlags)) { DbgPrint("缓存读"); return FLT_PREOP_SUCCESS_NO_CALLBACK; } if(offset->LowPart == FILE_USE_FILE_POINTER_POSITION && offset->HighPart == -1) { KdBreakPoint(); } DbgPrint("读出前的偏移为 %D",&offset->QuadPart); FltSetCallbackDataDirty(CallbackData); }while(0); return FLT_PREOP_SUCCESS_WITH_CALLBACK; } FLT_POSTOP_CALLBACK_STATUS NPPostRead ( __inout PFLT_CALLBACK_DATA CallbackData, __in PCFLT_RELATED_OBJECTS FltObjects, __in_opt PVOID CompletionContext, __in FLT_POST_OPERATION_FLAGS Flags ) { PUCHAR buffer=NULL; ULONG i=0,length = CallbackData->IoStatus.Information; PLARGE_INTEGER offset=NULL; offset = &CallbackData->Iopb->Parameters.Read.ByteOffset; ASSERT(CallbackData->Iopb->Parameters.Read.MdlAddress != NULL || CallbackData->Iopb->Parameters.Read. ReadBuffer != NULL); if(CallbackData->Iopb->Parameters.Read.MdlAddress != NULL) buffer = MmGetSystemAddressForMdlSafe(CallbackData->Iopb->Parameters.Read.MdlAddress,NormalPagePriority); else buffer = CallbackData->Iopb->Parameters.Read.ReadBuffer; // 解密也很简单,xor 0x77 for(i=0;i<length;++i) { buffer ^= 0X77; DbgPrint("buffer[%d] 0x%d\n",i,buffer); } DbgPrint("读出后的长度为 %u",length); // 打印解密之后的内容 return FLT_POSTOP_FINISHED_PROCESSING; } |
|
沙发#
发布于:2010-05-15 10:45
....
你读取解密之后没有拷贝回原缓冲 |
|
板凳#
发布于:2010-05-15 11:41
能说明白点么?
// 解密也很简单,xor 0x77 for(i=0;i<length;++i) { buffer ^= 0X77; DbgPrint("buffer[%d] 0x%d\n",i,buffer); } DbgPrint("读出后的长度为 %u",length); 是不是要把 buffer 拷贝回原缓冲,还是怎么做啊? 请帮我修改一下,谢谢 |
|
地板#
发布于:2010-05-15 12:00
具体请参考WDK,minifilter里面的swapbuffer例子
|
|
地下室#
发布于:2010-05-15 12:04
在线等
|
|