voe
voe
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2405回复:5

请问在vxd里使用ifshook可以将文件操作终止吗?

楼主#
更多 发布于:2001-05-30 00:42
我看到的例程好像都只能分析啊...

最新喜欢:

aasa2aasa2
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2001-05-31 19:34
完全可以。只要直接返回就行了。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
voe
voe
驱动牛犊
驱动牛犊
  • 注册日期2001-05-09
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-06-02 15:09
直接返回?
我return 0或1都死机...
该怎样返回呢?
flyfox
驱动中牛
驱动中牛
  • 注册日期2001-04-05
  • 最后登录2012-08-03
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望22点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-06-07 10:02
如果直接return 0或1,在防止DEL时会有效,但防止打开或查找时,的确会蓝屏,不信,可以测试
一剑西来,天外飞仙
foxs
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于: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
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2001-06-07 15:14
在读写操作时不可以返回的,但你可以在打开文件时返回,这样,读操作就不能完成的。也能起来保护作用。我测试过,在写操作时如果再作其它操作,一般情况下会死机。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
游客

返回顶部