阅读:1882回复:5
用于动态加解密的文件系统过滤驱动怎么样才不破坏原来文件系统?
我改写了filemon用于文件动态加解密。主要改动如下:
case IRP_MJ_WRITE: pContext->MdlAddress=Irp->MdlAddress; pContext->UserBuffer=Irp->UserBuffer; pContext->MemLock=FALSE;保存IRP原有地址 if(irp->MdlAddress) { if(irp->Flags&IRP_NOCACHE) { OriginBuffer = (PCHAR)MmGetSystemAddressForMdl(Irp->MdlAddress); BufferSize = MmGetMdlByteCount(Irp->MdlAddress); ReplaceBuffer = (PCHAR)ExAllocatePool(NonPagedPool, BufferSize); RtlCopyMemory(ReplaceBuffer,OriginBuffer, BufferSize); 加密replacebuffer; pContext->ReplaceBuffer=ReplaceBuffer; Irp->MdlAddress = NULL; pMDL=IoAllocateMdl(ReplaceBuffer, BufferSize, FALSE, FALSE, Irp); MmBuildMdlForNonPagedPool(pMDL); Irp->UserBuffer=MmGetMdlVirtualAddress(pMDL); pContext->MemLock=TRUE; } } 设置完成例程; call 下层驱动; 在完成例程里面 if(IrpSp->MajorFunction==IRP_MJ_READ) { DbgPrint ((\"Filemon: Decrypt_READ\\n\")); if(Irp->Flags & IRP_NOCACHE) { if(Irp->MdlAddress) { pBuffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority); DataByteLength = MmGetMdlByteCount(Irp->MdlAddress); 解密pBuffer里面的内容; } } if(IrpSp->MajorFunction==IRP_MJ_WRITE) { if((Irp->MdlAddress) && (pContext->MemLock)) { IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress=pContext->MdlAddress; Irp->UserBuffer=pContext->UserBuffer; ExFreePool(pContext->ReplaceBuffer);恢复原有的IRP信息 } } 当把这个过滤驱动挂到某个FAT32驱动器上,有时候文件分配表被加密,有时候根目录又不对,这个盘上原来文件系统被破坏了。这显然不是我希望,我只想加密用户数据,不加密系统数据。不知道各位做过加密过滤驱动的大哥们有没有遇到这种情况?希望各位论坛大佬们帮忙看看,指点小弟一下。 |
|
最新喜欢:![]()
|
沙发#
发布于:2003-12-16 21:54
在加密解密前对文件进行判断,你不会加密所有的文件吧??
|
|
|
板凳#
发布于:2003-12-17 01:44
最容易的是在应用层进行加解密,当然必须让核心层驱动通知在什么时候.
|
|
地板#
发布于:2003-12-17 13:33
谢谢各位的回复。
我初步计划是要把盘上所有非系统的数据都以密文形式储存在硬盘上,至于加密特定文件夹或某种类型文件根据将来需要再做。 比如对文件分配表和根目录的读写,我就不想加解密。可以根据进程名来区分对分配表和根目录的读写IRP吗?或者有没有其他更好的办法。根据我的理解,FAT32分区下的根目录像一个普通文件,大小可以变化,如果不区分的话,对根目录的读写也会被拦截下来。 |
|
|
地下室#
发布于:2007-10-18 17:23
分析一下文件类型和名称
|
|
|
5楼#
发布于:2007-10-19 10:59
加入过滤的,
在filemon中, fullPathName是当前操作的文件名,在Create中有效, 你要处理它就要把家的FsContext记录下来,在别的例程中处理. |
|
|