杀毒软件的奥秘

转载 2004年11月03日 11:56:00
        市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加密,文件加密等,也采用了雷同的技术.
由于代码十分简单,不分析了.

//=============================================================================
//
//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[i], 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_Monitored_Files=/
     HeapAllocate( sizeof(_Monitored_Files),HEAPZEROINIT);
    FileEntry->pNext_Monitored_Files->pPre_Monitored_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[i]--;
    }
   }
   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)[i])++;
     }
    }
   }
   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_Monitored_Files=/
     FileEntry->pNext_Monitored_Files;
     FileEntry->pNext_Monitored_Files->pPre_Monitored_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_Monitored_Files=0;
 Monitored_Files.pPre_Monitored_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();
}

《编码的奥秘》目录摘要及读书笔记

本文由Markdown语法编辑器编辑完成。渴望交流是大多数人的天性。在本书中,“编码”通常指一种在人和机器之间进行信息转换的系统。换句话说,编码即是交流。有时我们将编码看得很神秘,其实大多数编码并非都...
  • inter_peng
  • inter_peng
  • 2016年08月06日 01:17
  • 1159

《编码的奥秘》读后感

历经两周左右的时间,终于把《编码的奥秘》这本书看完了。不得不说,这真是一本好书,深入浅出的讲解了大量与计算机与编码有关的东西。十分推荐对计算机有兴趣的朋友看看这本书,无论有没有技术功底,是否专业人士,...
  • u012745215
  • u012745215
  • 2015年05月18日 00:29
  • 3058

杀毒软件实时杀毒的奥秘

杀毒软件实时杀毒的奥秘作者:LuLin市面上所有号称"虚拟机","防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用V...
  • iiprogram
  • iiprogram
  • 2006年05月24日 09:19
  • 1527

关于《编程的奥秘》一书未说完的话

关于《编程的奥秘》一书未说完的话第一部分 写作缘由 2006年1月,在春节前的一星期,我从出版社终于拿到了样书,不久,在海淀图书城的科技书店中也看到了这本书,只不过被摆在一个很不显眼的角落,不知道有没...
  • bitfan
  • bitfan
  • 2006年01月25日 22:33
  • 10739

大学总结之影响我最深的十本书

今天是“世界读书日”,前几天微博上转发非常多的一条微博:“一日不读书,无人看得出;一周不读书,开始会爆粗;一月不读书,智商输给猪”,确实阅读是很重要的,对此我深有体会。大学四年我读了大量的书,其中大多...
  • hazir
  • hazir
  • 2012年04月23日 23:14
  • 3863

读《编码的奥秘》有感

来源见豆瓣:http://book.douban.com/review/1074474/           屈指算来,这几年看过不少计算机书籍,根据经济学中的边际效益递减原理,读书带来的知识的增加和...
  • jj12345jj198999
  • jj12345jj198999
  • 2011年07月23日 17:16
  • 1367

咨询的奥秘--笔记

咨询的奥秘--笔记        随着毕业入职新公司,做SCM的实施顾问,一方面在学习Oracle EBS的相关系统功能,另一方面了解开发相关的PL/SQL、Forms Builder等相关知识,还抽...
  • u012025054
  • u012025054
  • 2015年08月30日 00:35
  • 2024

读Petzold-编码的奥秘-记录

1, 2,
  • tran119
  • tran119
  • 2017年11月27日 16:25
  • 51

杀毒软件工作原理 及 现在主要杀毒技术

卡巴,NORTON,咖啡杀毒软件引擎技术深入探讨一、杀毒软件引擎与病毒库的关系首先必须指出杀毒软件的引擎与其病毒库并没有什么直接的关系。杀毒引擎的任务和功能非常简单,就是对于给定的文件或者程序进程判断...
  • zhangnn5
  • zhangnn5
  • 2011年05月22日 03:17
  • 15137

《算法心得-高效算法的奥秘(原书第2版)》pdf

下载地址:网盘下载 内容简介  · · · · · · 【编辑推荐】 由在IBM工作50余年的资深计算机专家撰写,Amazon全五星评价,算法领域...
  • cf406061841
  • cf406061841
  • 2017年05月27日 19:06
  • 555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杀毒软件的奥秘
举报原因:
原因补充:

(最多只允许输入30个字)