fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1677回复:3

看了寒江独钓的透明加密的一点想法,望各位指点

楼主#
更多 发布于:2009-08-17 20:12
书中代码没问题,但并没有实现修改加密,我想改进一下
思路是:对于原来的文件,同样是在有写意愿时,在IRP_MJ_CREATE的预处理中,将原来的数据往后移动4K(标记长度)
然后在原文件的起始处添加标记4K,同时设置需要进行后处理的标记,传递下去,把刚才的文件,加入到加密表中
大概思路就这样,对于小于4K的文件,现在测试成功,对于大于4K的文件,非常不稳定,有时行,有时不行
望大侠们指点,谢谢

最新喜欢:

arbelarbel wyherowyhero
fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2009-08-17 20:17
我使用的是从前往后移动的方法,代码如下:

NTSTATUS
cfLargeFileInsertHeader(PDEVICE_OBJECT  next_dev,                            
                            PFILE_OBJECT    file,                                          LARGE_INTEGER   orig_file_size) //原来的文件长度
{
        LARGE_INTEGER ReadOffset,WriteOffset;
        ULONG length,totallength=0;
        NTSTATUS status=STATUS_SUCCESS;        
        BOOLEAN EndofFile=FALSE;

        ReadOffset.QuadPart=WriteOffset.QuadPart=0;

        length=CF_FILE_HEADER_SIZE;//读出第一块    
        memset(&ReadData,0,sizeof(ReadData));
        status=cfFileReadWrite(next_dev,file,&ReadOffset,&length,ReadData.Data,TRUE);
        if(!NT_SUCCESS(status))
        {            
            KdPrint(("cfFileInserHeader read data,Error %x\n",status));            
            ASSERT(FALSE);    
            return status;                
        }    
        //这里status 等于success的
        if(length!=CF_FILE_HEADER_SIZE)        
        {                    
            //第一次读,文件的长度本来是大于CF_FILE_HEADER_SIZE的,但是没有读到这么长,错误            
            KdPrint(("cfFileInserHeader read data not complete,Error %x\n",status));                    
            ASSERT(FALSE);                
            return status;            
        }
        ReadData.len=length;
        totallength+=length;


        //保存前一块的内容
        RtlCopyMemory(&WriteData,&ReadData,sizeof(ReadData));
        
        length=CF_FILE_HEADER_SIZE;
        status=cfFileReadWrite(next_dev,
                               file,
                               &WriteOffset,
                               &length,    
                               header_flags,    //写上标记
                               FALSE);          //写                
        if(!NT_SUCCESS(status))            
        {                                
            KdPrint(("cfFileInserHeader second write ,Error %x\n",status));                    
            ASSERT(FALSE);        
            return status;    
        }                
    
        ReadOffset.QuadPart+=length;
        WriteOffset.QuadPart+=length;


        //长度大于4K的
        while(ReadOffset.QuadPart<orig_file_size.QuadPart)
        {                
            memset(&ReadData,0,sizeof(ReadData));

            if(totallength+CF_FILE_HEADER_SIZE<=orig_file_size.QuadPart)
            {
                length=CF_FILE_HEADER_SIZE;//每次读的长度
            }
            else
            {
                length=(ULONG)orig_file_size.QuadPart-totallength;
                EndofFile=TRUE;
            }
            
            status=cfFileReadWrite(next_dev,
                                   file,
                                   &ReadOffset,
                                   &length,
                                   ReadData.Data,
                                   TRUE);        //读
            if(!NT_SUCCESS(status))
            {            
                KdPrint(("cfFileInserHeader read data,Error %x\n",status));            
                ASSERT(FALSE);    
                return status;                
            }
            ReadData.len=length;
            totallength+=length;

            if(length==0)
                break;

            status=cfFileReadWrite(next_dev,
                                   file,
                                   &WriteOffset,
                                   &WriteData.len,   //写的长度是上次读的长度
                                   WriteData.Data,     //写上一次的数据
                                   FALSE);             //写
            if(!NT_SUCCESS(status))
            {                    
                KdPrint(("cfFileInserHeader first write ,Error %x\n",status));
                ASSERT(FALSE);
                return status;
            }
            
            RtlCopyMemory(&WriteData,&ReadData,sizeof(ReadData));
            
            ReadOffset.QuadPart+=length;
            WriteOffset.QuadPart+=length;
        
            if(EndofFile)
                break;
        }
        
        status=cfFileReadWrite(    next_dev,
                                   file,
                                   &WriteOffset,
                                   &WriteData.len,    //写的长度是上次读的长度
                                   WriteData.Data,      //写上一次的数据
                                   FALSE);              //写
        
        if(!NT_SUCCESS(status))        
        {                    
                KdPrint(("cfFileInserHeader first write ,Error %x\n",status));
                ASSERT(FALSE);
                return status;        
        }

        return status;
}
confused_ddk
驱动牛犊
驱动牛犊
  • 注册日期2009-04-16
  • 最后登录2011-02-16
  • 粉丝0
  • 关注0
  • 积分25分
  • 威望221点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-18 15:16
There are many reasons can crash your fragile codes, such as cache/memory file etc., try to search why on osr's list.

http://www.osronline.com/showlists.cfm?list=ntfsd
fancylf
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2016-06-21
  • 粉丝1
  • 关注0
  • 积分61分
  • 威望501点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
  • 社区居民
地板#
发布于:2009-08-18 16:37
引用第2楼confused_ddk于2009-08-18 15:16发表的  :
There are many reasons can crash your fragile codes, such as cache/memory file etc., try to search why on osr's list.

http://www.osronline.com/showlists.cfm?list=ntfsd

Thanks very much for your kind answers,and I will follow your advice,trying to resolve the problems.
游客

返回顶部