阅读:3441回复:18
对文件过滤驱动开发熟悉的朋友请进来,关于文件加密的问题,急死了
我想对一个指定文件夹下写入的文件,采用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] |
|
|
沙发#
发布于:2007-05-07 16:44
怎么提问的内容没有了??晕
|
|
|
板凳#
发布于:2007-05-07 16:50
发了啥内容?
|
|
|
地板#
发布于:2007-05-07 17:01
我重新修改了一下帖子内容,请znsoft大哥帮忙看一下,好吗,谢谢你
|
|
|
地下室#
发布于:2007-05-07 19:33
这样的问题我刚解决掉,实际上要过滤掉一些访问,这些代码在toolflat大牛的sfilter中有,另外建议你看看楚狂人的文章
|
|
|
5楼#
发布于:2007-05-07 19:42
如果设定了加密标志,写入加密结果中的文件内容不对。 比如源文件内容是:“abc”,加密结果是:“XXX”,那么写入加密文件中的内容应该是 “ENCRYPTEDBYHNSXXX”,但实际写入的结果是ENC,长度和源文件内容长度相同,后面的内容没有写入。 如果不手动改变文件大小, 不可能改变文件长度, 所以你写进去的内容肯定是ENC |
|
6楼#
发布于:2007-05-08 08:12
如何手动改动文件长度,哪位可以指点一下?
|
|
|
7楼#
发布于:2007-05-08 11:35
自己创造一个IRP_MJ_SET_INFORMATION的IRP发下去可以设置文件大小
|
|
8楼#
发布于:2007-05-08 12:39
引用第7楼coolw于2007-05-08 11:35发表的“”: 可是ValidDataLength却没法改,还是有问题的 |
|
|
9楼#
发布于:2007-05-08 12:58
引用第8楼looksail于2007-05-08 12:39发表的“”: 可直接设置FCB里面的值 |
|
10楼#
发布于:2007-05-08 14:18
引用第9楼coolw于2007-05-08 12:58发表的“”: 呵呵,这样干不知道会导致什么后果啊,FCB都不允许随便改的,要不然说不定什么状况就蓝了,我尝试发个IRP去改,但是却返回STATUS_PRIVILEGE_NOT_HELD,没权限 |
|
|
11楼#
发布于:2007-05-08 17:15
,郁闷之极啊
|
|
|
12楼#
发布于:2007-05-09 10:17
引用第10楼looksail于2007-05-08 14:18发表的“”: 我也遇到STATUS_PRIVILEGE_NOT_HELD的问题, 没办法, 直接设置了FCB里的值, 蓝屏不会, 但是会有一些其它的后遗症, 还在想办法解决中, 有兴趣的话一起讨论讨论 |
|
13楼#
发布于:2007-05-09 11:15
引用第12楼coolw于2007-05-09 10:17发表的“”: 呵呵,同道中人,后遗症能说说是什么吗 ? |
|
|
14楼#
发布于:2007-05-09 11:25
ValidDataLength的值有时莫名其妙的又变小了, 本来之前已经设置到了我所期望的值, 并且可以成功的写入数据, 可是到CLEAN_UP的时候又变回原来的值了
|
|
15楼#
发布于:2007-05-09 11:31
引用第14楼coolw于2007-05-09 11:25发表的“”: 我晕,看来你这条路行不通,还是解决无权改 ValidDataLength 的问题吧 我把OSR都搜遍了也没有找到答案,很郁闷,这个问题折腾2天了 |
|
|
16楼#
发布于:2007-05-09 11:39
嗯, 这样是不太好, 好像应用程序可以通过一个函数设置权限,但是在驱动层不知道有什么函数可以用,郁闷
|
|
17楼#
发布于:2010-10-19 18:39
正在做相关的东东,mark一下,回头再看
|
|
18楼#
发布于:2011-05-14 22:41
学习了
|
|