mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3131回复:3

调试shenhui大侠word透明加密源代码的问题

楼主#
更多 发布于:2011-07-14 19:28
加载shenhui大侠的源代码对word透明加密时,发现有一些问题:
1、加密标志会写入文件好几遍。只有在写第一遍的时候,文件的有效长度是正确的,对这一现象觉得很纳闷,为什么加密标志会重复的写入文件呢?
2、为什么同样的代码,有的机子加解密是成功的,而有的机子缺总是失败呢?
3、在加解密的时候,对D盘的文件却没有作用?(不管是哪一台机子的D盘)
另外用windbg调试的时候,在关闭文件进行写标志的时候,跟踪到写标志的函数里,却发现pStreamCtx->FileValidLength.QuadPart这个值出错了,而通过File_GetFileSize这个函数得到的文件大小貌似又是文件的实际长度,而且在写加密标志之前,pStreamCtx->FileValidLength.QuadPart这个值是正确的啊,为什么在写加密标志时,这个值突然变化了呢?可是却找不到在哪里出错的,也不知道是什么原因。。。。。
贴出写标志的代码:

NTSTATUS
File_WriteFileFlag(
       __in  PFLT_CALLBACK_DATA Data,
       __in  PFLT_RELATED_OBJECTS FltObjects,
       __in  PFILE_OBJECT FileObject,
       __in  PSTREAM_CONTEXT pStreamCtx
       )
{
    NTSTATUS status = STATUS_SUCCESS ;
    LARGE_INTEGER ByteOffset = {0} ;
    LARGE_INTEGER FileSize = {0} ;
    ULONG BytesWritten = 0 ;
    ULONG writelen = sizeof(FILE_FLAG) ;
    PFILE_FLAG psFileFlag = NULL ;


    try{


        File_GetFileSize(Data, FltObjects, &FileSize) ;


              //allocate local file flag buffer
        psFileFlag = (PFILE_FLAG)ExAllocatePoolWithTag(NonPagedPool, FILE_FLAG_LENGTH, FILEFLAG_POOL_TAG) ;
        if (NULL == psFileFlag)
        {
            status = STATUS_INSUFFICIENT_RESOURCES ;
            __leave ;
        }
        RtlCopyMemory(psFileFlag, g_psFileFlag, FILE_FLAG_LENGTH) ; //实际上这里应该是当前文件自身的flag


              //set current file size into file flag buffer
        psFileFlag->FileValidLength=  pStreamCtx->FileValidLength.QuadPart ;
        FileSize.QuadPart = pStreamCtx->FileValidLength.QuadPart ;


        //calculate padded file size
        if (FileSize.QuadPart % SECTOR_SIZE)
        {//file size is not multiply of sector size
            FileSize.QuadPart = FileSize.QuadPart + (SECTOR_SIZE - FileSize.QuadPart % SECTOR_SIZE) + FILE_FLAG_LENGTH ;
        }
        else
        {//file size is multiply of sector size
            FileSize.QuadPart += FILE_FLAG_LENGTH ;
        }


        RtlCopyMemory(psFileFlag->FileKeyHash, pStreamCtx->szKeyHash, HASH_SIZE) ;


        //write file flag into file trail
        ByteOffset.QuadPart = FileSize.QuadPart - FILE_FLAG_LENGTH ;
        status = File_ReadWriteFile(
                    IRP_MJ_WRITE,
                    FltObjects->Instance,
                    FileObject,
                    &ByteOffset,
                    FILE_FLAG_LENGTH,
                    psFileFlag,
                    &BytesWritten,
                    FLTFL_IO_OPERATION_NON_CACHED|FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET) ;
    }
    finally{    
        
    }


    return status ;
}
对这一现象觉得很纳闷,希望大侠们给点解答和建议!!
mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2011-07-15 08:55
回 1楼(znsoft) 的帖子
跟踪D盘,写文件保存的时候,在写函数里面发现pStreamCtx这个值没有获得,可是在别的盘里都能获得,为什么在D盘就不行呢?而且这个代码对每个电脑的反应不一样,有的能够加解密成功,有的又不行,在有的机子上加密标志只写一遍,有的机子又会写很多遍。。。。
游客

返回顶部