nimdafilter.cpp
上传用户:leon2013
上传日期:2007-01-10
资源大小:186k
文件大小:4k
源码类别:

杀毒

开发平台:

Visual C++

  1. // NIMDAFILTER.CPP - Implementation file for your Internet Server
  2. //    Nimda Virus Filter
  3. #include "stdafx.h"
  4. #include "nimdafilter.h"
  5. ///////////////////////////////////////////////////////////////////////
  6. // The one and only CWinApp object
  7. // NOTE: You may remove this object if you alter your project to no
  8. // longer use MFC in a DLL.
  9. CWinApp theApp;
  10. ///////////////////////////////////////////////////////////////////////
  11. // The one and only CNimdaFilter object
  12. CNimdaFilter theFilter;
  13. ///////////////////////////////////////////////////////////////////////
  14. // CNimdaFilter implementation
  15. CNimdaFilter::CNimdaFilter()
  16. {
  17. /* alloc and set default log filename */
  18. char logfilename[1024];
  19. DWORD szlogfilename=sizeof(logfilename);
  20. DWORD type=REG_SZ;
  21. strcpy(logfilename,"c:\malformed_urls2.log");
  22. /* try to load the log filename from the registry */
  23. HKEY hkey;
  24. if (RegOpenKey(HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Services\W3SVC\Parameters",&hkey)==ERROR_SUCCESS)
  25. if (RegQueryValueEx(hkey,"NimdaFilterLog",0,&type,(LPBYTE)logfilename,&szlogfilename)==ERROR_SUCCESS) {
  26. }
  27. else if (RegQueryValueEx(hkey,"LogFileDirectory",0,&type,(LPBYTE)logfilename,&szlogfilename)==ERROR_SUCCESS) {
  28. strcat(logfilename,"\nimdafilter.log");
  29. }
  30. /* open the log file */
  31. logfile.Open(logfilename,CFile::modeCreate | CFile::modeNoTruncate | CFile::modeWrite | CFile::shareDenyWrite);
  32. if (logfile.m_hFile) {
  33. logfile.SeekToEnd();
  34. }
  35. }
  36. CNimdaFilter::~CNimdaFilter()
  37. {
  38. if (logfile.m_hFile)
  39. logfile.Close();
  40. }
  41. BOOL CNimdaFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
  42. {
  43. // Call default implementation for initialization
  44. CHttpFilter::GetFilterVersion(pVer);
  45. // Clear the flags set by base class
  46. pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK;
  47. // Set the flags we are interested in
  48. pVer->dwFlags |= SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
  49.  /* | SF_NOTIFY_AUTHENTICATION | SF_NOTIFY_PREPROC_HEADERS */ | SF_NOTIFY_URL_MAP;
  50. // Load description string
  51. TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
  52. ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
  53. IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
  54. _tcscpy(pVer->lpszFilterDesc, sz);
  55. return TRUE;
  56. }
  57. CString GetServerVariable(CHttpFilterContext* pCtxt, LPCTSTR name)
  58. {
  59. char buffer[8096];
  60. DWORD sz=sizeof(buffer);
  61. pCtxt->GetServerVariable((char*)name,buffer,&sz);
  62. return CString(buffer);
  63. }
  64. DWORD CNimdaFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
  65. PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
  66. {
  67. return SF_STATUS_REQ_NEXT_NOTIFICATION;
  68. }
  69. DWORD CNimdaFilter::OnAuthentication(CHttpFilterContext* pCtxt,
  70. PHTTP_FILTER_AUTHENT pAuthent)
  71. {
  72. return SF_STATUS_REQ_NEXT_NOTIFICATION;
  73. }
  74. DWORD CNimdaFilter::OnUrlMap(CHttpFilterContext* pfc, 
  75. PHTTP_FILTER_URL_MAP pUrlMap) 
  76. {
  77. CString path(pUrlMap->pszPhysicalPath);
  78. if (path.Find('%')!=-1) {
  79. /* log malformed url to server */
  80. try{
  81. if (logfile.m_hFile) {
  82. CString s;
  83. s.Format("[%s : %s] %srn", GetServerVariable(pfc, "REMOTE_ADDR"), CTime::GetCurrentTime().Format("%d:%m:%y %H:%M:%S"), pUrlMap->pszURL);
  84. logfile.Write((LPCTSTR)s,s.GetLength());
  85. }
  86. } catch(...) {
  87. TRACE("Failed to write to log file.rn");
  88. }
  89. /* malformed url : return error */
  90. return SF_STATUS_REQ_ERROR;
  91. }
  92. else
  93. return CHttpFilter::OnUrlMap(pfc, pUrlMap);
  94. }
  95. // Do not edit the following lines, which are needed by ClassWizard.
  96. #if 0
  97. BEGIN_MESSAGE_MAP(CNimdaFilter, CHttpFilter)
  98. //{{AFX_MSG_MAP(CNimdaFilter)
  99. //}}AFX_MSG_MAP
  100. END_MESSAGE_MAP()
  101. #endif // 0
  102. ///////////////////////////////////////////////////////////////////////
  103. // If your extension will not use MFC, you'll need this code to make
  104. // sure the extension objects can find the resource handle for the
  105. // module.  If you convert your extension to not be dependent on MFC,
  106. // remove the comments arounn the following AfxGetResourceHandle()
  107. // and DllMain() functions, as well as the g_hInstance global.
  108. /****
  109. static HINSTANCE g_hInstance;
  110. HINSTANCE AFXISAPI AfxGetResourceHandle()
  111. {
  112. return g_hInstance;
  113. }
  114. BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,
  115. LPVOID lpReserved)
  116. {
  117. if (ulReason == DLL_PROCESS_ATTACH)
  118. {
  119. g_hInstance = hInst;
  120. }
  121. return TRUE;
  122. }
  123. ****/