书中代码没问题,但并没有实现修改加密,我想改进一下
思路是:对于原来的文件,同样是在有写意愿时,在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期)