chinasunjava
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2011-10-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1883回复:5

用于动态加解密的文件系统过滤驱动怎么样才不破坏原来文件系统?

楼主#
更多 发布于:2003-12-16 21:18
我改写了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驱动器上,有时候文件分配表被加密,有时候根目录又不对,这个盘上原来文件系统被破坏了。这显然不是我希望,我只想加密用户数据,不加密系统数据。不知道各位做过加密过滤驱动的大哥们有没有遇到这种情况?希望各位论坛大佬们帮忙看看,指点小弟一下。

最新喜欢:

ljmmaryljmmar...
des,aes,rsa,ecc,pki
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2003-12-16 21:54
在加密解密前对文件进行判断,你不会加密所有的文件吧??
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
fanxf
驱动牛犊
驱动牛犊
  • 注册日期2002-12-20
  • 最后登录2006-03-14
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-12-17 01:44
最容易的是在应用层进行加解密,当然必须让核心层驱动通知在什么时候.
chinasunjava
驱动牛犊
驱动牛犊
  • 注册日期2003-10-23
  • 最后登录2011-10-21
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-12-17 13:33
谢谢各位的回复。
我初步计划是要把盘上所有非系统的数据都以密文形式储存在硬盘上,至于加密特定文件夹或某种类型文件根据将来需要再做。
比如对文件分配表和根目录的读写,我就不想加解密。可以根据进程名来区分对分配表和根目录的读写IRP吗?或者有没有其他更好的办法。根据我的理解,FAT32分区下的根目录像一个普通文件,大小可以变化,如果不区分的话,对根目录的读写也会被拦截下来。
des,aes,rsa,ecc,pki
beiujm
驱动小牛
驱动小牛
  • 注册日期2005-11-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分983分
  • 威望129点
  • 贡献值0点
  • 好评度98点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-10-18 17:23
分析一下文件类型和名称
http://beiyu.bokee.com
abc13271552
驱动小牛
驱动小牛
  • 注册日期2007-08-13
  • 最后登录2023-12-05
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望552点
  • 贡献值0点
  • 好评度160点
  • 原创分0分
  • 专家分0分
  • 社区居民
5楼#
发布于:2007-10-19 10:59
加入过滤的,
在filemon中, fullPathName是当前操作的文件名,在Create中有效,
你要处理它就要把家的FsContext记录下来,在别的例程中处理.
驱网无线,快乐无限
游客

返回顶部