阅读:3360回复:3
调试shenhui大侠word透明加密源代码的问题
加载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 ; } 对这一现象觉得很纳闷,希望大侠们给点解答和建议!! |
|
沙发#
发布于:2011-07-14 21:57
复杂,没有仔细看。看一下d盘有没有判断?估计是判断原因
|
|
|
板凳#
发布于:2011-07-15 08:55
回 1楼(znsoft) 的帖子
跟踪D盘,写文件保存的时候,在写函数里面发现pStreamCtx这个值没有获得,可是在别的盘里都能获得,为什么在D盘就不行呢?而且这个代码对每个电脑的反应不一样,有的能够加解密成功,有的又不行,在有的机子上加密标志只写一遍,有的机子又会写很多遍。。。。 |
|
地板#
发布于:2011-09-09 16:25
我在XP计算机上做测试的时候也了现加密标识被写多次的问题.
其根本在于文件标识内容在某种情况下被当成了文件的真实内容. |
|