mengyuxin520
论坛版主
论坛版主
  • 注册日期2010-11-01
  • 最后登录2011-07-28
  • 粉丝9
  • 关注12
  • 积分306分
  • 威望451点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3360回复: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 ;
}
对这一现象觉得很纳闷,希望大侠们给点解答和建议!!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2011-07-14 21:57
复杂,没有仔细看。看一下d盘有没有判断?估计是判断原因
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
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盘就不行呢?而且这个代码对每个电脑的反应不一样,有的能够加解密成功,有的又不行,在有的机子上加密标志只写一遍,有的机子又会写很多遍。。。。
lzh_zhb
驱动牛犊
驱动牛犊
  • 注册日期2010-03-12
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分38分
  • 威望381点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2011-09-09 16:25
我在XP计算机上做测试的时候也了现加密标识被写多次的问题.
其根本在于文件标识内容在某种情况下被当成了文件的真实内容.
游客

返回顶部