阅读:1572回复:5
xuAmigo,来问个加密
最近看到很多人做加密解密,我也很感兴趣。来问一问。
我今天想实现在WRITE中得到内容,然后加密并把密文保存到DISK,然后恢复内存中的明文。我参照以前的文章写,但是怎么就总蓝屏呢?代码如下:请多指教 NTSTATUS SfWrite( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) {PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp); PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = NULL; NTSTATUS status; PFILE_OBJECT file = irpSp->FileObject; UNICODE_STRING name; UNICODE_STRING dosname={0}; WCHAR nameBuf[512]; PVOID OldBuffer = NULL;//Original content PVOID MyBuffer = NULL; ULONG Length = 0; ULONG Offset = 0; PAGED_CODE(); if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO))) { return SfPassThrough(DeviceObject,Irp); } do{ DbgPrint(\"SfWrite:Begin\"); if (Irp->MdlAddress) OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress); else OldBuffer = Irp->UserBuffer; if(!OldBuffer) { DbgPrint(\"SfWriet:OldBuffer==NULL\"); status = STATUS_INVALID_PARAMETER; break; } Length = irpSp->Parameters.Write.Length DbgPrint(\"%d,%s\",Length,OldBuffer); MyBuffer = ExAllocatePool(NonPagedPool,Length); if (!MyBuffer) { DbgPrint(\"sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\\n\"); status = STATUS_INSUFFICIENT_RESOURCES; break; } RtlCopyMemory(MyBuffer,OldBuffer,Length); CompletionCtx=ExAllocatePool(NonPagedPool,sizeof(READ_WRITE_COMPLETION_CONTEXT)); if(!CompletionCtx) { DbgPrint(\"sfilter!SfWrite: STATUS_INSUFFICIENT_RESOURCES\\n\"); status = STATUS_INSUFFICIENT_RESOURCES; break; } DbgPrint(\"Allocate OK!\"); CompletionCtx->OldMdl = Irp->MdlAddress; CompletionCtx->OldUserBuffer = Irp->UserBuffer; CompletionCtx->OldSystemBuffer = Irp->AssociatedIrp.SystemBuffer; CompletionCtx->OldBuffer = OldBuffer; CompletionCtx->MyBuffer = MyBuffer; CompletionCtx->Length = Length; for(Offset=0;Offset<Length;++Offset) ((PUCHAR) OldBuffer)[Offset] = ~((PUCHAR) MyBuffer)[Offset]; DbgPrint(\"OldBuffer after encrypt:%s\",OldBuffer); IoCopyCurrentIrpStackLocationToNext(Irp); IoSetCompletionRoutine(Irp, SfWriteCompletion, CompletionCtx, TRUE, TRUE,TRUE); return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp ); }while(FALSE); Irp->IoStatus.Status = status; IoCompleteRequest(Irp, IO_NO_INCREMENT); return status; } NTSTATUS SfWriteCompletion( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) { PREAD_WRITE_COMPLETION_CONTEXT CompletionCtx = (PREAD_WRITE_COMPLETION_CONTEXT) Context; ULONG Offset = 0; UNREFERENCED_PARAMETER(DeviceObject); if (Irp->PendingReturned) IoMarkIrpPending(Irp); IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = CompletionCtx->OldMdl; Irp->UserBuffer = CompletionCtx->OldUserBuffer; Irp->AssociatedIrp.SystemBuffer = CompletionCtx->OldSystemBuffer; ExFreePoolWithTag(CompletionCtx->MyBuffer, SFLT_POOL_TAG); return STATUS_SUCCESS; } |
|
最新喜欢:![]() |
沙发#
发布于:2005-05-26 10:28
我的就是重新启动以后才能看到密文,确实是缓存的问题,你按你的要求改就行
|
|
板凳#
发布于:2005-05-26 10:18
我还是直接COPY到OLDBUFFER的。
我想按照你们的思路修改一下,但是,加密以后只有重新启动才能看到密文。而我直接替换OLDBUFFER的话就可以,怎么回事? 难道是CACHE?? |
|
地板#
发布于:2005-05-26 09:43
我下了几个断点,终于可以了。主要是几个内存用的不小心。
还有就是IoFreeMdl(Irp->MdlAddress);不能要。 但是我的加密完了以后密文的长度会变的,比如以前length=4096,我加密以后变成了5000,怎么办? 能不能自己把这个5000的密文分两次写下去? 谢谢? |
|
地下室#
发布于:2005-05-25 19:42
RtlCopyMemory(MyBuffer,OldBuffer,Length);
这句不要, for(Offset=0;Offset<Length;++Offset) ((PUCHAR) OldBuffer)[Offset] = ~((PUCHAR) MyBuffer)[Offset]; 这句改为 Irp->MdlAddress = IoAllocateMdl(MyBuffer,Length,FALSE,TRUE,NULL); for(Offset=0;Offset<Length;++Offset) ((PUCHAR) MyBuffer)[Offset] = ~((PUCHAR) OldBuffer)[Offset]; MmBuildMdlForNonPagedPool(Irp->MdlAddress); Irp->UserBuffer = MmGetMdlVirtualAddress(Irp->MdlAddress); 你试试看,OldBuffer是系统缓冲区 |
|
5楼#
发布于:2005-05-25 19:27
IoFreeMdl(Irp->MdlAddress);
Irp->MdlAddress = CompletionCtx->OldMdl; Irp->UserBuffer = CompletionCtx->OldUserBuffer; Irp->AssociatedIrp.SystemBuffer = CompletionCtx->OldSystemBuffer 不要这个IoFreeMdl(Irp->MdlAddress);,因为两个都是同一个mdl 释放掉了,而完成例程返回时,会自动释放掉irp的mdl的 感觉你的代码问题很多,你重新改写下 |
|