
             *********************************************
             ***   Reports collected and collated by   ***
             ***            PC-Virus Index             ***
             ***      with full acknowledgements       ***
             ***            to the authors             ***
             *********************************************


  Vesselin Bontchev reported in May 1990

  The Number of the Beast.
  ========================

  - Three new versions of this virus have appeared. None of them
  contains the "666" string any more. I have difficulties to tell the
  exact order in which these versions were created.  In all of them
  the virus writer has tried to stick more code - but the place is
  *really* too small. In one of them he abandoned the DOS version
  check; in another there is no error checking.  I call these versions
  V512-B, V512-C and V512-D respectively.  The bad news is that John
  McAfee's program SCAN in no longer able to find them.  I do not
  think that this effect is achieved intentionally, maybe John just
  picked a bad search string.

  - In these mutations some of the earlier design bugs in the virus
  were improved. For instance, all of them are able to extract
  correctly the name of the command interpreter on boot time - even if
  it is not in the root directory. Also, the infected program don't
  always exit at DOS prompt when run on a clear system.  The virus
  saves the first one (or two, this depends of the concrete mutation)
  byte of the original file in its own body.  Then, when the infected
  file is executed, the virus reads the first byte after the end of
  file and compares it with the saved one.  If these bytes match, the
  virus tries read the original 512 bytes and to execute the file.  If
  they don't, the file is considered as damaged and the virus
  terminates the program (and exits at DOS prompt).

  - This virus contains a bug I didn't mentioned in my description.
  This is a design bug, not a programmer's one.  The problem is that
  the virus is not always able to check successfully if it is already
  present in memory. It compares the program, which has intercepted
  the INT 21h vector with its own body.  However it does not try to be
  the first program on this vector - like the Dark Avenger virus does.
  Now suppose that your COMMAND.COM is infected and that you have a
  lot of TSR programs in your AUTOEXEC.BAT file, all of which
  intercept INT 21h.  Of course, each of them will become infected.
  However each of them will cause a new copy of the virus to be loaded
  also - since the first program has intercepted INT 21h and the virus
  in the next program will not be able to find that it is already
  present in memory.  Since every copy of the virus will occupy a DOS
  I/O buffer, the operating system will run out of buffers soon.  This
  will lead to bad performance and system crashes.


======= Computer Virus Catalog 1.2: "512" Virus (5-June-1990) ========
Entry...............: "512" Virus
Alias(es)...........: ---
Virus Strain........: ---
Virus detected when.: January 1990
              where.: Bulgaria
Classification......: COM overwriting/extending/resident.
Length of Virus.....: 512 bytes
-------------------- Preconditions -----------------------------------
Operating System(s).: PC/MS-DOS
Version/Release.....:
Computer model(s)...: IBM PC/XT/AT/PS and compatibles
-------------------- Attributes --------------------------------------
Easy Identification.: "666" at offset 509.
Type of infection...: Executable file infection:
                      Overwriting/extending; resident; first 512 bytes
                      placed at free space on last cluster of file,
                      and replaced with the virus code.

                      System infection: RAM-Resident, uses disk buffer
                      space for code in order not to take-up memory.

Infection Trigger...: Any close file (INT 21, Service 3e) or Execute
                      (INT 21, Service 4b) on a .COM file.
Storage media affected: Any Drive
Interrupts hooked...: Int 21 DOS-services
                      Int 13 and Int 24 while infecting.
Damage..............: ---
Damage Trigger......: ---
Particularities.....: If virus is in memory, files are read as unin-
                      fected. Directory never shows size increase,
                      even if the virus is not in memory.  Under DOS
                      3.3, software write protections are bypassed.

Similarities........: ---
-------------------- Agents ------------------------------------------
Countermeasures.....: Monitoring the INT 21 vector.
Countermeasures successful: ---
Standard means......: A Do-it-yourself way: Infect system by running
                      an infected file, ARC/ZIP/LHARC/ZOO all infected
                      COM and EXE files, boot from uninfected floppy,
                      and UNARC/UNZIP/LHARC E etc.  all files.  Pay
                      special attention to disinfection of
                      COMMAND.COM.

