阅读:2235回复:18
大家帮忙看看,filedisk加解密读写不能格式化盘的问题(代码)
下面的代码生成的sys,用filedisk.exe生成盘后不能成功的格式化,大家帮忙看看啊!!
// CPP 文件 #include "RC4.h" #define BUFFER_SIZE 1024 static void SwapByte(unsigned char *a, unsigned char *b) { unsigned char swapByte; swapByte = *a; *a = *b; *b = swapByte; } void PrepareKey(unsigned char * pKeyData, int iKeyDataLen, RC4KEY * pKey) { // unsigned char ucSwapByte; unsigned char ucIndex1; unsigned char ucIndex2; unsigned char * state; unsigned short counter; state = &pKey->state[0]; for(counter = 0; counter < 256; counter++) state[counter] = (unsigned char)counter; pKey->x = 0; pKey->y = 0; ucIndex1 = 0; ucIndex2 = 0; for(counter = 0; counter < 256; counter++) { ucIndex2 = (pKeyData[ucIndex1] + state[counter] + ucIndex2) % 256; SwapByte(&state[counter], &state[ucIndex2]); ucIndex1 = (ucIndex1 + 1) % iKeyDataLen; } } void RC4(unsigned char * pBuffer, int iBufferLen, RC4KEY * pkey) { unsigned char x; unsigned char y; unsigned char * state; unsigned char xorIndex; unsigned short counter; x = pkey->x; y = pkey->y; state = &pkey->state[0]; for(counter = 0; counter < iBufferLen; counter ++) { x = (x + 1) % 256; y = (state[x] + y) % 256; SwapByte(&state[x], &state[y]); xorIndex = (state[x] + state[y]) % 256; pBuffer[counter] ^= state[xorIndex]; } pkey->x = x; pkey->y = y; } // 头文件 #ifndef _RC4_H_ #define _RC4_H_ typedef struct _RC4KEY { unsigned char state[256]; unsigned char x; unsigned char y; }RC4KEY; static void SwapByte(unsigned char *a, unsigned char *b); void PrepareKey(unsigned char * pKeyData, int iKeyDataLen, RC4KEY * pKey); void RC4(unsigned char * pBuffer, int iBufferLen, RC4KEY * pkey); #endif // 驱动代码 //--------------添加变量---------------- unsigned char * szKey; RC4KEY * pKey; //-------------------------------------- ASSERT(Context != NULL); device_object = (PDEVICE_OBJECT) Context; device_extension = (PDEVICE_EXTENSION) device_object->DeviceExtension; KeSetPriorityThread(KeGetCurrentThread(), LOW_REALTIME_PRIORITY); //--------------添加代码---------------- szKey = ExAllocatePool(NonPagedPool,8); RtlCopyMemory(szKey, "abcdefg", 8); //-------------------------------------- for (;;) { KeWaitForSingleObject( &device_extension->request_event, Executive, KernelMode, FALSE, NULL ); if (device_extension->terminate_thread) { PsTerminateSystemThread(STATUS_SUCCESS); } while (request = ExInterlockedRemoveHeadList( &device_extension->list_head, &device_extension->list_lock )) { irp = CONTAINING_RECORD(request, IRP, Tail.Overlay.ListEntry); io_stack = IoGetCurrentIrpStackLocation(irp); switch (io_stack->MajorFunction) { case IRP_MJ_READ: pCurrentAddress = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); pTempBuffer = ExAllocatePool(NonPagedPool,io_stack->Parameters.Read.Length); ZwReadFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, //MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), pTempBuffer, io_stack->Parameters.Read.Length, &io_stack->Parameters.Read.ByteOffset, NULL ); //------------------解密pTempBuffer------------------ pKey = ExAllocatePool(NonPagedPool,sizeof(RC4KEY)); PrepareKey(szKey, 8, pKey); PrepareKey(szKey, 8, pKey); RC4(pTempBuffer,io_stack->Parameters.Read.Length,pKey); //--------------------------------------------------- RtlCopyMemory(pCurrentAddress,pTempBuffer,io_stack->Parameters.Read.Length); //----------------- ExFreePool(pKey); //----------------- ExFreePool(pTempBuffer); 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; } pCurrentAddress = MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority); pTempBuffer=ExAllocatePool(NonPagedPool,io_stack->Parameters.Write.Length); RtlCopyMemory(pTempBuffer,pCurrentAddress,io_stack->Parameters.Write.Length); //------------------加密pTempBuffer------------------ pKey = ExAllocatePool(NonPagedPool,sizeof(RC4KEY)); PrepareKey(szKey, 8, pKey); RC4(pTempBuffer,io_stack->Parameters.Write.Length,pKey); //--------------------------------------------------- ZwWriteFile( device_extension->file_handle, NULL, NULL, NULL, &irp->IoStatus, //MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority), pTempBuffer, io_stack->Parameters.Write.Length, &io_stack->Parameters.Write.ByteOffset, NULL ); //----------------- ExFreePool(pKey); //----------------- ExFreePool(pTempBuffer); break; [编辑 - 9/2/04 by TH1999] |
|
最新喜欢:![]()
|
沙发#
发布于:2004-07-06 20:20
文章标题 各位老大帮帮忙,我给filedisk使用rc4加密读写,怎么就无法格式化生成的盘呢?
各位老大帮帮忙,我给filedisk使用rc4加密读写,怎么就无法格式化生成的盘呢? 使用的RC4算法在普通win32程序(MFC)里点问题都没有,完全可以正常的加解密。 搜遍了整个论坛,就是没看到一个完整的关于filedisk加解密的例子。郁闷啊!始终都弄不好,都有点泄气了。 在那个“文件系统驱动”群里叫拜师学艺也没人理,呵呵,没办法。 最近工作又不顺利,很郁闷啊,别人没完成工作说是因为我的关系,很不爽啊! 喜欢搞驱动,但感觉好难啊!希望大家帮帮忙啊!先谢谢了! 不想一直都搞数据库。不是特别喜欢。还是喜欢搞系统方面的了。 |
|
|
板凳#
发布于:2004-07-06 20:22
源代码如下:
哪为兄弟帮忙改改啊!! |
|
|
地板#
发布于:2004-07-07 12:23
没人看???郁闷~~~~~~~~~~~~
|
|
|
地下室#
发布于:2004-07-08 12:58
郁闷!
|
|
|
5楼#
发布于:2004-07-08 18:55
??????????????
|
|
|
6楼#
发布于:2004-07-08 19:49
测试了你的加密和解迷
void TestRC4() { BYTE Data[256] ; BYTE szKey[256] ; RC4KEY Key ; int i ; char szDebugMsg[256] ; for(i=0; i<256; i++) Data = i ; PrepareKey(szKey, 8, &Key); RC4(Data, 256, &Key); PrepareKey(szKey, 8, &Key); PrepareKey(szKey, 8, &Key); RC4(Data , 256, &Key); for(i=0; i<256; i++) { if(Data != i) { wsprintf(szDebugMsg , "\tError : %3 %3d\n" , i , Data) ; OutputDebugString(szDebugMsg) ; } } } 但没有发现有错误输出,说明加密部分没有问题 可能是其他地方出了问题 |
|
|
7楼#
发布于:2004-07-08 19:58
实在是太感谢了,先前实在是太郁闷了,一直没人理啊!
|
|
|
8楼#
发布于:2004-07-08 20:01
不用谢,我正好有空看看
没有帮你找到问题的根源,实在抱歉 |
|
|
9楼#
发布于:2004-07-08 20:21
呵呵,没关系啊!
先前都快对论坛的这些兄弟些快绝望了。 |
|
|
10楼#
发布于:2004-07-09 13:52
我也碰到过无法格式化的情况,可能是在写该分区的头部数据时,加密的数据在写了以后再解密时无法恢复成正确的明文了,所以不能完成格式化
|
|
11楼#
发布于:2004-07-10 17:51
感觉代码没有错啊!实在是找不到问题所在了,
驱动程序的调试又弄不来,郁闷啊! |
|
|
12楼#
发布于:2004-07-12 15:31
do not use rc4 ,change it
|
|
|
13楼#
发布于:2004-07-13 13:02
晕,wowocock老大都这样说了,好象真的没希望了。
|
|
|
14楼#
发布于:2004-07-22 08:53
我用过DES算法按扇区加密是可以格式化的,不过后来算法的加密方式改了之后就无法格式化了。
我还是有那个疑问就是格式化时先进入IRP_MJ_READ那不还是先解密吗? |
|
15楼#
发布于:2004-07-22 12:43
我用过DES算法按扇区加密是可以格式化的,不过后来算法的加密方式改了之后就无法格式化了。 我很粗略的看了一下你的代码, 应该是边界对齐的问题。 分组加密和解密的边界没有对其 |
|
|
16楼#
发布于:2004-07-22 22:19
谢谢各位的帮忙啊!!
终于知道点眉目了,真的是一愁莫展啊!! 我现在连驱动怎么调试都不知道啊! 看了点点资料,还是操作不来! 怎么才可以象VC IDE调试时能看到代码。 晕啊!! 还有,也不知道怎么去对齐。 记不起对齐的代码了,是使用 pragma指令吧?后面的指令忘了, 因为在网吧,自己的机器上不了网。 也看不到MSDN,没办法,晕!! |
|
|
17楼#
发布于:2004-07-23 11:15
一字节对齐的例子:
#pragma pack(push, 1) your structure #pragma pack(pop) |
|
18楼#
发布于:2004-07-23 13:23
谢谢各位的帮忙啊!! 我说的对齐可不是用pragma对齐, 我是指分组队齐! 比如快设备只有两个分组(16个子节)--假设根据加密算法要求每个分组是8个 子节。 读第7-9字节的时候,你应该将第一个分组(1-8)和第二个分组(9-16)读出来,解迷之后再将7-9填到irp中。 在你的源代码中没看到这部分处理! |
|
|