杀毒软件实时杀毒的奥秘

转载 2006年05月24日 09:19:00

杀毒软件实时杀毒的奥秘

作者:LuLin

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

免杀(杀毒软件杀毒原理)

坑坑洼洼近两年,虽然有碰过些免杀工具(加壳、加花、修改特征码),但是并没有真正的去学这门技术。直到现在才知道发展近二十年的传统免杀技术,基本已经濒临淘汰,而主流变成了Rootkit。感觉心里酸酸的,现...

杀毒软件的杀毒原理

病毒检测的方法 在与病毒的对抗中,及早发现病毒很重要。早发现,早处置,可以减少损失。检测病毒方法有:特征代码法、校验和法、行为监测法、软件模拟法。这些方法依据的原理不同,实现时所需开销不同,检测范围...

百度杀毒软件---全新的杀毒体验:轻巧!免费!干净!绿色!

百度杀毒是百度公司与计算机反病毒专家卡巴斯基合作出品的全新杀毒软件,集合了百度强大的云端计算、海量数据学习能力与卡巴斯基反病毒引擎专业能力,一改杀毒软件卡机臃肿的形象,竭力为用户提供轻巧不卡机的产品体...

很给力!360杀毒获评“年度最佳安全杀毒软件”

中新网1月25日电 日前,新浪数码频道“2010年度数码风云榜”评奖活动结果正式揭晓,2010年颇受瞩目的 360杀毒表现抢眼,获得了网友和专业评委的一致肯定,在入围的国内外21款杀毒软件中脱颖而出,...

超好用的免费杀毒软件-360杀毒

  • 2010年07月09日 22:47
  • 10.04MB
  • 下载

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

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

百度杀毒卡巴斯基杀毒软件引擎

  • 2016年01月09日 22:55
  • 41.68MB
  • 下载

浅析杀毒软件开发原理(之查毒引擎)

/* 网上搜到这篇博文,虽然年代有点久,但是对新手来说,适合。 转载自:http://hi.baidu.com/coderui/blog/item/0b90bf43ed69541073f05d4f...
  • BetaBin
  • BetaBin
  • 2012年03月23日 11:29
  • 1362
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:杀毒软件实时杀毒的奥秘
举报原因:
原因补充:

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