TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:2235回复:18

大家帮忙看看,filedisk加解密读写不能格式化盘的问题(代码)

楼主#
更多 发布于:2004-07-06 20:18
下面的代码生成的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]

最新喜欢:

cyliucyliu
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-07-06 20:20
文章标题 各位老大帮帮忙,我给filedisk使用rc4加密读写,怎么就无法格式化生成的盘呢?  

各位老大帮帮忙,我给filedisk使用rc4加密读写,怎么就无法格式化生成的盘呢?
使用的RC4算法在普通win32程序(MFC)里点问题都没有,完全可以正常的加解密。
搜遍了整个论坛,就是没看到一个完整的关于filedisk加解密的例子。郁闷啊!始终都弄不好,都有点泄气了。
在那个“文件系统驱动”群里叫拜师学艺也没人理,呵呵,没办法。

最近工作又不顺利,很郁闷啊,别人没完成工作说是因为我的关系,很不爽啊!

喜欢搞驱动,但感觉好难啊!希望大家帮帮忙啊!先谢谢了!
不想一直都搞数据库。不是特别喜欢。还是喜欢搞系统方面的了。
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-07-06 20:22
源代码如下:
哪为兄弟帮忙改改啊!!
附件名称/大小 下载次数 最后更新
2004-07-06_FILEDISK.RAR (11KB)  59
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-07-07 12:23
没人看???郁闷~~~~~~~~~~~~
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-07-08 12:58
郁闷!
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-07-08 18:55
??????????????
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
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) ;
}
}
}
但没有发现有错误输出,说明加密部分没有问题
可能是其他地方出了问题
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-07-08 19:58
实在是太感谢了,先前实在是太郁闷了,一直没人理啊!
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-07-08 20:01
不用谢,我正好有空看看
没有帮你找到问题的根源,实在抱歉
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-07-08 20:21
呵呵,没关系啊!
先前都快对论坛的这些兄弟些快绝望了。
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
limeng1975
驱动牛犊
驱动牛犊
  • 注册日期2004-03-08
  • 最后登录2013-04-11
  • 粉丝0
  • 关注0
  • 积分51分
  • 威望6点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-07-09 13:52
我也碰到过无法格式化的情况,可能是在写该分区的头部数据时,加密的数据在写了以后再解密时无法恢复成正确的明文了,所以不能完成格式化
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-07-10 17:51
感觉代码没有错啊!实在是找不到问题所在了,
驱动程序的调试又弄不来,郁闷啊!
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-07-12 15:31
do not use rc4 ,change it
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-07-13 13:02
晕,wowocock老大都这样说了,好象真的没希望了。
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
deltanet
驱动牛犊
驱动牛犊
  • 注册日期2004-02-19
  • 最后登录2008-12-22
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-07-22 08:53
我用过DES算法按扇区加密是可以格式化的,不过后来算法的加密方式改了之后就无法格式化了。
我还是有那个疑问就是格式化时先进入IRP_MJ_READ那不还是先解密吗?
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-07-22 12:43
我用过DES算法按扇区加密是可以格式化的,不过后来算法的加密方式改了之后就无法格式化了。
我还是有那个疑问就是格式化时先进入IRP_MJ_READ那不还是先解密吗?

我很粗略的看了一下你的代码,
应该是边界对齐的问题。
分组加密和解密的边界没有对其
不停学习
TH1999
驱动小牛
驱动小牛
  • 注册日期2004-03-30
  • 最后登录2013-01-22
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望66点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-07-22 22:19
谢谢各位的帮忙啊!!
终于知道点眉目了,真的是一愁莫展啊!!

我现在连驱动怎么调试都不知道啊!
看了点点资料,还是操作不来!
怎么才可以象VC IDE调试时能看到代码。
晕啊!!

还有,也不知道怎么去对齐。
记不起对齐的代码了,是使用
pragma指令吧?后面的指令忘了,
因为在网吧,自己的机器上不了网。
也看不到MSDN,没办法,晕!!
[img]http://61.128.167.6/uploadFace/2127_200421415585766440.gif[/img]
ysr
ysr
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2015-01-29
  • 粉丝0
  • 关注0
  • 积分79分
  • 威望48点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-07-23 11:15
一字节对齐的例子:

#pragma pack(push, 1)

your structure

#pragma pack(pop)
punk
驱动小牛
驱动小牛
  • 注册日期2001-04-07
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分621分
  • 威望164点
  • 贡献值0点
  • 好评度60点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-07-23 13:23
谢谢各位的帮忙啊!!
终于知道点眉目了,真的是一愁莫展啊!!

我现在连驱动怎么调试都不知道啊!
看了点点资料,还是操作不来!
怎么才可以象VC IDE调试时能看到代码。
晕啊!!

还有,也不知道怎么去对齐。
记不起对齐的代码了,是使用
pragma指令吧?后面的指令忘了,
因为在网吧,自己的机器上不了网。
也看不到MSDN,没办 法,晕!!


我说的对齐可不是用pragma对齐,
我是指分组队齐!
比如快设备只有两个分组(16个子节)--假设根据加密算法要求每个分组是8个
子节。
读第7-9字节的时候,你应该将第一个分组(1-8)和第二个分组(9-16)读出来,解迷之后再将7-9填到irp中。
在你的源代码中没看到这部分处理!
不停学习
游客

返回顶部