手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>服务器技术>安全防护>列表

杀毒软件实时杀毒的奥秘(vxd文件监控)

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

市面上所有号称“虚拟机”,“防火墙”的实时监控杀毒软件无一不是使用的IFSHOOK技术。但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控。下面给出用VTOOLSD写的代码,也就是所有实时杀毒软件的奥秘。同时,很多拦截文件操作的软件,例如对目录加密,文件加密等,也采用了雷同的技术。

由于代码十分简单,不分析了。

CODE:



//================================================

// 

//By Lu Lin 2000.5.10 

// Apply with VtoolsD 3.01 

// DDK version is available if requested. 

//Abstract: 

// Install a IFS hook, monitoring any read and write access 

// 

//================================================

// IFSHOOK.c - main module for IFSHOOK 



#define  DEVICE_MAIN 

#include "ifshook.h" 

#undef  DEVICE_MAIN  



//typedef EventHdl(pevent pev,pioreq pir); 



typedef struct _Monitored_Files{ 

struct _Monitored_Files *pNext_Monitored_Files;//pointer to next struct 

struct _Monitored_Files *pPre_Monitored_Files;//pointer to previous struct 

int sfn;//system file number 

int open_count; 

char path[260]; //ansi path name 

}_Monitored_Files,*pMonitored_Files; 



// 

//Declare virtual device 

// 

Declare_Virtual_Device(IFSHOOK) 



_Monitored_Files Monitored_Files; 

ppIFSFileHookFunc PrevHook; 



DefineControlHandler(SYS_VM_INIT, OnSysVMInit); 

DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit); 

DefineControlHandler(SYS_DYNAMIC_DEVICE_EXIT, OnSysDynamicDeviceExit); 

DefineControlHandler(SYS_VM_TERMINATE, OnSysVMTerminate); 



PCHAR ConvertPath( int drive, path_t ppath, PCHAR fullpathname ) 

{ 

  int i = 0; 

  _QWORD result; 



  // 

  // Stick on the drive letter if we know it. 

  // 

  if( drive != 0xFF ) { 



    fullpathname[0] = drive "A"-1; 

    fullpathname[1] = ":"; 

    i = 2; 

  } 

  UniToBCSPath( &fullpathname, ppath->pp_elements, 260 , BCS_WANSI, &result ); 

  return( fullpathname ); 

} 



pMonitored_Files IsFileOpened(int i){ 

pMonitored_Files p=&Monitored_Files; 



while (p){ 

 if (i==p->sfn){ 

  return p; 

 } 

 p=p->pNext_Monitored_Files; 

} 

return 0; 

} 



BOOL ControlDispatcher( 

DWORD dwControlMessage, 

DWORD EBX, 

DWORD EDX, 

DWORD ESI, 

DWORD EDI, 

DWORD ECX) 

{ 

START_CONTROL_DISPATCH 



 ON_SYS_VM_INIT(OnSysVMInit); 

 ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit); 

 ON_SYS_DYNAMIC_DEVICE_EXIT(OnSysDynamicDeviceExit); 



END_CONTROL_DISPATCH 



return TRUE; 

} 



int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType, 

 int CodePage, pioreq pir) 

{ 

int retvar,i; 

char fullpathname[260]; 

_Monitored_Files *FileEntry; 

switch(fn){ 

 case IFSFN_OPEN:{ 

  retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 

  ConvertPath( Drive, pir->ir_ppath, fullpathname ); 

  FileEntry=IsFileOpened(pir->ir_sfn); 

  if (FileEntry){ 

  FileEntry->open_count  ; 

  }else{ 

  FileEntry=&Monitored_Files; 

  while(1){ 

   if (FileEntry->pNext_Monitored_Files){ 

   FileEntry=FileEntry->pNext_Monitored_Files; 

   } 

   else{ 

   break; 

   } 

  } 

  FileEntry->pNext_Mon_itored_Files= 

   HeapAllocate( sizeof(_Monitored_Files),HEAPZEROINIT); 

  FileEntry->pNext_Monitored_Files->pPre_Mon_itored_Files=FileEntry; 

  FileEntry=FileEntry->pNext_Monitored_Files; 

  FileEntry->sfn=pir->ir_sfn; 

  FileEntry->open_count=1; 

  memcpy(FileEntry->path,fullpathname,260); 

  } 

  return retvar; 

 } 



 case IFSFN_READ:{ 

  //Do something here, 

  //eg. Decrypt the file. 

  char *str; 

  int j; 

  str=pir->ir_data; 

  j=pir->ir_length; 

  retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 

  FileEntry=IsFileOpened(pir->ir_sfn); 

  if (!stricmp("c:\test.txt",FileEntry->path)){ 

  for (i=0;i<j;i  ){ 

   str--; 

  } 

  } 

  return retvar; 

 } 



 case IFSFN_WRITE:{ 

  //Do something here 

  //eg. Encrypt the file 

  FileEntry=IsFileOpened(pir->ir_sfn); 

  if (FileEntry){ 

  if (!stricmp("c:\test.txt",FileEntry->path)){ 

   for (i=0;i<pir->ir_length;i  ){ 

   (((char*)pir->ir_data))  ; 

   } 

  } 

  } 

  return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 

 } 



 case IFSFN_CLOSE:{ 

  FileEntry=IsFileOpened(pir->ir_sfn); 

  if (FileEntry){  

  FileEntry->open_count--; 

  if (!FileEntry->open_count){ 

   FileEntry->pPre_Monitored_Files->pNext_Mon_itored_Files= 

   FileEntry->pNext_Monitored_Files; 

   FileEntry->pNext_Monitored_Files->pPre_Mon_itored_Files= 

   FileEntry->pPre_Monitored_Files; 

   HeapFree(FileEntry,0); 

   } 

  } 

  return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 

 } 



}  



return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 

} 



BOOL OnSysVMInit(VMHANDLE hVM){ 

return OnSysDynamicDeviceInit(); 

} 



BOOL OnSysDynamicDeviceInit() 

{ 

PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook); 

Monitored_Files.pNext_Mon_itored_Files=0; 

Monitored_Files.pPre_Mon_itored_Files=0; 

Monitored_Files.sfn=-1; 

Monitored_Files.open_count=0; 

Monitored_Files.path[0]=0; 



return TRUE; 

} 



BOOL OnSysDynamicDeviceExit() 

{ 

IFSMgr_RemoveFileSystemApiHook(MyIfsHook); 

return TRUE; 

} 



void OnSysVMTerminate(VMHANDLE hVM){ 

return OnSysDynamicDeviceExit(); 

}

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!