首页
社区
课程
招聘
[求助]看了寒江独钓的透明加密的一点想法,望大牛指点,附源码
发表于: 2009-8-18 16:31 6124

[求助]看了寒江独钓的透明加密的一点想法,望大牛指点,附源码

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

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;
}

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 186
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
no response?>!
2009-9-4 15:27
0
雪    币: 8835
活跃值: (2404)
能力值: ( LV12,RANK:760 )
在线值:
发帖
回帖
粉丝
3
这就是策略问题啦~
也就是所谓细节的问题,嗯,等有时间把ntfs上寒江cryptfile的代码弄弄
2009-9-5 02:35
0
雪    币: 117
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
你应该还是针对txt的吧,txt的好弄,word有点麻烦。
2009-9-8 18:01
0
雪    币: 117
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
另外这种方法仅仅去txt有效
2009-9-8 18:02
0
游客
登录 | 注册 方可回帖
返回
//