home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1991 / 07_08 / praxis / virkill / virkill5.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1991-04-15  |  5.1 KB  |  192 lines

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