strongdisk
驱动牛犊
驱动牛犊
  • 注册日期2003-10-11
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1635回复:3

filedisk加上加密(else 是否可以回答一下,谢谢)

楼主#
更多 发布于:2004-01-09 14:44
我在修改filedisk,想对它加上加密技术,我看过以前的贴子,也大概了解了一些,但是有几个问题一直想不通,希望你能帮我一下,不胜感激!

一、我使用固定密钥加解密可以了。
二、密匙是如何传递给驱动程序的,是不是在Mount时跟随OPEN_FILE_INFORMATION一样进去呀(加多一个字段),但是这个变量是不是全局的呀,在Read/Write里如何得到它。
我定义了全局变量,在    case IOCTL_FILE_DISK_OPEN_FILE:
中读入key


我这样试用了一下,可是不行。filedisk.img文件都没有生成。

应该如何传入密钥呢?
strongdisk
驱动牛犊
驱动牛犊
  • 注册日期2003-10-11
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于: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);
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
板凳#
发布于: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]
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
strongdisk
驱动牛犊
驱动牛犊
  • 注册日期2003-10-11
  • 最后登录2004-06-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于: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:
中读出密钥?

可是是否会影响其他?我这样试了,还是有问题,你觉得这样可行吗?
游客

返回顶部