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

2008-02-23 06:57:52来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

市面上所有号称“虚拟机”,“防火墙”的实时监控杀毒软件无一不是使用的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(); 

}

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:深入了解 网上十大经典黑客软件曝光

下一篇:详细解说iexplore.exe是进程还是病毒