Ice@P
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2785回复:12

对*.txt和*.doc的动态加密(尤其vcmfc,coolice两位大老看看)

楼主#
更多 发布于:2003-03-14 21:32
对*.txt mj_read和mj_write的时候到底什么时候要处理,我搞的好乱啊
Irp->Flags & IRP_PAGING_IO or Irp->Flags & IRP_NOCACHE 时候?


*.doc文件就更是一塌糊涂了
那么多irp,晕啊

thanks!
认认真真过一生
Ice@P
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-03-15 10:17
补充一下:

我的程序如下:

complete routine of read
//----------------------------------


switch(Irp->RequestorMode)
{
case KernelMode:

if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdl(Irp->MdlAddress);

}else
{
pInData = (CHAR *) Irp->AssociatedIrp.SystemBuffer;
}
getdata=TRUE;

break;
case UserMode:

pInData = (CHAR *) Irp->UserBuffer;
getdata=TRUE;
break;
default:
DbgPrint((\"Other Mode\\n\"));
ASSERT(FALSE);
break;
}


try
{
if(getdata&&pInData)
{
DbgPrint((\"get the data and begin decrypt \\n\"));
length=strlen(pInData);
   for ( i =0;i <length; i++ )
{  
//                a1=pInData<<8;
// a2=pInData>>8;
// pInData=a1|a2;
                if ( pInData >=\'a\' && pInData <= \'z\' )
{
pInData = pInData -\'a\' + \'A\';
}else if ( pInData >=\'A\' && pInData <= \'Z\' )
{
pInData = pInData -\'A\' + \'a\';
}else{}

}
}
}
except(1)
{
      ASSERT(FALSE);
    }


mj_write 的时候:



switch(Irp->RequestorMode)
{
case KernelMode:
DbgPrint((\"***************KernelMode \\n\"));

if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdl(Irp->MdlAddress);

}else
{
pInData = (CHAR *) Irp->AssociatedIrp.SystemBuffer;
}
getdata=TRUE;


break;
case UserMode:
DbgPrint((\"***********UserMode \\n\"));

pInData = (CHAR *) Irp->UserBuffer;
getdata=TRUE;
break;
default:
DbgPrint((\"Other Mode\\n\"));
ASSERT(FALSE);
break;
}


try
{
if(getdata&&pInData)
{
DbgPrint((\"get the data and begin encrypt \\n\"));
length=strlen(pInData);
   for ( i =0;i <length; i++ )
{

// a1=pInData<<8;
// a2=pInData>>8;
// pInData=a1|a2;

if ( pInData >=\'a\' && pInData <= \'z\' )
{
pInData = pInData -\'a\' + \'A\';
}else if ( pInData >=\'A\' && pInData <= \'Z\' )
{
pInData = pInData -\'A\' + \'a\';
}else{}
}
}
}
except(1)
{
      ASSERT(FALSE);
    }



这样的话当read txt文件时成功的将原文件处理了(大写变小写,小写变大写);
但当写入的时候 好像就乱了,写入的好像就不正确
但如果在写的时候只处理Irp->Flags & IRP_NOCACHE,后者不处理这个Irp->Flags & IRP_NOCACHE时,写进去好像是对的,但读出来又是错的!

好郁闷啊
认认真真过一生
Ice@P
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-03-15 10:32
在补充一条:

用notepad打开txt时:
read只有一个:
Explorer.exe:712 IRP_MJ_READ* D:\\Downloads\\readme.txt SUCCESS Offset: 0 Length: 4096
这个是PAGINGIO

write时有两个:

NOTEPAD.EXE:876 IRP_MJ_WRITE D:\\Downloads\\readme.txt SUCCESS Offset: 0 Length: 194

System:8 IRP_MJ_WRITE* D:\\Downloads\\readme.txt SUCCESS Offset: 0 Length: 4096
这个是pagingio

到底应该处理哪个?而又不应该处理哪个?

认认真真过一生
Coolice
驱动小牛
驱动小牛
  • 注册日期2002-11-13
  • 最后登录2003-08-22
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-18 10:20
看别人的代码好累,暂时只看到以下毛病:
1. Irp->RequestorMode 不需要判断

2.
if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdl(Irp->MdlAddress);

}else
{
pInData = (CHAR *) Irp->AssociatedIrp.SystemBuffer;
}
改成
if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

}else
{
pInData = (CHAR *) Irp->UserBuffer;
}

3. Flags处理IRP_NOCACHE / IRP_PAGING_IO / IRP_SYNCHRONOUS_PAGING_IO

4. 那两个带*号的READ/WRITE就是
IRP_PAGING_IO / IRP_SYNCHRONOUS_PAGING_IO
Ice@P
驱动牛犊
驱动牛犊
  • 注册日期2002-12-09
  • 最后登录2003-10-18
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-18 21:19
看别人的代码好累,暂时只看到以下毛病:
1. Irp->RequestorMode 不需要判断

2.
if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdl(Irp->MdlAddress);

}else
{
pInData = (CHAR *) Irp->AssociatedIrp.SystemBuffer;
}
改成
if ( Irp->MdlAddress )
{
pInData = (CHAR *) MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);

}else
{
pInData = (CHAR *) Irp->UserBuffer;
}

3. Flags处理IRP_NOCACHE / IRP_PAGING_IO / IRP_SYNCHRONOUS_PAGING_IO

4. 那两个带*号的READ/WRITE就是
IRP_PAGING_IO / IRP_SYNCHRONOUS_PAGING_IO
 


按照这样说的话,那就是对于对txt文件的读和写的时候
对这些情况都处理                
(Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO),这样的话加密还是乱了

每保存一次(写一次),数据就反了,意思是如果原来显示的是加密的数据,写一次之后重开显示的就是解密了的数据,如果显示的是解密的数据,写一次之后重开显示的就是加密的数据了



认认真真过一生
youthgift
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2010-09-01
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望14点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-18 21:26
楼主:
你做成了吗?
我按照你的代码加试了一下,再按Coolice大大建议修改,最后读的时候还是不能解密。是不是用户缓冲区地址有问题了?
做成了能不能把代码给我看看

nudtbaoah@etang.com
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-03-18 21:51
你快懒成白鼻子黑猫了!
为什么这么说呢?
话说有个懒人到阎王那里转世,阎王问他:你来世想作什么呀?人?狗?...
这人不紧不慢地说:那就让我来世作只白鼻子黑猫了吧!
阎王奇怪道:Why?
答:作只白鼻子黑猫,到晚上老鼠看见我的白鼻子,还以为是块年糕,就跑过来吃,这样就跑到我的嘴边了。我就可以不用动就有得吃了!
youthgift
驱动牛犊
驱动牛犊
  • 注册日期2002-11-11
  • 最后登录2010-09-01
  • 粉丝0
  • 关注0
  • 积分41分
  • 威望14点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-03-18 23:50
晕,这不是学习吗,谁都有这一步啊

再说,做的又不一样,真是的!
=ku=ku=
驱动牛犊
驱动牛犊
  • 注册日期2003-01-16
  • 最后登录2010-12-02
  • 粉丝0
  • 关注0
  • 积分14分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-03-21 17:01
问题出在写上:你是不是直接把pInData里的数据加密呢.
我出现过跟你同样的问题.你得自己分配一块空间-加密-传给系统


 :D
*__*
outens
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-03-27 16:28


按照这样说的话,那就是对于对txt文件的读和写的时候
对这些情况都处理                
(Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO),这样的话加密还是乱了

每保存一次(写一次),数据就反了,意思是如果原来显示的是加密的数据,写一次之后重开显示的就是解密了的数据,如果显示的是解密的数据,写一次之后重开显示的就是加密的数据了


我发现这是因为READ的问题。文件改变以后,再读文件还是不能满足
(Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO)这个条件,所以没有解密,再加密回去当然就反了。
为什么文件改变后再读文件,不会发出上面三种IRP?哪位大侠能解释一下,多谢!!

 :D
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2003-03-28 10:31
我不知道我说的是否对,只做参考:
如果文件打开后再读,file system driver可能到cach manger去读数据而不向下传递irp.
Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO
这些标记表明file system driver需要重新读硬盘中的数据。
不限容量的免费邮箱 www.k65.net
outens
驱动牛犊
驱动牛犊
  • 注册日期2002-11-13
  • 最后登录2005-04-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-03-31 09:44
我不知道我说的是否对,只做参考:
如果文件打开后再读,file system driver可能到cach manger去读数据而不向下传递irp.
Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO
这些标记表明file system driver需要重新读硬盘中的数据。


谢谢nustzhua !你说的很对。
这两天做了测试,实际上原因==KU==KU==已经说了,只是当时没有理解。更详细的步骤可以在“关于文件的加密问题,(动态和静态的结合) ”这个帖中找到,VCMFC的发言。 :D
nustzhua
驱动中牛
驱动中牛
  • 注册日期2002-06-19
  • 最后登录2015-09-27
  • 粉丝0
  • 关注0
  • 积分18分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-31 09:52
兄弟,下一次最好给出一个链接,不要给个题目,还要大家去搜索。麻烦。
不限容量的免费邮箱 www.k65.net
游客

返回顶部