linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
阅读:3441回复:18

对文件过滤驱动开发熟悉的朋友请进来,关于文件加密的问题,急死了

楼主#
更多 发布于:2007-05-07 15:47
我想对一个指定文件夹下写入的文件,采用rc4加密算法加密,并在加密文件开头置入一个加密标志(ENCRYPTEDBYHNS)。

代码如下:
我是直接加密的pBuffer,加密后在开头位置再插入加密标志。但加密结果不对。

如果没有加密标志,加密文件和源文件一样,没有加密,我用DebugView监视了一下,发现EdWrite执行了两次,第二次把第一次的加密结果给解密了。

如果设定了加密标志,写入加密结果中的文件内容不对。  比如源文件内容是:“abc”,加密结果是:“XXX”,那么写入加密文件中的内容应该是 “ENCRYPTEDBYHNSXXX”,但实际写入的结果是ENC,长度和源文件内容长度相同,后面的内容没有写入。


哪位高手指点一下该如何做才对???

NTSTATUS
EdWrite (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp)
{
    NTSTATUS Status = STATUS_SUCCESS;
    int i;
    HANDLE link_handle=NULL;
    OBJECT_ATTRIBUTES attributes;
    UNICODE_STRING target;
    UNICODE_STRING filename,filename1,filename2;
    WCHAR   USName[256];
    HANDLE  DirectoryHandle;
    KEVENT WaitEvent;
    char *pBuffer;
    char *MyBuffer;
    char key[256];
    int Len;
    //PFILE_CONTEXT FileContext;
    PIO_STACK_LOCATION  CurrentIrpStack = IoGetCurrentIrpStackLocation(Irp);
    PSFILTER_DEVICE_EXTENSION DevExt = DeviceObject->DeviceExtension;
    PFILE_OBJECT  FileObject = CurrentIrpStack->FileObject;

    FileObject->FsContext

    if (IS_MY_DEVICE_OBJECT(DeviceObject))
    {
        //Only care about volume filter device object, pass through other create request
        if(NULL == DevExt->StorageStackDeviceObject)
        {
            goto _ReturnAddress2;
        }

        // only IRP_NOCACHE, IRP_PAGING_IO, IRP_SYNCHRONOUS_PAGING_IO will be processed
        if (0 == (Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
        {
            goto _ReturnAddress2;
        }

        
        for(i=0;i<256;i++)
            USName=0;

        RtlInitUnicodeString(&filename,USName);
        filename.MaximumLength=512;
        RtlInitUnicodeString(&filename1,USName);
        filename1.MaximumLength=512;
        RtlInitUnicodeString(&filename2,USName);
        filename2.MaximumLength=512;

        if (0==FileObject->FileName.Length) {
            // 我不知道为什么会有这样的情况
            KdPrint(("0"));
            return STATUS_UNSUCCESSFUL;
        }
        //filename=FileObject->FileName;
        RtlVolumeDeviceToDosName(FileObject->DeviceObject,&filename);
        RtlCopyUnicodeString(&filename1,&filename);

        RtlInitUnicodeString(&filename2,FileObject->FileName.Buffer);
        RtlAppendUnicodeStringToString(&filename1,&filename2);


        if(NULL != wcsstr(filename1.Buffer, L"D:\\test\\"))
        {
            KdPrint(("WRITE-->%ws\n",filename1.Buffer));

            if (DeviceObject->Flags & DO_BUFFERED_IO)
            {
                pBuffer=(char *)Irp->AssociatedIrp.SystemBuffer;
            }
            else
            {
                if (Irp->MdlAddress)
                {
                    pBuffer = (char *)MmGetSystemAddressForMdl (Irp->MdlAddress);
                }
                else
                {
                    if (Irp->UserBuffer != NULL)
                        pBuffer=(char*)Irp->UserBuffer;
                }
            }

            if (pBuffer != NULL && strstr(pBuffer, "ENCRYPTEDBYHNS") == NULL)
            {
                KdPrint(("first WRITE-->%s\n", pBuffer));
                strcpy(key, "abcdefg");
                crypt(pBuffer, key);
                /*MyBuffer = ExAllocatePool(NonPagedPool, strlen(pBuffer));
                strcpy(MyBuffer, pBuffer);
                strcpy(pBuffer, "ENCRYPTEDBYHNS");
                strcat(pBuffer, MyBuffer);*/
                KdPrint(("Two WRITE-->%s\n", pBuffer));
                KdPrint(("data length is :%d\n", strlen(pBuffer)));
                Len = CurrentIrpStack->Parameters.Write.Length;
                DbgPrint("data length is:%d\n", Len);
            }
        }

        KeInitializeEvent(&WaitEvent, NotificationEvent, FALSE);

        // Copy the stack and set our Completion routine
        IoCopyCurrentIrpStackLocationToNext(Irp);

        IoSetCompletionRoutine(Irp, SfWriteCompletion, &WaitEvent, TRUE, TRUE, TRUE);

        // Call the next driver in the stack.
       Status = IoCallDriver(DevExt->AttachedToDeviceObject, Irp);

       // Wait for the completion routine to be called
       if (STATUS_PENDING == Status)
       {
           ASSERT(STATUS_SUCCESS == KeWaitForSingleObject(&WaitEvent, Executive, KernelMode, FALSE, NULL));
       }

       // We don't care about failed requests
       if (!NT_SUCCESS(Irp->IoStatus.Status) || Irp->IoStatus.Status == STATUS_REPARSE)
       {
           goto _ReturnAddress1;
       }

        /*IoCopyCurrentIrpStackLocationToNext(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject,Irp);*/

_ReturnAddress1:
        Status = Irp->IoStatus.Status;
        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return Status;
_ReturnAddress2:
        //Save the Status and continue processing the IRP
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    //Control device object
    if(IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject))
    {
        //Reset the Status and information of Irp
        Irp->IoStatus.Status = STATUS_SUCCESS;
        Irp->IoStatus.Information = 0;

        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return STATUS_SUCCESS;
    }

    //Wrong device object
    Irp->IoStatus.Status = STATUS_INVALID_HANDLE;
    Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_INVALID_HANDLE;
}

NTSTATUS SfWriteCompletion(IN PDEVICE_OBJECT DeviceObject,
                          IN PIRP Irp,
                          IN PVOID Context)
{
   PKEVENT Event = Context;
  
   UNREFERENCED_PARAMETER(DeviceObject);
   UNREFERENCED_PARAMETER(Irp);
  
   ASSERT(IS_MY_DEVICE_OBJECT(DeviceObject));
   KeSetEvent(Event, IO_NO_INCREMENT, FALSE);
   return STATUS_MORE_PROCESSING_REQUIRED;
}[p:4]

最新喜欢:

wingmanwingma... 小扬小扬
在孤独和无助中缓慢前行...
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2007-05-07 16:44
怎么提问的内容没有了??晕
在孤独和无助中缓慢前行...
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2007-05-07 16:50
发了啥内容?
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
地板#
发布于:2007-05-07 17:01
我重新修改了一下帖子内容,请znsoft大哥帮忙看一下,好吗,谢谢你
在孤独和无助中缓慢前行...
testoldgun
驱动牛犊
驱动牛犊
  • 注册日期2007-05-01
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望4点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-05-07 19:33
这样的问题我刚解决掉,实际上要过滤掉一些访问,这些代码在toolflat大牛的sfilter中有,另外建议你看看楚狂人的文章
驱网无线,快乐无限
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-05-07 19:42
如果设定了加密标志,写入加密结果中的文件内容不对。 比如源文件内容是:“abc”,加密结果是:“XXX”,那么写入加密文件中的内容应该是 “ENCRYPTEDBYHNSXXX”,但实际写入的结果是ENC,长度和源文件内容长度相同,后面的内容没有写入。

.......


如果不手动改变文件大小, 不可能改变文件长度, 所以你写进去的内容肯定是ENC
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2007-05-08 08:12
如何手动改动文件长度,哪位可以指点一下?
在孤独和无助中缓慢前行...
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-05-08 11:35
自己创造一个IRP_MJ_SET_INFORMATION的IRP发下去可以设置文件大小
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-05-08 12:39
引用第7楼coolw2007-05-08 11:35发表的“”:
自己创造一个IRP_MJ_SET_INFORMATION的IRP发下去可以设置文件大小


可是ValidDataLength却没法改,还是有问题的
提问归提问,还是只能靠自己
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-05-08 12:58
引用第8楼looksail2007-05-08 12:39发表的“”:


可是ValidDataLength却没法改,还是有问题的


可直接设置FCB里面的值
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2007-05-08 14:18
引用第9楼coolw2007-05-08 12:58发表的“”:


可直接设置FCB里面的值

呵呵,这样干不知道会导致什么后果啊,FCB都不允许随便改的,要不然说不定什么状况就蓝了,我尝试发个IRP去改,但是却返回STATUS_PRIVILEGE_NOT_HELD,没权限
提问归提问,还是只能靠自己
linuxyf
驱动小牛
驱动小牛
  • 注册日期2007-04-03
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望162点
  • 贡献值0点
  • 好评度161点
  • 原创分1分
  • 专家分0分
11楼#
发布于:2007-05-08 17:15
      ,郁闷之极啊
在孤独和无助中缓慢前行...
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-05-09 10:17
引用第10楼looksail2007-05-08 14:18发表的“”:

呵呵,这样干不知道会导致什么后果啊,FCB都不允许随便改的,要不然说不定什么状况就蓝了,我尝试发个IRP去改,但是却返回STATUS_PRIVILEGE_NOT_HELD,没权限


我也遇到STATUS_PRIVILEGE_NOT_HELD的问题, 没办法, 直接设置了FCB里的值, 蓝屏不会, 但是会有一些其它的后遗症, 还在想办法解决中, 有兴趣的话一起讨论讨论
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-09 11:15
引用第12楼coolw2007-05-09 10:17发表的“”:


我也遇到STATUS_PRIVILEGE_NOT_HELD的问题, 没办法, 直接设置了FCB里的值, 蓝屏不会, 但是会有一些其它的后遗症, 还在想办法解决中, 有兴趣的话一起讨论讨论


呵呵,同道中人,后遗症能说说是什么吗 ?
提问归提问,还是只能靠自己
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-05-09 11:25
ValidDataLength的值有时莫名其妙的又变小了, 本来之前已经设置到了我所期望的值, 并且可以成功的写入数据, 可是到CLEAN_UP的时候又变回原来的值了
looksail
荣誉会员
荣誉会员
  • 注册日期2005-05-22
  • 最后登录2014-03-15
  • 粉丝2
  • 关注0
  • 积分1016分
  • 威望991点
  • 贡献值0点
  • 好评度239点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-05-09 11:31
引用第14楼coolw2007-05-09 11:25发表的“”:
ValidDataLength的值有时莫名其妙的又变小了, 本来之前已经设置到了我所期望的值, 并且可以成功的写入数据, 可是到CLEAN_UP的时候又变回原来的值了


我晕,看来你这条路行不通,还是解决无权改 ValidDataLength 的问题吧

我把OSR都搜遍了也没有找到答案,很郁闷,这个问题折腾2天了
提问归提问,还是只能靠自己
coolw
驱动牛犊
驱动牛犊
  • 注册日期2006-03-20
  • 最后登录2012-04-13
  • 粉丝0
  • 关注0
  • 积分521分
  • 威望65点
  • 贡献值0点
  • 好评度54点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-05-09 11:39
嗯, 这样是不太好, 好像应用程序可以通过一个函数设置权限,但是在驱动层不知道有什么函数可以用,郁闷
dlutfrank
驱动牛犊
驱动牛犊
  • 注册日期2010-09-26
  • 最后登录2011-04-11
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望311点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2010-10-19 18:39
正在做相关的东东,mark一下,回头再看
fatepro
驱动牛犊
驱动牛犊
  • 注册日期2011-05-12
  • 最后登录2011-09-07
  • 粉丝0
  • 关注0
  • 积分68分
  • 威望681点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2011-05-14 22:41
学习了
游客

返回顶部