wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:3076回复:16

关于文件加密,读写的问题,请指教!!!!!(高分)

楼主#
更多 发布于:2003-06-10 15:08
各位大侠,我用filedisk虚拟出一个分区,用filespy做上层过滤。在filespy里面加了一点点代码,添加了IRP_MJ_READ、IRP_MJ_WRITE处理例程,分别为SpyRead、SpyWrite。目的是在写入加密,在读出时解密,可是现在读的时候时常会把密文读出来。感觉是读文件的IRP_MJ_READ捕获不到,可是有时又是正确的,在虚拟分区的文件中存储的确实取反了。痛苦了好几天,看了以前的帖子,也是各有各的说法,还请各位大侠搭救。是因为读的内容在cache中吗?写的时候用现有的缓冲区,还是新建一个缓冲区?这个如果都搞不定,下面的取文件名,分组加密,调加密卡算法......想着就头大。


typedef struct _DOWN_TRANSFER{
BOOLEAN  MemLock;
PMDL    MdlAddress;
PVOID    UserAddress;
} DOWN_TRANSFER, *PDOWN_TRANSFER;

 
NTSTATUS
SpyRead(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{

PCHAR               pBuffer;
ULONG               Length;
int                 i ;
PDOWN_TRANSFER       yang;

PDEVICE_EXTENSION DeviceExtention = DeviceObject ->DeviceExtension;
PIO_STACK_LOCATION IrpCurStack = IoGetCurrentIrpStackLocation(Irp);
PIO_STACK_LOCATION IrpNextStack = IoGetNextIrpStackLocation(Irp);
*IrpNextStack=*IrpCurStack;

if( (Irp->Flags & IRP_NOCACHE) || (Irp->Flags & IRP_PAGING_IO) || (Irp->Flags & IRP_SYNCHRONOUS_PAGING_IO) )
{
   yang = ExAllocatePool( NonPagedPool, sizeof( DOWN_TRANSFER));
   yang->MdlAddress  = Irp->MdlAddress;
   yang->UserAddress = Irp->UserBuffer;//保存原有的地址
   yang->MemLock     = FALSE;
   if (Irp->MdlAddress != NULL)
  {
      IoSetCompletionRoutine( Irp , ReadCompleted , (PVOID)yang ,TRUE ,FALSE ,FALSE );
      return IoCallDriver( DeviceExtention->NextDriverDeviceObject, Irp );
      //内容在MdlAddress中,在完成例程中对Mdl中的内容进行处理
   }
     //否则内容在UserBuffer中。
   IoAllocateMdl(Irp->UserBuffer, IrpCurStack->Parameters.Read.Length, FALSE, FALSE, Irp);
     //从应用下来,在系统中内存空间是不一样的。对userbuffer进行probemdl,并且MmProbeAndLockPages
   if (Irp->MdlAddress == NULL)
   {
       //无法probemdl.
   }
    __try
   {
     MmProbeAndLockPages(Irp->MdlAddress, Irp->RequestorMode, IoReadAccess);
   }
   __except (EXCEPTION_EXECUTE_HANDLER)
   {
      IoFreeMdl(Irp->MdlAddress);
      Irp->MdlAddress = NULL;
   }
   Irp->UserBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
   //从pmdl得到数据的系统地址,并用之来替代userbuffer
   Irp->MdlAddress = NULL; //把MdlAddress置为空
   yang->MemLock     = TRUE;
   IoSetCompletionRoutine( Irp , ReadCompleted ,(PVOID) yang ,TRUE ,FALSE ,FALSE );
}
   return IoCallDriver( DeviceExtention->NextDriverDeviceObject, Irp );
}

DBGSTATIC
NTSTATUS
ReadCompleted(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PVOID Context
)
{
   PIO_STACK_LOCATION  IrpCurStack;
   ULONG Length;
   PCHAR pBuffer;
   int i ;
   PDOWN_TRANSFER       yang;
  
   yang=(PDOWN_TRANSFER)Context;
   Length=Irp->IoStatus.Information;

   switch( Irp->RequestorMode )
   {
     case KernelMode:
     if( Irp ->MdlAddress )
     pBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
     else
     pBuffer = Irp ->AssociatedIrp.SystemBuffer;
     break;
     case UserMode:
     if( Irp ->MdlAddress )
     pBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
     else
     pBuffer = Irp ->UserBuffer;
     break;
     default:
     break;
}
    for(i=0;i<(int)Length;i++)
    {
  pBuffer=~pBuffer;
    }
    if( yang->MemLock == TRUE )
    {
MmUnlockPages(Irp->MdlAddress);
IoFreeMdl(Irp->MdlAddress);
Irp->UserBuffer = yang->UserAddress;
Irp->MdlAddress  = yang->MdlAddress;
   }

    if( Irp->PendingReturned ) {
       IoMarkIrpPending( Irp );
    }
    return  Irp->IoStatus.Status;
}

 
NTSTATUS
SpyWrite(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
  PCHAR pBuffer;
  int i;
  int Length;
  if( Irp ->Flags & ( IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO ) )
 {
   if( Irp ->MdlAddress )
         pBuffer = MmGetSystemAddressForMdl( Irp->MdlAddress );
   else            
pBuffer=Irp->UserBuffer;

   Length=strlen(pBuffer);
   for(i=0;i<(int)Length;i++)
   {
pBuffer=~pBuffer;
   }
}
return SpyPassThrough( DeviceObject , Irp );
}


最新喜欢:

hnfudyhnfudy ljmmaryljmmar...
Hell_Fire_1981
驱动牛犊
驱动牛犊
  • 注册日期2005-03-27
  • 最后登录2007-10-02
  • 粉丝0
  • 关注0
  • 积分532分
  • 威望60点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-16 11:18
!!!!!!!!!!!!!!!!!!!
highgo119
驱动牛犊
驱动牛犊
  • 注册日期2005-01-22
  • 最后登录2009-02-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-03-16 09:50
wmjyy,这位仁兄,大家对你解决这个问题的方法都很感兴趣。
能不能跟大家讲一下嘛,方便的话把代码也贴出来给大家看看嘛!

谢谢先!!
yunwang
驱动牛犊
驱动牛犊
  • 注册日期2004-11-05
  • 最后登录2005-03-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-03-05 10:38
楼主,我也想知道你这个问题的解决方法,能不能贴出来啊?或者给我发一份wyxiaopang@sina.com 。谢谢!!
gongbin_net
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2005-06-07
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-03-03 18:34
你这个问题如何解决的阿,好像你的加密有错,如果超过64k的文件加密就会死机,你可不可以把代码给我看看阿。我急
gongbin_net@163.com
michaelgz
论坛版主
论坛版主
  • 注册日期2005-01-26
  • 最后登录2012-10-22
  • 粉丝1
  • 关注1
  • 积分150分
  • 威望1524点
  • 贡献值1点
  • 好评度213点
  • 原创分0分
  • 专家分2分
5楼#
发布于:2005-02-02 05:34
I hate to read other's code. But I think you missed FAST_IO. Some applications using FAST_IO directly such as Microsoft Word and Notepad.

By the way, there will be more headache when you try to do real file encryption/decryption on Windows later.

Good Luck
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-31 18:57
能否把你的方法贴出来,做个加解密的范例给兄弟们参考??多谢!!!
Ideas for life!
meng20020311
驱动牛犊
驱动牛犊
  • 注册日期2005-01-04
  • 最后登录2005-02-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-31 16:46
我也是做这个的,我有一种方法。可能不适合,不知你的需求是什么?
paladinii
驱动中牛
驱动中牛
  • 注册日期2003-10-28
  • 最后登录2012-03-09
  • 粉丝0
  • 关注0
  • 积分282分
  • 威望74点
  • 贡献值0点
  • 好评度23点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-28 19:17
楼主,我也遇到了同样的问题,能否把你的经验与大家共享一下阿,怎么解决的能不能把代码贴出来阿
Ideas for life!
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-22 20:20
这个帖子的问题我已经解决了,下一步还要有什么问题,现在还不得而知,以后我们大家多交流吧。
我的email是yangyang8022@163.net
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-06-22 20:16
Lu0,老大,我只是一个学生,这是我课题项目中的一部分,老板是不会给钱的,而且做不出来的话,下场是很惨的。
多谢你了。
lu0
lu0
论坛版主
论坛版主
  • 注册日期2001-06-10
  • 最后登录2016-04-05
  • 粉丝2
  • 关注0
  • 积分-6311分
  • 威望21111点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-21 12:51
sf.driverdevelop.com卖加密解密. SDK的. 如果是老板出钱, 你无需这么费精神.
Regards, Lu Lin Webmaster of Inside Programming http://www.lu0s1.com
outens
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-18 10:37
读、写都不能直接对原来的缓冲区操作,需要自己新建一个缓冲区操作,一定要保持原来缓冲区的数据是明文。

[编辑 -  6/18/03 by  outens]
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-17 15:40
faint
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2003-06-13 17:28
为什么没人回我的帖子啊
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-06-12 17:21
为什么没有人回答我的问题,郁闷
wmjyy
驱动牛犊
驱动牛犊
  • 注册日期2003-05-03
  • 最后登录2006-01-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-06-11 16:53
我知道看别人的代码很烦,但还是请大家多指教
游客

返回顶部