Routine List for Virus Creation Laboratory ------------------------------------------ This file contains a list of the routines inclueded with V.C.L. as it is shipped. Routines under the "Effect Procedures" are possible effects that your creation might have and are included in VCL.DAT. Routines listed under "Condition Functions" are functions that return a value in AX; they are used to test whether an effect should be called, and are also included in VCL.DAT. Routines found under "Internal Routines" are inside the VCL.EXE file, and may not be changed. They are called by V.C.L.-generated code depending on which options are set. They are documented here in case you decide to access them from a custom routine of your own. See the main documentation for V.C.L. (VCL.DOC) for more information about assembler routines and how to add them to V.C.L. ------------------------------------------------------------------------------- Effect Procedures ================= Procedure: beep Decription: Beeps the PC speaker. CX holds the number of times to beep. Procedure: change_ram Description: Changes the ammount of low (under 1 meg) memory the computer appears to have. DX holds the new ammout of memory, in kilobytes. This value remains unchanged through a warm-reboot, and when the computer is warm booted DOS will have less memory to use. Procedure: clear_screen Description: Clears the screen. There are no arguments. The BIOS is used to clear the screen. Procedure: cold_reboot Decription: Performs a cold reboot of the system. Naturally this procedure needs no parameters. Procedure: corrupt_file Description: Corrupts one or more files. DX points to the name of the file (wildcards allowed; all matching files in the current directory will be affected). The files are encrypted by whatever the BIOS clock is at the time, making them virtually unrecoverable. Procedure: disable_parallel Decription: Disables a parallel port. SI holds the port number (LPT1 = 1, LPT2 = 2, etc.). The port will no longer be usable (until the computer is rebooted) because it address (stored in a table) will be wiped over. Procedure: disable_prnt_scrn Description: Disables the Print Screen key. A flag in the BIOS is set so that it believes that something is already being printed, disabling the effect. Procedure: disable_serial Description: Disables a serial port. SI holds the port number (COM1 = 1, COM2 = 2, etc.). The port will no longer be usable (until the computer is rebooted) because its address (stored in a table) will be wiped over. Procedure: display_string Decription: Displays a string on the screen. SI points to the string, which must be NULL terminated (ASCII code 0). The string is displayed using the BIOS screen procedures, insuring that output will not be redirected. Besides, the DOS procedure is slower, and has to be terminated by a "$", which is incredibly lame. Procedure: drop_program Description: Drops a program into a file. DX points to the name of the file (wildcards allowed; if the file name is a wild card then all matchings file will be infected). SI points to a table: the first word is the number of bytes in the dropped program, the remaining bytes are the program itself. The attributes, file date/time, and size of the victim program are preserved, and read-only/system/hidden attributes will not stop this procedure from working. This procedure is used to insert a message or code into a victim program. This is useful for placing taunting messages in a file, or for dropping a live virus into someone's .EXE from a trojan horse. There are many uses. Procedure: erase_files Description: Erases one or more files. This procedure searches for the file descriptor; if a valid file is found it is erased and the process is repeated until no files are left. DX holds a pointer to an ASCIIZ string containing the file mask. The method of erasure is such that it is difficult to recover files deleted with this routine. Procedure: lock_up Description: Locks up the computer. The interrupt flag is cleared, disabling all interrupts, then the HLT command is used; this locks up the computer so that it may only be restarted with a cold reboot (achieved by either by turning off the computer and turning it on again or by pressing the "reset" button. There are no parameters needed (duh). Procedure: machine_gun Description: Clicks the PC speaker to simulate the sound of gun shots. Most of this code was stolen from the Parasite-2B Virus by Rock Steady, but I changed the delay procedure so that the time between shots would stay constant regardless of processor speed (on my 386-40 the original routine sounded like a buzz). Basically this routine just turns on and off the speaker quickly to make the clicking noise. The number of shots to fire is passed in CX. Procedure: out_port Description: Outs a value to a port. AX holds the value to out, DX holds the port number (0 - 65535). Procedure: out_random Description: Outs random values to all ports. This procedure retrieves the BIOS timer count, then outs the low byte of it into every single one of the 255 IO ports. This may do nothing, or it can cause disk writes or formats, crashes, timer problems, modem/printer problems, or all of the above. It just depends. Most likely *something* bad will happen, though usually just a crash. Procedure: play_tune Description: Plays a tune through the PC speaker. SI points to a table of alternating frequency/duration values (word-length). The frequency should be in hertz, the duration in clock ticks (18.2 clock ticks/second). The table must be terminated by a NULL (ASCII code 0). To produce a rest, used 0FFFFh as the frequency (this is acutually 65535 cycles/second, but human beings cannot hear frequencies that high, so a rest is generated). I've found that 6 ticks for a quarter- note works well (therefore 3 for an eighth-note, 12 for a half-note, etc.). A lot of the code in this routine was stolen from the sound() and nosound() procedures of Borland C++ v3.0. Procedure: print_string Description: Prints a string on the printer. The address of the string is passed in SI and the printer number is passed in DX (LPT1 = 0, LPT2 = 1, etc.). The string must be NULL terminated. If the printer is not on or does not exsist this function will fail, of course. Procedure: rom_basic Description: Drops the computer into ROM BASIC if he has a true IBM computer (ugh!). There is no escape from ROM BASIC other than a reboot, and trust me, it ain't much fun to play with (it's worse than even GWBASIC!). On compatibles this interrupt will usually display a message and hang the computer, or have no effect at all. Procedure: serial_string Description: Transmits a string to a serial port. DX holds the port number (0 = COM1, 1 = COM2, etc.) and SI points to the string, which must be NULL terminated. Remember that when transmiting Hayes command strings that you must include CR-LFs. (A special note: the Hayes string to turn off the modem speaker is "ATM0 L0 (enter)." This is quite useful when writing virii that call 1-900 numbers, for example...) Procedure: swap_parallels Description: Swaps two parallel ports, causing untold havock. BX holds the number of the first parallel port (LPT1 = 1, LPT2 = 2, etc.), and SI holds the number of the second parallel port. This effect lasts until the computer is rebooted. Procedure: swap_serials Description: Swaps two serial ports, causing untold havock. BX holds the number of the first serial port (COM1 = 1, COM2 = 2, etc.), and SI holds the number of the second serial port. This effect lasts until the computer is rebooted. Procedure: trash_disk Description: Trashes a disk by overwritting the FAT, Boot, Directories, etc. AX holds the drive number to trash (0 for A:, 1 for B:, etc.) and CX holds the number of sectors to overwrite, starting with sector 0. The sectors will be overwritten with whatever is in memory pointed to by ES:BX. During the disk write all external interrupts are disabled, preventing someone from pressing Ctrl-C or Ctrl-Alt-Del. Procedure: trash_disks Description: Trashes one or more disks by overwritting their FAT, Boot, Directories, etc. AX holds the starting drive number, (0 for A:, 1 for B:, etc.) and CX holds the number of sectors to overwrite, starting with sector 0. The sectors will be overwritten with whatever is in memory pointed to by ES:BX. During the disk write all external interrupts are disabled, preventing someone from pressing Ctrl-C or Ctrl-Alt-Del. All disks with a number less than or equal to AX will be affected (for example, to trash drives A through C, call trash_disks with AX = 2). Note that the drives are accessed in reverse order, insuring that any hard disks will be destroyed first, so if there are no valid floppies then it will still be too late for the victim to reset after he sees the drive lights go on. Procedure: uncrunch_ansi Description: Uncrunches and displays a run-length encoded ANSI produced by The Draw. This code is stolen from UNCRUNCH.ASM included with The Draw, but touched up a bit and re-commented. Data for this routine must be created using The Draw and saving to a packed ASM format. The offset to the data is passed in SI. CX holds the length of the ANSI (this can be found in IMAGEDATA_LENGTH of the code that The Draw produces; be sure to remove any equates that The Draw inserts into the code it produces). Procedure: warm_reboot Decription: Performs a warm reboot of the system. Naturally this procedure needs no parameters. ------------------------------------------------------------------------------ Condition Functions =================== Procedure: get_country Description: Returns the DOS country code in AX. (The codes correspond to the long-distance dialing prefixes for the respective countries. See your DOS reference manual or local phone book for a list of the country codes.) Procedure: get_cpu Description: Returns the model of the CPU installed. 8088s and 8086s return 86, 80286s 286, 80386s 386, and 80486s 486. Procedure: get_day Description: Returns the current day of the month (1 - 31) in AX. Procedure: get_dos_version Description: Returns the DOS version in AX. DOS versions before 2.0 return 0, while all others return the major version number * 100 + the minor version number (ex: a system running DOS 5.0 would return 500, a system running DOS 3.3 would return 330, etc.) Procedure: get_ems Description: Returns the ammout of expanded memory in AX. This value is in kilobytes of total (not available) EMS. Procedure: get_floppies Description: Returns the number of floppy drives installed (1 - 4) in AX. Procedure: get_game_port Description: Returns number of game ports installed (0 or 1) in AX. Procedure: get_hour Description: Returns the hour (0 - 23) in AX. Procedure: get_minute Description: Returns the current minute (0 - 59) in AX. Procedure: get_month Description: Returns the current month (1 - 12) in AX. Procedure: get_parallel Description: Returns the number of parallel ports in AX. Procedure: get_ram Description: Returns the ammount of RAM in AX. Note that this is only the ammount of base RAM (under 1 meg), and does not include EMS or XMS memory, and is in kilobytes. Procedure: get_random Description: Returns a random number (0 - 65535) in AX. The number is the lower word of the current BIOS timer tick count. Procedure: get_rollover Description: Returns the BIOS rollover flag (0 or 1), indicating whether the computer has been on for 24-hours continuously (one) or not (zero). Procedure: get_second Description: Returns the current second (0 - 59) in AX. Procedure: get_serial Description: Returns the number of serial ports (0 - 8) in AX. Procedure: get_weekday Description: Returns the number (0 for Sunday, 1 for Monday, etc.) of the current day of the week in AX. Procedure: get_year Description: Returns the current year (1980 - 2099) in AX. Procedure: infected_all Description: Returns 0 if all files have been infected, 1 if not. Note that this value applies to all searchable files, not neccessarily every file on the disk, and that this value is undefined if this is called before the search routine (ie: only use it in "after" routines). The value returned comes from the internal variable set_carry in the infect_file procedure. Procedure: is_4dos Description: Returns 0 if 4DOS is installed, 1 if it is not. ------------------------------------------------------------------------------ Internal Routines ================= Procedure: encrypt_code Description: Mutates the encryption/decryption code. A new key is chosen for the encryptor and the registers used in the routine are changed (SI and DI are alternately used as pointers to the encrypted code). Then the routine is copied into the heap, along with code to write the virus to the victim, and another copy (which decrypts the virus) is added afterwards. The whole long routine is then CALLed. The victim's file handle is passed to this routine in the BX register. Procedure: encrypt_decrypt Description: Encrypts or decrypts the code, depending on whether or not it is already encrypted. A simple XOR encryption scheme is used, but code is mutated slightly to prevent easy SCANing. Procedure: find_files Description: This routine is called by most search_files routines. It searches the current directory for the first valid file of the type who's mask is pointed to by DX. If a valid file is found then infect_file is called. If a file wasn't successfully infected then carry is set. Procedure: infect_file Description: Infects the file whose record is passed in the DTA. The method of infection depends on which option(s) were chosen by the user. The internal variable set_carry is set to zero if no files were able to be infected, and the carry flag set. Procedure: search_file Description: Searches for files to infect. If a valid file is found infect_file is called. The search method is defined by the user in the Options³Search Type dialog box. Procedure: stop_tracing Description: Locks the computer if someone is tracing through the program. Called whenever Stop Trace is set, this sets the interrupt vectors three and one (tracing interrupt) to a new vector which causes a system halt with all interrupts disabled. This frustrates anyone trying to step through your creation. If this fails then a short routine uses prefetch-queue changing to lock the keyboard if a debugger is running; under normal conditions nothing unusual happens. Some code for these routines was taken from Demogorgon's article "Concealment: Keep Your Code Hidden From Prying Eyes" in 40-Hex magazine volume #2, issue #2 (article #2). The sequal to that article, "Code Concealment" (in 40-Hex volume #2, issue #3, article #2), also by Demogorgon, provided inspiration for the prefetch-queue-alteration routine. These two articles provide great insight into methods of preventing tracing and disassembly and are highly recommended for people interested in the subject. Procedure: traverse Description: Traverses the directory tree looking for files to infect. If a valid file is found infect_file is called. This procedure is recursive, using about 128 bytes per call, one call per level of the directory tree. This procedure is only called when Options³Search Type is set to "Directory Tree." Carry is set if the search fails. Procedure: traverse_path Description: Traverses the DOS PATH variable looking for files to infect. If a valid file is found infect_file is called. This procedure is only called when Options³Search Type is set to "DOS PATH string." Carry is set if the search fails.