阅读:3074回复:16
关于文件加密,读写的问题,请指教!!!!!(高分)
各位大侠,我用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 ); } |
|
沙发#
发布于:2003-06-11 16:53
我知道看别人的代码很烦,但还是请大家多指教
|
|
板凳#
发布于:2003-06-12 17:21
为什么没有人回答我的问题,郁闷
|
|
地板#
发布于:2003-06-13 17:28
为什么没人回我的帖子啊
|
|
地下室#
发布于:2003-06-17 15:40
faint
|
|
5楼#
发布于:2003-06-18 10:37
读、写都不能直接对原来的缓冲区操作,需要自己新建一个缓冲区操作,一定要保持原来缓冲区的数据是明文。
[编辑 - 6/18/03 by outens] |
|
6楼#
发布于:2003-06-21 12:51
sf.driverdevelop.com卖加密解密. SDK的. 如果是老板出钱, 你无需这么费精神.
|
|
|
7楼#
发布于:2003-06-22 20:16
Lu0,老大,我只是一个学生,这是我课题项目中的一部分,老板是不会给钱的,而且做不出来的话,下场是很惨的。
多谢你了。 |
|
8楼#
发布于:2003-06-22 20:20
这个帖子的问题我已经解决了,下一步还要有什么问题,现在还不得而知,以后我们大家多交流吧。
我的email是yangyang8022@163.net |
|
9楼#
发布于:2005-01-28 19:17
楼主,我也遇到了同样的问题,能否把你的经验与大家共享一下阿,怎么解决的能不能把代码贴出来阿
|
|
|
10楼#
发布于:2005-01-31 16:46
我也是做这个的,我有一种方法。可能不适合,不知你的需求是什么?
|
|
11楼#
发布于:2005-01-31 18:57
能否把你的方法贴出来,做个加解密的范例给兄弟们参考??多谢!!!
|
|
|
12楼#
发布于: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 |
|
13楼#
发布于:2005-03-03 18:34
你这个问题如何解决的阿,好像你的加密有错,如果超过64k的文件加密就会死机,你可不可以把代码给我看看阿。我急
gongbin_net@163.com |
|
14楼#
发布于:2005-03-05 10:38
楼主,我也想知道你这个问题的解决方法,能不能贴出来啊?或者给我发一份wyxiaopang@sina.com 。谢谢!!
|
|
15楼#
发布于:2005-03-16 09:50
wmjyy,这位仁兄,大家对你解决这个问题的方法都很感兴趣。
能不能跟大家讲一下嘛,方便的话把代码也贴出来给大家看看嘛! 谢谢先!! |
|
16楼#
发布于:2005-05-16 11:18
!!!!!!!!!!!!!!!!!!!
|
|