lijizhong619
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2012-06-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1951回复:4

minifilter 读错误,要隐藏的加密头隐藏不了

楼主#
更多 发布于:2010-05-14 22:42
加密头写在文件头部,但是不知道为什么,读的时候隐藏不了,写的时候就把加密头覆盖拉,麻烦高手解决,怎样才不读出加密头,而且我已经偏移拉,还能显示加密头的,为什么?代码如下:

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;
}
crazy4stef
驱动牛犊
驱动牛犊
  • 注册日期2008-08-24
  • 最后登录2016-01-09
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望425点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-15 10:45
....

你读取解密之后没有拷贝回原缓冲
lijizhong619
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2012-06-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于: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  拷贝回原缓冲,还是怎么做啊?
请帮我修改一下,谢谢
crazy4stef
驱动牛犊
驱动牛犊
  • 注册日期2008-08-24
  • 最后登录2016-01-09
  • 粉丝2
  • 关注0
  • 积分42分
  • 威望425点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2010-05-15 12:00
具体请参考WDK,minifilter里面的swapbuffer例子
lijizhong619
驱动牛犊
驱动牛犊
  • 注册日期2009-03-12
  • 最后登录2012-06-04
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望321点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2010-05-15 12:04
在线等
游客

返回顶部