阅读:2785回复:12
对*.txt和*.doc的动态加密(尤其vcmfc,coolice两位大老看看)
对*.txt mj_read和mj_write的时候到底什么时候要处理,我搞的好乱啊
Irp->Flags & IRP_PAGING_IO or Irp->Flags & IRP_NOCACHE 时候? *.doc文件就更是一塌糊涂了 那么多irp,晕啊 thanks! |
|
|
沙发#
发布于: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时,写进去好像是对的,但读出来又是错的! 好郁闷啊 |
|
|
板凳#
发布于: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 到底应该处理哪个?而又不应该处理哪个? |
|
|
地板#
发布于: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 |
|
地下室#
发布于:2003-03-18 21:19
看别人的代码好累,暂时只看到以下毛病: 按照这样说的话,那就是对于对txt文件的读和写的时候 对这些情况都处理 (Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO),这样的话加密还是乱了 每保存一次(写一次),数据就反了,意思是如果原来显示的是加密的数据,写一次之后重开显示的就是解密了的数据,如果显示的是解密的数据,写一次之后重开显示的就是加密的数据了 |
|
|
5楼#
发布于:2003-03-18 21:26
楼主:
你做成了吗? 我按照你的代码加试了一下,再按Coolice大大建议修改,最后读的时候还是不能解密。是不是用户缓冲区地址有问题了? 做成了能不能把代码给我看看 nudtbaoah@etang.com |
|
6楼#
发布于:2003-03-18 21:51
你快懒成白鼻子黑猫了!
为什么这么说呢? 话说有个懒人到阎王那里转世,阎王问他:你来世想作什么呀?人?狗?... 这人不紧不慢地说:那就让我来世作只白鼻子黑猫了吧! 阎王奇怪道:Why? 答:作只白鼻子黑猫,到晚上老鼠看见我的白鼻子,还以为是块年糕,就跑过来吃,这样就跑到我的嘴边了。我就可以不用动就有得吃了! |
|
7楼#
发布于:2003-03-18 23:50
晕,这不是学习吗,谁都有这一步啊
再说,做的又不一样,真是的! |
|
8楼#
发布于:2003-03-21 17:01
问题出在写上:你是不是直接把pInData里的数据加密呢.
我出现过跟你同样的问题.你得自己分配一块空间-加密-传给系统 :D |
|
|
9楼#
发布于:2003-03-27 16:28
我发现这是因为READ的问题。文件改变以后,再读文件还是不能满足 (Irp->Flags&IRP_NOCACHE)||(Irp->Flags&IRP_PAGING_IO)||(Irp->Flags&IRP_SYNCHRONOUS_PAGING_IO)这个条件,所以没有解密,再加密回去当然就反了。 为什么文件改变后再读文件,不会发出上面三种IRP?哪位大侠能解释一下,多谢!! :D |
|
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需要重新读硬盘中的数据。 |
|
|
11楼#
发布于:2003-03-31 09:44
我不知道我说的是否对,只做参考: 谢谢nustzhua !你说的很对。 这两天做了测试,实际上原因==KU==KU==已经说了,只是当时没有理解。更详细的步骤可以在“关于文件的加密问题,(动态和静态的结合) ”这个帖中找到,VCMFC的发言。 :D |
|
12楼#
发布于:2003-03-31 09:52
兄弟,下一次最好给出一个链接,不要给个题目,还要大家去搜索。麻烦。
|
|
|