赛迪网 > IT技术 IT技术关注 > 文章
  IT资讯搜索
 
IT产品搜索
[程序开发][网管世界][网络安全][数据库技术]
[操作系统][嘉宾聊天·在线访谈][活动集锦]
[精彩专题][Symantec专区][订阅IT技术周刊]
[开发论坛][网管论坛][安全论坛][数据库论坛]
[操作系统论坛][Sybase专区][IBM dW技术专区]
[病毒求助][病毒与漏洞播报][文档·源码下载]

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

发布时间:2006.11.03 06:44     来源:赛迪网安全社区    作者:LuLin

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

(t116)


[ 发表评论 ] 字体[  ] [ 打印 ] [ 进入博客 ] [ 进入论坛 ]  [ 推荐给朋友 ]
  相关文章
· 黑客成五角大楼主力 美国开辟网络战场 (11-02) · 商务部推动电子认证安全信任体系发展 (11-02)
· 网络威胁:考验企业的“抗击打能力” (11-02) · 业界动态:浅析近期网络安全威胁态势 (11-02)
· 攻克Vista者说:防毒软件没有什么效果 (11-02) · 要小心防范 木马是这样伪装你知道吗 (11-02)
· 恶意软件标准草案研讨后延至下周出台 (11-02) · 恶意软件上演狸猫太子戏 (11-02)
· 利用Sniffer进行DOS攻击流量分析 (11-02) · 假冒中国建设银行的网站 (11-02)
  客户需求反馈表
* 姓  名:
更多资料  了解方案  认识厂商
* 单位名称:
* 联系电话:
* 电子邮件:
  赛迪推荐  
  手机·资费 ·新品·导购·评测·手机资费·宽带
手机搜索  诺基亚 N73 MOTO Z6
  IT产品 ·笔记本·台式机·服务器·打印·投影
IT产品搜索 
  IT技术 ·开发·网管·安全·数据库·操作系统
  信息化 ·热点·专题·访谈·周刊·方案案例
[政务][电信][金融][农业][制造业][中小企业]
[CIO][ERP][协同][IT管理][中间件][电子商务]
[政策][地方][专家][评估][辞典][博客][社区]
· 专题:一路畅通构想曲——让出行不再遭遇堵车
· CIO工作亲历:企业ERP选型不能忽视"选人关"
· 综述:信息化建设给中国监狱带来的各种变化
· 金融业风险管理和法规遵从有五点需考虑的因素
· 保险业CIO关注:该如何建立统一高效的CRM体系
· 调查显示:多数CIO对IT规划仍存在困惑和误解
  博客·论坛 ·曾剑秋·项立刚·Java学习·网管