阅读:1635回复:3
filedisk加上加密(else 是否可以回答一下,谢谢)
我在修改filedisk,想对它加上加密技术,我看过以前的贴子,也大概了解了一些,但是有几个问题一直想不通,希望你能帮我一下,不胜感激!
一、我使用固定密钥加解密可以了。 二、密匙是如何传递给驱动程序的,是不是在Mount时跟随OPEN_FILE_INFORMATION一样进去呀(加多一个字段),但是这个变量是不是全局的呀,在Read/Write里如何得到它。 我定义了全局变量,在 case IOCTL_FILE_DISK_OPEN_FILE: 中读入key 我这样试用了一下,可是不行。filedisk.img文件都没有生成。 应该如何传入密钥呢? |
|
沙发#
发布于:2004-01-09 15:40
我在加密时也有一点问题。
我mount后可以格式化,也可以拷入一个文件,可是拷入一个文件后就无法再次拷入文件,提示磁盘以满。 case IRP_MJ_READ: pBuf = MmGetSystemAddressForMdl(irp->MdlAddress); Len = io_stack->Parameters.Write.Length; ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); decrypt(pBuf,Len); break; case IRP_MJ_WRITE: //if ((io_stack->Parameters.Write.ByteOffset.QuadPart + // io_stack->Parameters.Write.Length) > // device_extension->file_information.AllocationSize.QuadPart) //{ // irp->IoStatus.Status = STATUS_INVALID_PARAMETER; // irp->IoStatus.Information = 0; //} pBuf = MmGetSystemAddressForMdl(irp->MdlAddress); Len = io_stack->Parameters.Write.Length; decrypt(pBuf,Len); ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); decrypt(pBuf,Len); break; decrypt(PVOID pBuf,ULONG Len) { RC4_KEY key; RC4_set_key(&key,16,szKey); RC4(&key,Len,(const unsigned char *)pBuf,(unsigned char *)pBuf); } |
|
板凳#
发布于:2004-01-09 21:33
二、密匙是如何传递给驱动程序的,是不是在Mount时跟随OPEN_FILE_INFORMATION一样进去呀(加多一个字段),但是这个变量是不是全局的呀,在Read/Write里如何得到它。
我定义了全局变量,在 case IOCTL_FILE_DISK_OPEN_FILE: 中读入key 我这样试用了一下,可是不行。filedisk.img文件都没有生成。 应该如何传入密钥呢? 对,在Mount时跟随OPEN_FILE_INFORMATION一样进去呀(加多一个字段)在驱动中的内核线程中收到IOCTL_FILE_DISK_OPEN_FILE的时候会收到你传进来的密钥,然后将其保存的设备扩展中即可 然后就可以在READ,WRITE的时候进行加解密了,我用了2个小时就搞顶,比想象要简单的多,不过现在大家都会做这个,也没什么意义 现在的关键是要在任意模式下都能与驱动通信,同时要保护生成的硬盘文件等。。。。。 还有你不能直接进行加解密,必须在自己的内存中进行,然后拷贝回去,这在以前已经多次提醒了。。。。。 [编辑 - 1/9/04 by wowocock] |
|
|
地板#
发布于:2004-01-10 09:20
谢谢你的斑竹,可是对于驱动我是新手,你决的非常简单的问题。我就要搞一个星期。
这个东西没法调试,有了问题无法找出,只能请教高手了。 if (!DeviceIoControl( Device, IOCTL_FILE_DISK_OPEN_FILE, OpenFileInformation, sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1, NULL, 0, &BytesReturned, NULL )) 我是否修改OPEN_FILE_INFORMATION结构 typedef struct _OPEN_FILE_INFORMATION { DEVICE_TYPE DeviceType; BOOLEAN ReadOnly; LARGE_INTEGER FileSize; USHORT FileNameLength; UCHAR FileName[1]; UCHAR szKey[16]; } OPEN_FILE_INFORMATION, *POPEN_FILE_INFORMATION; 然后在 switch (io_stack->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_FILE_DISK_OPEN_FILE: 中读出密钥? 可是是否会影响其他?我这样试了,还是有问题,你觉得这样可行吗? |
|