杀毒软件实时杀毒的奥秘(含源程序) .txt
上传用户:lcysgg88
上传日期:2007-05-05
资源大小:2k
文件大小:5k
源码类别:

杀毒

开发平台:

Visual C++

  1. 杀毒软件实时杀毒的奥秘(含源程序) 
  2.  
  3.  
  4.  
  5. 作者:7747.Net    文章来源:7747.Net    点击数:1    更新时间:2005-4-26 
  6.  
  7.  
  8. 来源:http://blog.csdn.net/jazzyfree/
  9. 市面上所有号称"虚拟机","_blank">防火墙"的实时监控杀毒软件无一不是使用的IFSHOOK技术.但是同时也有一些朋友不断写MAIL给我打听如何实现读写的监控.下面给出用VTOOLSD写的代码.也就是所有实时杀毒软件的奥秘.同时,很多拦截文件操作的软件,例如对目录加密,文件加密等,也采用了雷同的技术. 
  10. 由于代码十分简单,不分析了. 
  11. //============================================================================= 
  12. // 
  13. //By Lu Lin 2000.5.10 
  14. // Apply with VtoolsD 3.01 
  15. // DDK version is available if requested. 
  16. //Abstract: 
  17. // Install a IFS hook, monitoring any read and write access 
  18. // 
  19. //============================================================================= 
  20. // IFSHOOK.c - main module for IFSHOOK 
  21. #define DEVICE_MAIN 
  22. #include "ifshook.h" 
  23. #undef DEVICE_MAIN 
  24. //typedef EventHdl(pevent pev,pioreq pir); 
  25. typedef struct _Monitored_Files{ 
  26. struct _Monitored_Files *pNext_Monitored_Files;//pointer to next struct 
  27. struct _Monitored_Files *pPre_Monitored_Files;//pointer to previous struct 
  28. int sfn;//system file number 
  29. int open_count; 
  30. char path[260]; //ansi path name 
  31. }_Monitored_Files,*pMonitored_Files; 
  32. // 
  33. //Declare virtual device 
  34. // 
  35. Declare_Virtual_Device(IFSHOOK) 
  36. _Monitored_Files Monitored_Files; 
  37. ppIFSFileHookFunc PrevHook; 
  38. DefineControlHandler(SYS_VM_INIT, OnSysVMInit); 
  39. DefineControlHandler(SYS_DYNAMIC_DEVICE_INIT, OnSysDynamicDeviceInit); 
  40. DefineControlHandler(SYS_DYNAMIC_DEVICE_EXIT, OnSysDynamicDeviceExit); 
  41. DefineControlHandler(SYS_VM_TERMINATE, OnSysVMTerminate); 
  42. PCHAR ConvertPath( int drive, path_t ppath, PCHAR fullpathname ) 
  43. int i = 0; 
  44. _QWORD result; 
  45. // 
  46. // Stick on the drive letter if we know it. 
  47. // 
  48. if( drive != 0xFF ) { 
  49. fullpathname[0] = drive+'A'-1; 
  50. fullpathname[1] = ':'; 
  51. i = 2; 
  52. UniToBCSPath( &fullpathname[i], ppath-〉pp_elements, 260 , BCS_WANSI, &result ); 
  53. return( fullpathname ); 
  54. pMonitored_Files IsFileOpened(int i){ 
  55. pMonitored_Files p=&Monitored_Files; 
  56. while (p){ 
  57. if (i==p-〉sfn){ 
  58. return p; 
  59. p=p-〉pNext_Monitored_Files; 
  60. return 0; 
  61. BOOL ControlDispatcher( 
  62. DWORD dwControlMessage, 
  63. DWORD EBX, 
  64. DWORD EDX, 
  65. DWORD ESI, 
  66. DWORD EDI, 
  67. DWORD ECX) 
  68. START_CONTROL_DISPATCH 
  69. ON_SYS_VM_INIT(OnSysVMInit); 
  70. ON_SYS_DYNAMIC_DEVICE_INIT(OnSysDynamicDeviceInit); 
  71. ON_SYS_DYNAMIC_DEVICE_EXIT(OnSysDynamicDeviceExit); 
  72. END_CONTROL_DISPATCH 
  73. return TRUE; 
  74. int _cdecl MyIfsHook(pIFSFunc pfn, int fn, int Drive, int ResType, 
  75. int CodePage, pioreq pir) 
  76. int retvar,i; 
  77. char fullpathname[260]; 
  78. _Monitored_Files *FileEntry; 
  79. switch(fn){ 
  80. case IFSFN_OPEN:{ 
  81. retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 
  82. ConvertPath( Drive, pir-〉ir_ppath, fullpathname ); 
  83. FileEntry=IsFileOpened(pir-〉ir_sfn); 
  84. if (FileEntry){ 
  85. FileEntry-〉open_count++; 
  86. }else{ 
  87. FileEntry=&Monitored_Files; 
  88. while(1){ 
  89. if (FileEntry-〉pNext_Monitored_Files){ 
  90. FileEntry=FileEntry-〉pNext_Monitored_Files; 
  91. else{ 
  92. break; 
  93. FileEntry-〉pNext_Monitored_Files= 
  94. HeapAllocate( sizeof(_Monitored_Files),HEAPZEROINIT); 
  95. FileEntry-〉pNext_Monitored_Files-〉pPre_Monitored_Files=FileEntry; 
  96. FileEntry=FileEntry-〉pNext_Monitored_Files; 
  97. FileEntry-〉sfn=pir-〉ir_sfn; 
  98. FileEntry-〉open_count=1; 
  99. memcpy(FileEntry-〉path,fullpathname,260); 
  100. return retvar; 
  101. case IFSFN_READ:{ 
  102. //Do something here, 
  103. //eg. Decrypt the file. 
  104. char *str; 
  105. int j; 
  106. str=pir-〉ir_data; 
  107. j=pir-〉ir_length; 
  108. retvar=(*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 
  109. FileEntry=IsFileOpened(pir-〉ir_sfn); 
  110. if (!stricmp("c:\test.txt",FileEntry-〉path)){ 
  111. for (i=0;i〈j;i++){ 
  112. str[i]--; 
  113. return retvar; 
  114. case IFSFN_WRITE:{ 
  115. //Do something here 
  116. //eg. Encrypt the file 
  117. FileEntry=IsFileOpened(pir-〉ir_sfn); 
  118. if (FileEntry){ 
  119. if (!stricmp("c:\test.txt",FileEntry-〉path)){ 
  120. for (i=0;i〈pir-〉ir_length;i++){ 
  121. (((char*)pir-〉ir_data)[i])++; 
  122. return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 
  123. case IFSFN_CLOSE:{ 
  124. FileEntry=IsFileOpened(pir-〉ir_sfn); 
  125. if (FileEntry){ 
  126. FileEntry-〉open_count--; 
  127. if (!FileEntry-〉open_count){ 
  128. FileEntry-〉pPre_Monitored_Files-〉pNext_Monitored_Files= 
  129. FileEntry-〉pNext_Monitored_Files; 
  130. FileEntry-〉pNext_Monitored_Files-〉pPre_Monitored_Files= 
  131. FileEntry-〉pPre_Monitored_Files; 
  132. HeapFree(FileEntry,0); 
  133. return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 
  134. return (*PrevHook)(pfn, fn, Drive, ResType, CodePage, pir); 
  135. BOOL OnSysVMInit(VMHANDLE hVM){ 
  136. return OnSysDynamicDeviceInit(); 
  137. BOOL OnSysDynamicDeviceInit() 
  138. PrevHook = IFSMgr_InstallFileSystemApiHook(MyIfsHook); 
  139. Monitored_Files.pNext_Monitored_Files=0; 
  140. Monitored_Files.pPre_Monitored_Files=0; 
  141. Monitored_Files.sfn=-1; 
  142. Monitored_Files.open_count=0; 
  143. Monitored_Files.path[0]=0; 
  144. return TRUE; 
  145. BOOL OnSysDynamicDeviceExit() 
  146. IFSMgr_RemoveFileSystemApiHook(MyIfsHook); 
  147. return TRUE; 
  148. void OnSysVMTerminate(VMHANDLE hVM){ 
  149. return OnSysDynamicDeviceExit(); 
  150.