home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / praxis / virkill / virkill.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1991-05-08  |  5.3 KB  |  181 lines

  1. (* ------------------------------------------------------ *)
  2. (*                      VIRKILL.PAS                       *)
  3. (*          (c) 1991 Raimond Reichert & TOOLBOX           *)
  4. (* ------------------------------------------------------ *)
  5. PROGRAM VirusKiller;
  6.  
  7. USES Dos, Crt, Win, ScanDir;
  8.  
  9. CONST
  10.   VirCode : STRING[17] =
  11.       #$7e#$85#$b1#$63#$2a#$c3#$71#$71#$2c+
  12.       #$a0#$f2#$8b#$59#$0d#$f9#$d5#$00;
  13.  
  14. TYPE
  15.   VirusScannerPtr = ^VirusScanner;
  16.   VirusScanner    = OBJECT(ScanDirectories)
  17.     VirNum : INTEGER;
  18.     f      : FILE;
  19.  
  20.     CONSTRUCTOR Init;
  21.     PROCEDURE ResetData;                            VIRTUAL;
  22.     PROCEDURE DoIt(Info : SearchRec; Name : STRING);
  23.                                                     VIRTUAL;
  24.     FUNCTION Matches(Info : SearchRec;
  25.                      Name : STRING) : BOOLEAN;      VIRTUAL;
  26.     FUNCTION GetVirNum : INTEGER;
  27.   END;
  28.  
  29.   CONSTRUCTOR VirusScanner.Init;
  30.   BEGIN
  31.     ScanDirectories.Init;  VirNum := 0;
  32.   END;
  33.  
  34.   PROCEDURE VirusScanner.ResetData;
  35.   BEGIN
  36.     ScanDirectories.ResetData;  VirNum := 0;
  37.   END;
  38.  
  39.   PROCEDURE VirusScanner.DoIt(Info : SearchRec;
  40.                               Name : STRING);
  41.   VAR
  42.     FileCode  : STRING [17];
  43.     ByteArray : ARRAY [1..32] OF BYTE;
  44.     Ch        : CHAR;
  45.  
  46.     PROCEDURE KillVirInEXE;
  47.     BEGIN
  48.       Seek(f, Info.Size-2881+10);
  49.       BlockRead(f, ByteArray, 32);
  50.       Seek(f, 0);
  51.       BlockWrite(f, ByteArray, 32);
  52.       Seek(f, Info.Size-2881);
  53.       Truncate(f);
  54.     END;
  55.  
  56.     PROCEDURE KillVirInCOM;
  57.     BEGIN
  58.       Seek(f, Info.Size-2889+14);
  59.       BlockRead(f, ByteArray, 32);
  60.       Seek(f, 0);
  61.       BlockWrite(f, ByteArray, 32);
  62.       Seek(f, Info.Size-2889);
  63.       Truncate(f);
  64.     END;
  65.  
  66.   BEGIN
  67.     WriteLn('Suche in ', Name);
  68.     IF Info.Size > 2889 THEN BEGIN
  69.       Assign(f, Name);
  70.       IF (Info.Attr AND ReadOnly) <> 0 THEN FileMode := 0;
  71.     {$I-} Reset(f, 1); {$I+}
  72.       IF (Info.Attr AND ReadOnly) <> 0 THEN FileMode := 2;
  73.       IF IOResult = 0 THEN BEGIN
  74.         IF Pos('.COM', Name) > 0 THEN Seek(f, Info.Size-21)
  75.                                  ELSE Seek(f, Info.Size-17);
  76.         FileCode[0] := #17;
  77.         BlockRead(f, FileCode[1], 17);
  78.         IF (FileCode = VirCode) THEN BEGIN
  79.           TextAttr := LightRed;
  80.           WRITE('':20, 'Programm infiziert...');
  81.           IF Pos('.COM', Name) > 0 THEN KillVirInCOM
  82.                                    ELSE KillVirInEXE;
  83.           INC(VirNum);
  84.           TextAttr := LightBlue;
  85.           WriteLn('  Virus entfernt. Weiter mit Taste. ');
  86.           Ch := ReadKey;
  87.           IF KeyPressed THEN Ch := ReadKey;
  88.           TextAttr := Yellow;
  89.         END;
  90.         Close(f);
  91.       END ELSE BEGIN
  92.         TextAttr := Red;
  93.         WriteLn('FEHLER: Datei ', Name, ' konnte nicht',
  94.                 ' geöffnet werden.');
  95.         TextAttr := Yellow;
  96.       END;
  97.     END;
  98.   END;
  99.  
  100.   FUNCTION VirusScanner.Matches
  101.     (Info : SearchRec; Name : STRING) : BOOLEAN;
  102.   BEGIN
  103.     Matches := (Pos('.COM', Info.Name) > 0) OR
  104.                (Pos('.EXE', Info.Name) > 0);
  105.   END;
  106.  
  107.   FUNCTION VirusScanner.GetVirNum : INTEGER;
  108.   BEGIN
  109.     GetVirNum := VirNum;
  110.   END;
  111.  
  112.   PROCEDURE InitPrg;
  113.   BEGIN
  114.     ClrScr;  Window(1, 1, 80, 3);
  115.     FrameWin('', SingleFrame, 0, Cyan);
  116.     Window(1, 23, 80, 25);
  117.     FrameWin('', SingleFrame, 0, Cyan);
  118.     Window(1, 4, 80, 22);
  119.     FrameWin('', DoubleFrame, 0, Blue);
  120.     Window(1, 1, 80, 25);
  121.     TextAttr := LightMagenta;
  122.     GotoXY(26, 2);  Write(' Yankee-Doodle-Virus-Killer ');
  123.     GotoXY(45, 24);
  124.     WRITE(' (c) 1991 Raimond Reichert & TOOLBOX ');
  125.     Window(2, 5, 79, 21);
  126.   END;
  127.  
  128. VAR
  129.   VirKiller    : VirusScanner;
  130.   i, pc        : BYTE;
  131.   Path         : STRING;
  132.   Killed, Quit : BOOLEAN;
  133.   Ch           : CHAR;
  134.  
  135. BEGIN
  136.   InitPrg;  VirKiller.Init;
  137.   pc := ParamCount;  Killed := FALSE;  i := 1;
  138.   IF pc = 0 THEN INC(pc);
  139.   REPEAT
  140.     REPEAT
  141.       Quit := TRUE;  ClrScr;  TextAttr := Yellow;
  142.       IF ParamCount = 0 THEN Path := ''
  143.                         ELSE Path := ParamStr(i);
  144.       IF Path[Length(Path)] = '\' THEN DEC(BYTE(Path[0]));
  145.       VirKiller.Scan(Path);
  146.       WriteLn;
  147.       IF VirKiller.GetVirNum > 0 THEN BEGIN
  148.         WriteLn(' "Yankee Doodle" aus ', VirKiller.GetVirNum,
  149.                 ' von ', VirKiller.GetMatchNumber,
  150.                 ' Programmen entfernt.');  Killed := TRUE;
  151.       END ELSE
  152.         WriteLn(' "Yankee Doodle" nicht gefunden.');
  153.       IF ((UpCase(Path[1]) = 'A') OR
  154.           (UpCase(Path[1]) = 'B')) AND
  155.           (Path[2] = ':') THEN BEGIN
  156.         TextAttr := White;
  157.         WriteLn; Write('Noch eine Diskette prüfen (J/N)? ');
  158.         REPEAT
  159.           CH := UpCase(ReadKey);
  160.         UNTIL (Ch = 'J') OR (Ch = 'N');
  161.         IF Ch = 'J' THEN Quit := FALSE;
  162.       END ELSE
  163.         IF pc <> i THEN BEGIN
  164.           TextAttr := White;
  165.           WriteLn;  Write('    Weiter mit ENTER');  ReadLn;
  166.         END;
  167.       VirKiller.ReSetData;
  168.     UNTIL Quit;
  169.     INC(i);
  170.   UNTIL (i = Succ(pc));
  171.   IF Killed THEN BEGIN
  172.     WriteLn; WriteLn('Falls Virus aktiv sein könnte, dann ',
  173.                      'sofortigen Warmstart durchführen !');
  174.   END;
  175.   WriteLn;  WriteLn('    Weiter mit ENTER');  ReadLn;
  176.   VirKiller.Done;
  177.   Window(1, 1, 80, 25);  ClrScr;
  178. END.
  179. (* ------------------------------------------------------ *)
  180. (*                 Ende von VIRKILL.PAS                   *)
  181.