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

杀毒

开发平台:

Visual C++

  1. // w32_nimda.cpp: implementation of the w32_nimda_a class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "w32_nimda.h"
  6. #ifdef _DEBUG
  7. #undef THIS_FILE
  8. static char THIS_FILE[]=__FILE__;
  9. #define new DEBUG_NEW
  10. #endif
  11. #define TEMP_FILENAME "c:\temp.exe"
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. VirusKiller::SCANRESULT w32_nimda_a::Clean(LPCTSTR file)
  16. {
  17. /* extract file name */
  18. int brk;
  19. CString filename(file);
  20. if ((brk=filename.ReverseFind('\'))==-1) brk=0;
  21. filename=filename.Mid(brk+1);
  22. /* automatically delete dlls that are pure virus */
  23. filename.MakeLower();
  24. if ((filename.Find("riched")!=-1) || (filename=="load.exe") || (filename=="load32.exe") || (filename.Find("tmp.exe")!=-1) )
  25. {
  26. if (DeleteFile(file))
  27. return VIRUS_DELETED;
  28. else
  29. return VIRUS_ERR;
  30. }
  31. /* get a handle to the executable */
  32. try{
  33. HMODULE hfile = LoadLibrary(file);
  34. if (hfile) {
  35. /* if(!EnumResourceTypes(hfile,s_enumresourcetypes,(long)this))
  36. return VirusKiller::ERR;
  37. */
  38. /* find handle to resource containing origional code */
  39. HRSRC src=FindResource(hfile, MAKEINTRESOURCE(0x66), MAKEINTRESOURCE(0x0A));
  40. if (src) {
  41. int origional_file_size=SizeofResource(hfile,src);
  42. HGLOBAL origional_file=LoadResource(hfile,src);
  43. /* save to temp file */
  44. FILE* fp;
  45. if (fp=fopen(TEMP_FILENAME,"wb")) {
  46. if (fwrite(origional_file, 1, origional_file_size, fp)<origional_file_size) {
  47. TRACE("Writing origional uninfected file from '%s' failed.rn",file);
  48. fclose(fp);
  49. return VIRUS_ERR;
  50. }
  51. /* close temp file */
  52. fclose(fp);
  53. }
  54. /* close the resource */
  55. if (!FreeLibrary(hfile)) {
  56. TRACE("Error deleting infected file '%s', GetLastError returned %d.rn",file,GetLastError());
  57. return VIRUS_ERR;
  58. }
  59. /* delete the infected file */
  60. if (!DeleteFile(file)) {
  61. TRACE("Error deleting infected file '%s', GetLastError returned %d.rn",file,GetLastError());
  62. return VIRUS_ERR;
  63. }
  64. /* move to origional filename */
  65. if (!MoveFile(TEMP_FILENAME,file)) {
  66. TRACE("Error deleting infected file '%s', GetLastError returned %d.rn",file,GetLastError());
  67. return VIRUS_ERR;
  68. }
  69. return VIRUS_CLEANED;
  70. }
  71. else
  72. return VIRUS_SCANNED;
  73. }
  74. else
  75. return VIRUS_ERR;
  76. } catch(...) {
  77. TRACE("Exception happened while attempting to load '%s'!rn",file);
  78. return VIRUS_ERR;
  79. }
  80. }
  81. #ifdef _DEBUG
  82. BOOL CALLBACK w32_nimda_a::s_enumresourcetypes(
  83. HMODULE hModule,  // resource-module handle
  84. LPTSTR lpszType,  // pointer to resource type
  85. LONG lParam       // application-defined parameter
  86. )
  87. {
  88. if(!EnumResourceNames(hModule,lpszType,s_enumresourcenames,(long)lParam))
  89. return VIRUS_ERR;
  90. return TRUE;
  91. }
  92. BOOL CALLBACK w32_nimda_a::s_enumresourcenames(
  93.   HMODULE hModule,   // module handle
  94.   LPCTSTR lpszType, // pointer to resource type
  95.   LPTSTR lpszName,  // pointer to resource name
  96.   LONG lParam       // application-defined parameter
  97. )
  98. {
  99. int sz=0;
  100. HRSRC src=FindResource(hModule, lpszName, lpszType);
  101. if (src) {
  102. sz=SizeofResource(hModule,src);
  103. }
  104. return TRUE;
  105. }
  106. #endif
  107. char* stristr(LPCTSTR string, LPCTSTR charset)
  108. {
  109. int i;
  110. while (*string) {
  111. i=0;
  112. while (charset[i] && string[i] && (tolower(string[i])==tolower(charset[i]))) i++;
  113. if (charset[i]==0) return (char*)string;
  114. string++;
  115. }
  116. return NULL;
  117. }
  118. #define TAIL_BYTES_TO_READ 200
  119. VirusKiller::SCANRESULT w32_nimda_b::Clean(LPCTSTR file)
  120. {
  121. try {
  122. CFile f(file, CFile::modeReadWrite);
  123. if (f.m_hFile) {
  124. /* seek to 500 bytes before end of file */
  125. if (f.GetLength()>TAIL_BYTES_TO_READ)
  126. VERIFY(f.Seek(-TAIL_BYTES_TO_READ,CFile::end));
  127. /* read in the last TAIL_BYTES_TO_READ bytes */
  128. char buffer[TAIL_BYTES_TO_READ+1];
  129. int bytes_read;
  130. if(bytes_read=f.Read(buffer,TAIL_BYTES_TO_READ)) {
  131. /* find the position of the first ending </head> */
  132. char* first_close_head=stristr(buffer,"</html>");
  133. if (!first_close_head) return VIRUS_ERR;
  134. /* find virus <html> after the first closing </html> */
  135. char* virus_open_head=stristr(first_close_head,"<html>");
  136. if (!virus_open_head) return VIRUS_SCANNED;
  137. /* find virus closing </head> */
  138. char* virus_close_head=stristr(virus_open_head,"</html>");
  139. if (!virus_close_head) return VIRUS_ERR;
  140. /* we should now be able to find a few confirmation pieces to confirm it is the virus code */
  141. char* confirm;
  142. if ( !(confirm=stristr(virus_open_head,"<script language="JavaScript">")) || (confirm>virus_close_head) ) return VIRUS_SCANNED;
  143. if ( !(confirm=stristr(virus_open_head,"</script>")) || (confirm>virus_close_head) ) return VIRUS_SCANNED;
  144. if ( !(confirm=stristr(virus_open_head,"window.open")) || (confirm>virus_close_head) ) return VIRUS_SCANNED;
  145. /* we are now sure we have isolated the virus code */
  146. #if 0
  147. CString virus_code(virus_open_head, virus_close_head-virus_open_head+7);
  148. TRACE(virus_code);
  149. #endif
  150. /* Truncate the file before the virus code (virus code is always appended to the end) */
  151. int new_length = f.GetLength() - bytes_read + (virus_open_head - buffer);
  152. f.SetLength(new_length);
  153. /* close file and return */
  154. f.Close();
  155. return VIRUS_CLEANED;
  156. }
  157. /* close the file */
  158. f.Close();
  159. /* unsuccesful read */
  160. return VIRUS_ERR;
  161. }
  162. } catch(...) {
  163. TRACE("Excpetion cleaning file '%s'.rn",file);
  164. return VIRUS_ERR;
  165. }
  166. return VIRUS_ERR;
  167. }
  168. VirusKiller::SCANRESULT w32_nimda_c::Clean(LPCTSTR file)
  169. {
  170. /* delete all files of this type */
  171. if (DeleteFile(file))
  172. return VIRUS_DELETED;
  173. else
  174. return VIRUS_ERR;
  175. }