home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* VIRKILL.PAS *)
- (* (c) 1991 Raimond Reichert & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM VirusKiller;
-
- USES Dos, Crt, Win, ScanDir;
-
- CONST
- VirCode : STRING[17] =
- #$7e#$85#$b1#$63#$2a#$c3#$71#$71#$2c+
- #$a0#$f2#$8b#$59#$0d#$f9#$d5#$00;
-
- TYPE
- VirusScannerPtr = ^VirusScanner;
- VirusScanner = OBJECT(ScanDirectories)
- VirNum : INTEGER;
- f : FILE;
-
- CONSTRUCTOR Init;
- PROCEDURE ResetData; VIRTUAL;
- PROCEDURE DoIt(Info : SearchRec; Name : STRING);
- VIRTUAL;
- FUNCTION Matches(Info : SearchRec;
- Name : STRING) : BOOLEAN; VIRTUAL;
- FUNCTION GetVirNum : INTEGER;
- END;
-
- CONSTRUCTOR VirusScanner.Init;
- BEGIN
- ScanDirectories.Init; VirNum := 0;
- END;
-
- PROCEDURE VirusScanner.ResetData;
- BEGIN
- ScanDirectories.ResetData; VirNum := 0;
- END;
-
- PROCEDURE VirusScanner.DoIt(Info : SearchRec;
- Name : STRING);
- VAR
- FileCode : STRING [17];
- ByteArray : ARRAY [1..32] OF BYTE;
- Ch : CHAR;
-
- PROCEDURE KillVirInEXE;
- BEGIN
- Seek(f, Info.Size-2881+10);
- BlockRead(f, ByteArray, 32);
- Seek(f, 0);
- BlockWrite(f, ByteArray, 32);
- Seek(f, Info.Size-2881);
- Truncate(f);
- END;
-
- PROCEDURE KillVirInCOM;
- BEGIN
- Seek(f, Info.Size-2889+14);
- BlockRead(f, ByteArray, 32);
- Seek(f, 0);
- BlockWrite(f, ByteArray, 32);
- Seek(f, Info.Size-2889);
- Truncate(f);
- END;
-
- BEGIN
- WriteLn('Suche in ', Name);
- IF Info.Size > 2889 THEN BEGIN
- Assign(f, Name);
- IF (Info.Attr AND ReadOnly) <> 0 THEN FileMode := 0;
- {$I-} Reset(f, 1); {$I+}
- IF (Info.Attr AND ReadOnly) <> 0 THEN FileMode := 2;
- IF IOResult = 0 THEN BEGIN
- IF Pos('.COM', Name) > 0 THEN Seek(f, Info.Size-21)
- ELSE Seek(f, Info.Size-17);
- FileCode[0] := #17;
- BlockRead(f, FileCode[1], 17);
- IF (FileCode = VirCode) THEN BEGIN
- TextAttr := LightRed;
- WRITE('':20, 'Programm infiziert...');
- IF Pos('.COM', Name) > 0 THEN KillVirInCOM
- ELSE KillVirInEXE;
- INC(VirNum);
- TextAttr := LightBlue;
- WriteLn(' Virus entfernt. Weiter mit Taste. ');
- Ch := ReadKey;
- IF KeyPressed THEN Ch := ReadKey;
- TextAttr := Yellow;
- END;
- Close(f);
- END ELSE BEGIN
- TextAttr := Red;
- WriteLn('FEHLER: Datei ', Name, ' konnte nicht',
- ' geöffnet werden.');
- TextAttr := Yellow;
- END;
- END;
- END;
-
- FUNCTION VirusScanner.Matches
- (Info : SearchRec; Name : STRING) : BOOLEAN;
- BEGIN
- Matches := (Pos('.COM', Info.Name) > 0) OR
- (Pos('.EXE', Info.Name) > 0);
- END;
-
- FUNCTION VirusScanner.GetVirNum : INTEGER;
- BEGIN
- GetVirNum := VirNum;
- END;
-
- PROCEDURE InitPrg;
- BEGIN
- ClrScr; Window(1, 1, 80, 3);
- FrameWin('', SingleFrame, 0, Cyan);
- Window(1, 23, 80, 25);
- FrameWin('', SingleFrame, 0, Cyan);
- Window(1, 4, 80, 22);
- FrameWin('', DoubleFrame, 0, Blue);
- Window(1, 1, 80, 25);
- TextAttr := LightMagenta;
- GotoXY(26, 2); Write(' Yankee-Doodle-Virus-Killer ');
- GotoXY(45, 24);
- WRITE(' (c) 1991 Raimond Reichert & TOOLBOX ');
- Window(2, 5, 79, 21);
- END;
-
- VAR
- VirKiller : VirusScanner;
- i, pc : BYTE;
- Path : STRING;
- Killed, Quit : BOOLEAN;
- Ch : CHAR;
-
- BEGIN
- InitPrg; VirKiller.Init;
- pc := ParamCount; Killed := FALSE; i := 1;
- IF pc = 0 THEN INC(pc);
- REPEAT
- REPEAT
- Quit := TRUE; ClrScr; TextAttr := Yellow;
- IF ParamCount = 0 THEN Path := ''
- ELSE Path := ParamStr(i);
- IF Path[Length(Path)] = '\' THEN DEC(BYTE(Path[0]));
- VirKiller.Scan(Path);
- WriteLn;
- IF VirKiller.GetVirNum > 0 THEN BEGIN
- WriteLn(' "Yankee Doodle" aus ', VirKiller.GetVirNum,
- ' von ', VirKiller.GetMatchNumber,
- ' Programmen entfernt.'); Killed := TRUE;
- END ELSE
- WriteLn(' "Yankee Doodle" nicht gefunden.');
- IF ((UpCase(Path[1]) = 'A') OR
- (UpCase(Path[1]) = 'B')) AND
- (Path[2] = ':') THEN BEGIN
- TextAttr := White;
- WriteLn; Write('Noch eine Diskette prüfen (J/N)? ');
- REPEAT
- CH := UpCase(ReadKey);
- UNTIL (Ch = 'J') OR (Ch = 'N');
- IF Ch = 'J' THEN Quit := FALSE;
- END ELSE
- IF pc <> i THEN BEGIN
- TextAttr := White;
- WriteLn; Write(' Weiter mit ENTER'); ReadLn;
- END;
- VirKiller.ReSetData;
- UNTIL Quit;
- INC(i);
- UNTIL (i = Succ(pc));
- IF Killed THEN BEGIN
- WriteLn; WriteLn('Falls Virus aktiv sein könnte, dann ',
- 'sofortigen Warmstart durchführen !');
- END;
- WriteLn; WriteLn(' Weiter mit ENTER'); ReadLn;
- VirKiller.Done;
- Window(1, 1, 80, 25); ClrScr;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von VIRKILL.PAS *)
-