-------------------- Acknowledgement ---------------------------------
Location............: Weizmann Institute Of Science, Rehovot, Israel
Classification by...: Ori Berger
Documentation by....: Yuval Tal (NYYUVAL@WEIZMANN.BITNET), Ori Berger
Date................: 6-March-1990
Information Source..: ---

          	+++++++ more ++++++


  Report from Jim Bates - The Virus Information Service - April 1990

  === The 666 Virus (aka Number of the Beast) ===

  The '666' virus (also known as 'V512' & 'Number of the Beast') is
  one of the so-called 'Bulgarian 50' group of viruses and although it
  has no trigger routine there are several interesting features which
  make the code worthy of study and analysis.  A trigger routine would
  be somewhat complicated to add to the code because of the size
  limitations and this leads me to suspect that this virus is an
  attempt to prove how clever the programmer is rather than a serious
  attempt at malignant code.  The virus is a parasitic type which
  becomes resident in the system when the code is executed. It infects
  only files which have the letters 'CO' as the first two letters of
  the file extension.  This is obviously targeting .COM files but it
  may also include COBOL source files which conventionally have an
  extension of .COB as well as other files with names matching this
  specification.  The other criteria for infection are that the file
  must have a length between 512 bytes and 65,023 bytes (inclusive)
  and, most important of all, the file length must be such that there
  is at least one free sector of space between the end of the file and
  the end of the last allocated cluster.

  This last requirement highlights one of the weak areas in the MS-DOS
  file storage system which virus researchers have long been aware of.
  The disk space allocation system within MS-DOS works by allocating
  space in predetermined chunks called 'clusters'.  The size of a
  cluster is set when the drive is first formatted and on most systems
  with more than around 10Mbytes of overall disk space the cluster
  size is set to 4 sectors (or 2048 bytes). Since file sizes are
  rarely an exact multiple of clusters in length, there will usually
  be a certain amount of unused space beyond the end of the file but
  still allocated to it.  For example: the COMMAND.COM file on my DOS
  3.30 system is 25,307 bytes long.  This represents slightly over 12
  clusters of disk space so DOS will have allocated 13 clusters.
  Therefore, the allocated space equals 26,624 bytes (13 x 2048) while
  the space actually used by the file is 25,307 bytes.  The difference
  in this case is 1,314 bytes which represents something over 2
  sectors and therefore this particular COMMAND.COM could be infected
  by the 666 virus.   There are some problems associated with using
  this space which I'll come to later but the big advantages are that
  : a) DOS will not overwrite it and :  b) it is considered 'lost' to
  all DOS operations unless special provision is made to access it.
  It is thus an ideal place to 'hide' virus code so that scanning
  programs cannot find it.  Of course, some method must still be used
  to ensure that such code is loaded and presented to the processor
  for execution.  Although there are several ways of doing this, the
  V512 virus uses one of the more interesting ones which also attempts
  to fool both resident and scanning software into 'thinking' that
  nothing is amiss with the host file.  It should go without saying
  that there will be some files which do not have sufficient unused
  space within the final cluster.  However, this virus does check for
  that eventuality and will not attempt to infect such files.

  The virus is 509 bytes long and appears to have been padded with a
  three byte 'signature' consisting of the characters '666' (giving
  rise to its alternative names) to bring the size up to 512 bytes
  (exactly one sector).  It is positioned on the disk to overwrite the
  first sector of the host file.  The original contents of that first
  sector are written beyond the end of the file in the free space just
  discussed.  So, taking events in their proper sequence, I will start
  by describing the actual installation of the virus code when it is
  first executed.

  INSTALLATION
  The code starts by determining the DOS version of the current
  operating system and then collects the INT13H vector from page zero
  of memory.  The DOS version is then checked and if the minor part
  (after the decimal point) of the version number is .30 then a little
  known (and undocumented) DOS function is called which swaps out the
  original (ie: pre-system load) INT13H entry point (this usually
  points to the ROM INT13H routine).  The swapped out address is
  pushed onto the stack and the function is called again to swap the
  vectors back again.  This restores normal system operation at that
  point but leaves the required address on the stack.  This address is
  popped from the stack to take the place of the INT13H vector
  collected from page zero.  If the minor DOS version is NOT .30 then
  the swapping function is not used and processing continues with the
  page zero DOS INT13H vector.  The importance of the swapping process
  can be appreciated since it recovers an entry point into the disk
  I/O services which is not usually monitored by anti-virus software.
  It should be noted however, that it IS possible to hook monitoring
  software into this function and it is also possible to monitor the
  swap function itself and thus intercept this particular virus
  installation routine.  Installation then continues by storing the
  relevant INT13H vector within the virus' code segment and then
  collecting the INT21H vector - again by direct access to page zero
  of RAM.  The offset portion of the INT21H vector is checked for a
  value of 121H and if this is found, the indicated segment is checked
  for the presence of the virus.  Obviously if the virus is already
  resident, processing branches to the portion of the code which is
  processed AFTER the virus has been made resident.  If the virus code
  is NOT resident, the code locates the address of the first Disk I/O
  buffer which DOS uses.  These buffers are exactly 512 bytes long and
  usually have around 16 bytes as a header so there is more than
  enough space for this virus code to be installed in one.  Once the
  whole virus has been moved into the buffer, its address is removed
  from the Disk I/O chain and the INT21H vector is modified to point
  to the interception routine within the newly re-located virus code.
  The code then overwrites a small section of the transient portion of
  the command interpreter.  This is to ensure that when the program
  terminates, COMMAND.COM will be reloaded and, as will be seen,
  infected.  In this way, this virus actually attempts to infect
  COMMAND.COM the very first time it is executed.  The code then goes
  on to check whether the current program is a command process (ie:
  COMMAND.COM itself) or is running as a child of DOS.  If it IS a
  command process, then processing terminates back to DOS and since
  the virus code is now resident, the reloading of COMMAND.COM will
  ensure that it is infected as we shall see later.  An interesting
  point here is that when an infected program is run for the first
  time on a clean system (ie:  COMMAND.COM is NOT infected), the host
  program itself will NOT be executed - but run it a second time, and
  it will be!  The second and subsequent times that the program is
  executed, after the 'parent/child' check, the data that was in the
  original first sector is loaded into the appropriate area
  (overwriting the recently loaded copy of the virus) and execution
  then continues with the original program quite normally.  The method
  of accessing beyond the end of the file is another one of the
  interesting parts of this virus since it is achieved by direct
  manipulation of the DOS System File Table (SFT).  This technique is
  used in several places throughout the code and it allows the virus
  to open a file for READ access (thus NOT alarming any resident
  anti-virus monitoring software) and then to change the SFT to allow
  WRITE access. At the same time, the file length and date/time fields
  can also be modified as required.  However, during the execution
  phase of an infected program, only the file length field is
  adjusted; by adding 512 so that the original data can be read from
  the disk.

  INTERRUPT INTERCEPTION
  As mentioned, only the INT21H vector is hooked during installation
  and the virus code which intercepts this call allows all function
  requests through except for 3FH (READ), 3EH (CLOSE) and 4B00H (LOAD
  & EXECUTE).

  READ FUNCTION
  The READ intercept provides yet another interesting aspect of the
  code in that it attempts to 'hide' the presence of the virus code in
  a way that is reminiscent of the technique used in the BRAIN virus.
  When a READ request is received, the current position of the file
  access pointer is first noted and then the READ is performed
  correctly.  Next the file access pointer is checked to see if the
  read request was for a portion of the file within the first sector.
  If it wasn't, processing is returned to the caller, but if it was,
  the file time stamp field is checked for the existence of 1FH (31
  decimal) in the seconds bits.  This is equivalent to a setting of 62
  seconds and is one of the markers used by the virus to indicate an
  infected file (the other being the presence of the virus code
  itself).  If the file is marked as infected in this way, then the
  SFT is accessed again to modify the file size field and the original
  first sector is read from the last cluster. Then the file size field
  is restored to its former value before processing returns to the
  caller.  Thus the virus has effectively covered its existence by
  supplying the caller with the correct data rather than the virus
  code. This means that simple scanning programs will NOT detect the
  virus code ON AN INFECTED SYSTEM!  This is further evidence of the
  absolute necessity of ensuring that the system is 'clean' before
  starting any tests for the presence of virus code on the disk.

  LOAD & EXECUTE and CLOSE FUNCTIONS
  The intercept routine for these two functions is substantially the
  same except that when closing a file, the file handle is first
  duplicated and subsequent operations are carried out on the
  duplicate handle.  Loading a file for execution results in the file
  being opened (in READ mode) for virus operations.  In both cases the
  file handle being used is closed before the original request is
  allowed to continue normally (using the original file handle).  The
  purpose of the interception is to check the file for existing
  infection and if it is not infected, to check its suitability for
  infection by determining how much unused file space there is in the
  final cluster.

  INFECTION
  After the routine opens (or duplicates) a file handle for the
  target, the file position pointer is set to zero (Beginning of File)
  and the SFT access privilege field is changed to allow WRITE access.
  Then the vector for INT13H is changed to that collected during the
  Installation phase.  Remember that the virus code will usually have
  collected this vector during the initialisation of the system (ie:
  via an infected COMMAND.COM) or from the undocumented vector swap
  interrupt.  Thus it is unlikely that this vector will be monitored
  by anti-virus software.  The virus does not use INT13H directly but
  INT21H functions associated with file I/O use it and could thereby
  alarm monitoring software.  The infection check routine also
  revectors INT24H (Fatal Error Handler) to point to an IRET
  instruction within the code.  This effectively disables error
  reporting for the duration of this section of the code.  Once these
  two interrupt vectors have been modified, the code continues by
  checking the time stamp field for the 62 second marker.  If this
  marker is not found the file extension is tested to see if it begins
  with 'CO', otherwise the extension check is by-passed.  There seems
  no valid reason for this alternative checking, maybe the programmer
  had other options in mind and simply forgot this sloppy piece of
  coding as the virus developed.  Whatever the reason, the assumption
  is that a file with the 62 second marker set will be a .CO?  file.
  From this point on, if a check fails, the handle is closed and
  processing is return to continue the original INT21H function call.
  The next check ensures that the target file is between 512 and
  65,023 bytes long.  A further test looks at the SYSTEM attribute
  setting of the target file and rejects it if it is set.  The final
  check before examining the file for existing infection involves
  testing the file length against the number of sectors per cluster
  and using this to calculate how much unused space is available in
  the final cluster.  Once the target file has passed all these
  checks, the first 512 bytes of the file are read into a buffer.  The
  virus uses the high part of the Interrupt Vector Table as a buffer,
  thus overwriting all Interrupt vectors above 7FH.  This is the most
  serious mistake within the virus since an increasing number of
  machines, most network software and several high-level languages use
  these interrupts for various purposes and the destruction of the
  vectors will cause system failure and give immediate alarm signals
  that something is amiss.

  Once the start of the file has been read, it is checked against the
  existing virus code to see if it is already infected.  If infection
  IS discovered, the time stamp field is set with the 62 second marker
  and the file is closed.  If the file is NOT infected, the contents
  of the buffer are appended to the end of the file and a copy of the
  virus is written to the first sector.  The file size field is
  actually modified during this process but restored afterwards to
  leave the appended code outside the size setting.  The date/time
  field remains substantially unaltered (except for the 62 seconds) as
  a result of direct access to the flags field of the SFT.  These
  actions ensure that the visible directory entry for the file remains
  the same as it was before infection.  Within the infection routine
  there are two calls to Function 40H of Interrupt 21H.  These are
  immediately obvious to monitoring software and can therefore provide
  a useful detection point.

  The use of the LOAD & EXECUTE function as a vehicle for file
  infection has become fairly standard amongst virus authors but the
  use of the CLOSE function is of much more concern.  The Dark Avenger
  virus also subverts this function and causes similar concern.  The
  problem centres around the more simple scanning programs because in
  order to examine a file they must open it using the DOS file I/O
  functions.  Once scanning has been completed the file is closed and
  - if a virus of this type is present - becomes infected.  Thus the
  scanning program becomes the agent for infecting every suitable file
  on the disk at one go!  The answer is to restrict the use of
  scanners to a known clean system, ie:  keep the scanning program on
  a write protected system floppy disk and ONLY use it from there.
  The only scanners which should be used on an automatic basis
  (invoked by AUTOEXEC.BAT) are those which collect file information
  on an absolute sector basis and thereby do not use the DOS file I/O
  facilities.  If the method used by the scanner is not known, assume
  that it DOES use DOS file I/O and take appropriate precautions.

  Virus programmers are, almost by definition, immature and inadequate
  individuals indulging in the electronic equivalent of graffiti and
  it can be interesting to speculate on the personalities who waste
  their time in such childish activities.  My impressions on
  disassembling this virus are of someone who considers himself a cut
  above other virus writers.  The code makes use of some undocumented
  and obscure features of DOS in a way which almost shouts "See how
  clever I am" and yet ignores such obvious giveaways as the
  overwriting of the Interrupt Vector Table and the plain use of the
  WRITE function 40H of Interrupt 21H.  Other problem areas include
  the method of checking for the virus existence in memory.  This will
  cause multiple installation of the virus code if any subsequent
  program re-vectors INT21H.  There are also difficulties if an
  infected program is copied on an uninfected system.  In this case,
  since most COPY routines work on a byte by byte basis (and not
  cluster by cluster) the infected file will lose the contents of the
  unused space at the end of the file and while the copied file will
  still contain the virus, it will no longer perform its original
  function.  Assuming that a virus should NOT announce its presence by
  destroying its host, this is another serious weakness in the code.
  The final flaw in this type of virus, and the one of most interest
  to technicians wishing to protect their systems, is that the spread
  of infection can be stopped quite simply by ensuring that all files
  occupy an exact number of clusters.  Thus no free space is left and
  the virus will be unable to replicate.

  There is a suggestion that this code was developed as a 'LAB' virus,
  intended to test and assist in the development of more effective
  anti-virus software.  This may well be the case but the fact remains
  that it is easily disassembled and contains dangerous techniques
  which could be modified by malicious people to further exacerbate
  the virus threat.  There are enough genuine viruses around without
  irresponsible people developing and distributing new ones.

  VIS Classification - CcARSd512A

  The information contained in this report is the direct result of
  disassembling and analysing a specimen of the virus code.  I take
  great pains to ensure the accuracy of these analyses but I cannot
  accept responsibility for any loss or damage suffered as a result of
  any errors or omissions.  If any errors of fact are noted, please
  let me know at :-

                    The Virus Information Service,
                    Treble Clef House,
                    64, Welford Road,
                    WIGSTON MAGNA,
                    Leicester LE8 1SL

  or call +44 (0)533 883490

  Jim Bates


  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  ++++++++++++++++++++++++++ end of reports ++++++++++++++++++++++++
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
