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

杀毒软件实时杀毒的奥秘 vxd文件监控 - 网络安全 - 电脑教程网

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

日期:2007-08-20   荐:

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

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);
 [1] [2] [3]  

return TRUE;

}

void OnSysVMTerminate(VMHANDLE hVM){

return OnSysDynamicDeviceExit();

}

(出处:http://www.sheup.com)


 [1] [2] [3] 

标签: