阅读:2405回复:5
请问在vxd里使用ifshook可以将文件操作终止吗?
我看到的例程好像都只能分析啊...
|
|
最新喜欢:aasa2 |
沙发#
发布于:2001-05-31 19:34
完全可以。只要直接返回就行了。
|
|
|
板凳#
发布于:2001-06-02 15:09
直接返回?
我return 0或1都死机... 该怎样返回呢? |
|
地板#
发布于:2001-06-07 10:02
如果直接return 0或1,在防止DEL时会有效,但防止打开或查找时,的确会蓝屏,不信,可以测试
|
|
|
地下室#
发布于:2001-06-07 14:53
znsoft的那个说明例子不全,说明的有些问题.
如果按照znsoft你说的直接return 0必定down机了.(除了del操作) 而且特别的是在系统发生write操作时不能对其改动也不能简单的 返回0,否则必兰屏. 也许可以通过改动ioreq包的来改变它,但我没式过.(也不想去式). 我把我以前作的贴出来,大家看看.好老的了.我找找... ______________________________________________________ in fileguard if return=0 then perform cancel; convert can't perform in procedure Write. 1999-12-18 ---------------------------------------------------------------- 现在作的这个ifshook还有意义吗?至少在文件保护方面简直没有任何的用处. 因为,一旦推出windows到达dos地下,所谓的vxd也就无用武之地了. 所以,在作下去也是没有意义的了.停下不作了,现在尝试一下其他的 12-20 ------------------------------------------------------------------ 关于hooktdi的. 安装后,应该重起.并安装与系统注册中. 如果应用程序不是通过微软的TCP/IP堆栈而发送的,则不能截获. 一般的如果通过winsock编写的几乎都可以截获.(TCP,UDP) 测试了一下,除了这两种协议外的如.icmp,igmp,arp都不能给截获. 亦即ip层的都不能被截获.(也许可以,但是一定不能截获在网络中的 其他机器的信息.因为,在物理层不属于本包的信息都被抛弃了.猜想中..) 所以,这个的用处也就是本机的通讯的加密. 12-22 -------------------------------------------------------------------- 不甘心又下载了一个fguard反汇编。 Fguard只是处理了open并已eat it!也许是发现open操作就设置 属性为权限不足. 但是他这个的定义在win9x中不是没效吗?只在winnt中才起作用! 12-30 ------------------------------------------------------------------- 我的猜测是对的, 在open阶段is Five(5) Errorcode=5 return(5) 在Rename如果合适可以简单的返回0???为什么?经过测试是可以的 win98 osr2版. 再进一步的测试。 12-30 13:03 -------------------------------------------------------------------- 源码如下: // FILEHOOK.cpp - main module for VxD FILEHOOK #define DEVICE_MAIN #include "filehook.h" #include "vdebug.h" Declare_Virtual_Device(FILEHOOK) #undef DEVICE_MAIN ppIFSFileHookFunc PrevHook; FilehookVM::FilehookVM(VMHANDLE hVM) : VVirtualMachine(hVM) {} FilehookThread::FilehookThread(THREADHANDLE hThread) : VThread(hThread) {} int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType, int CodePage, pioreq pir) { int p; if ((fn==IFSFN_OPEN)||(fn==IFSFN_RENAME)||(fn==IFSFN_DELETE)||(fn==IFSFN_FILEATTRIB)) { path_t temp; char buf[360]; _QWORD i; int k=0; temp=pir->ir_ppath; if(Drive!=0xff){ buf[0]=Drive+'A'-1; buf[1]=':'; k=2; } UniToBCSPath((unsigned char *)&buf[k],temp->pp_elements,260,BCS_WANSI,&i); k=strcmp(buf,"E:\\PP.TXT"); if(k==0){ switch(fn) {case IFSFN_OPEN : pir->ir_error=DWORD(5); //ir_Error=表示没错!!!!! return(5); case IFSFN_RENAME: return(0); break; case IFSFN_DELETE : return(0); break; case IFSFN_FILEATTRIB : pir->ir_error=DWORD(-1); return(DWORD(-1)); } } } p=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); return (p); } BOOL FilehookDevice::OnSysDynamicDeviceInit() { PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook); return TRUE; } BOOL FilehookDevice::OnSysDynamicDeviceExit() { IFSMgr_RemoveFileSystemApiHook(MyIfsHook); return TRUE; } --------------------------------------------------------------------------------------------- 对E盘的pp.txt进行了保护。 1。不可读--〉不可写 2。不能删除 3。不能设置属性 4。不能重命名。 说明:那种服务的IR_ERROR的设置,及返回值都是通过SDK的说明及反编译后的察看所得. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!IMPORTANT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 如前所说,一旦退到了真正的DOS下,或者WINDOWS的安全模式下 VXD都不会得到加载,所有的保护都失去了意义!!!! 今天,整理一下,做成网叶,重新的发到网上去。 可以进行VIRTUAL CDROM的工作了。加油呀。 此文件也要被保护了. 12-30 ------------------------------------------------------------ 今天把文件保护的作了一下加强可以随便保护一个文件. 文件名存于D:\fguard.txt中.只给了一个. // Fguard - include file for VxD FGUARD #include <vtoolscp.h> #define Fguard #define FGUARD_DeviceID UNDEFINED_DEVICE_ID #define FGUARD_Init_Order UNDEFINED_INIT_ORDER #define FGUARD_Major 1 #define FGUARD_Minor 0 class Fguard : public VDevice { public: virtual BOOL OnSysDynamicDeviceInit(); virtual BOOL OnSysDynamicDeviceExit(); virtual DWORD OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams); }; class FguardVM : public VVirtualMachine { public: FguardVM(VMHANDLE hVM); }; class FguardThread : public VThread { public: FguardThread(THREADHANDLE hThread); }; 13:26 00-1-2 ----------------------------------------------------------------------------------------- // Fguard - main module for VxD FGUARD #define DEVICE_MAIN #include "fguard.h" #include "vdebug.h" #include "mycommand.h" Declare_Virtual_Device(FGUARD) #undef DEVICE_MAIN ppIFSFileHookFunc PrevHook; //Fguard::FguardVM(VMHANDLE hVM) : VVirtualMachine(hVM) {} //Fguard::FguardThread(THREADHANDLE hThread) : VThread(hThread) {} char namebuf[200]; BOOL ISINSTALL; int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType, int CodePage, pioreq pir) { int p; if ((fn==IFSFN_OPEN)||(fn==IFSFN_RENAME)||(fn==IFSFN_DELETE)||(fn==IFSFN_FILEATTRIB)) { path_t temp; char buf[360]; _QWORD i; int k=0; temp=pir->ir_ppath; if(Drive!=0xff){ buf[0]=Drive+'A'-1; buf[1]=':'; k=2; } UniToBCSPath((unsigned char *)&buf[k],temp->pp_elements,260,BCS_WANSI,&i); k=strcmp(buf,namebuf); if(k==0){ switch(fn) {case IFSFN_OPEN : pir->ir_error=DWORD(5); return(5); case IFSFN_RENAME: return(0); break; case IFSFN_DELETE : return(0); break; case IFSFN_FILEATTRIB : pir->ir_error=DWORD(-1); return(DWORD(-1)); } } } p=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); return (p); } BOOL Uninstall() { if(!ISINSTALL)return FALSE; IFSMgr_RemoveFileSystemApiHook(MyIfsHook); ISINSTALL=FALSE; return TRUE; } BOOL Fguard::OnSysDynamicDeviceInit() { return TRUE; } BOOL Fguard::OnSysDynamicDeviceExit() { return TRUE; } BOOL Install() { HANDLE fhandle; WORD Error; DWORD getnum; BYTE temp; if(ISINSTALL)return FALSE; fhandle=R0_OpenCreateFile(TRUE,"C:\\FGUARD.TXT",OPEN_ACCESS_READONLY,ATTR_NORMAL,ACTION_IFEXISTS_OPEN,R0_NO_CACHE,&Error,&temp); if(Error!=0)return(FALSE); getnum=R0_ReadFile(TRUE,fhandle,&namebuf[0],200,0,&Error); if(Error!=0){R0_CloseFile(fhandle,&Error);return(FALSE);} R0_CloseFile(fhandle,&Error); namebuf[getnum]=0; PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook); ISINSTALL=TRUE; return TRUE; } DWORD Fguard::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams) { BOOL temp; switch(pDIOCParams->dioc_IOCtlCode) { case INSTALL: temp=Install(); break; case UNINSTALL: temp=Uninstall(); break; defalue: temp=FALSE; } if(!temp)*(pDIOCParams->dioc_bytesret)=1; return 0; } 19:48 00-1-2 ----------------------------------------------------------------------- 调用程序如下 unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; Button4: TButton; procedure Button4Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; const INstall=$1000; const Uninstall=$2000; var Form1: TForm1; hVxD:Cardinal; implementation {$R *.DFM} procedure TForm1.Button4Click(Sender: TObject); begin messagebox(self.handle,'Only Guard A File in C:\Fguard.txt'+#13+#10+' ','Demo GUARD',MB_OK); end; procedure TForm1.Button1Click(Sender: TObject); var cb : longword; begin hVxD:=CreateFile('\\.\Fguard.VXD',0,0,nil,0,FILE_FLAG_OVERLAPPED,0); if hVxD=INVALID_HANDLE_VALUE then begin MessageBox(Handle,'INIT Guard failed!','Error',MB_ICONINFORMATION or MB_OK); exit; end; cb:=0; DeviceIoControl(hVxD,INSTALL,nil,0,nil,0,cb,nil); if(cb=1) then begin showmessage('Guard Failed!');closehandle(hvxd);hvxd:=0;exit;end; Showmessage('Guard OK!'); button1.Enabled :=False; button2.enabled :=True; button3.enabled :=True; end; procedure TForm1.Button2Click(Sender: TObject); var cb : DWORD; begin if(hvxd<>0)then begin cb:=0; DeviceIoControl(hVxD,UNINSTALL,nil,0,nil,0,cb,nil); if(cb=1) then begin Showmessage('UnGuard Failed!'); exit; end; end; Showmessage('UnGuard Success!'); closehandle(hvxd); button1.Enabled :=TRUE; button2.enabled :=FALSE; button3.enabled :=FALSE; end; procedure TForm1.Button3Click(Sender: TObject); begin if(hvxd<>0) then begin showmessage('Always Guard OK'); close; end else showmessage('Guard First!'); end; procedure TForm1.FormCreate(Sender: TObject); begin hvxd:=0; end; end. 19:52 00-1-2 |
|
5楼#
发布于:2001-06-07 15:14
在读写操作时不可以返回的,但你可以在打开文件时返回,这样,读操作就不能完成的。也能起来保护作用。我测试过,在写操作时如果再作其它操作,一般情况下会死机。
|
|
|