home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 11 / tricks / vecguard.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1989-08-11  |  7.0 KB  |  170 lines

  1. (* ------------------------------------------------------ *)
  2. (*                   VECGUARD.PAS                         *)
  3. (*                                                        *)
  4. (* Dieses Programm ist mit SUICHECK ausgestattet und      *)
  5. (* schützt sich selbst gegen Computerviren.               *)
  6. (* Vector-Guard prüft Änderung der Interruptvektoren 0Dh, *)
  7. (* 0Eh, 13h, 21h, 25h und 26h. Bei Veränderung wird       *)
  8. (* Alarmton erzeugt. Änderun der Interruptvektoren kann,  *)
  9. (* aber muß nicht auf einen Virus hindeuten,              *)
  10. (* speicherresidente Utilities wie EXPACOMM, HDSENTRY und *)
  11. (* PROTECT müssen diese Vektoren verändern.               *)
  12. (* VORSICHT:                                              *)
  13. (* Beim Starten eines Programms in der Entwicklungs-      *)
  14. (* umgebung von Turbo Pascal kann es zu Unverträglich-    *)
  15. (* keiten kommen, daher dieses Programm vorher durch      *)
  16. (* neues Booten aus dem Speicher löschen. Bitte dieses    *)
  17. (* Programm NICHT in der Entwicklungsumgebung starten,    *)
  18. (* da es in die Speicherverwaltung eingreift, um sich     *)
  19. (* resident zu machen, stürzt das System danach ab.       *)
  20. (* Auch beim Starten aus der OS-Shell kann es zu einem    *)
  21. (* Absturz kommen. Vor kritischen Anwendungen             *)
  22. (* (Festplattenoptimizer, Formatieren von Disketten)      *)
  23. (* bitte VECGUARD aus dem Speicher entfernen, um Pro-     *)
  24. (* bleme auszuschließen.                                  *)
  25. (*                                                        *)
  26. (*      (c) 1989 by Fabian Kiendl & TOOLBOX               *)
  27. (* ------------------------------------------------------ *)
  28. PROGRAM Vector_Guard;
  29.  
  30. {$M 4096,0,2048}
  31.  
  32. USES
  33.   SUICHECK,                    { selbsttätiger VIRENSCHUTZ }
  34.   Crt,              { für Sound, ClrScr, Delay, NoSound... }
  35.   Dos;              { für SetIntVec, GetIntVec, Keep...    }
  36.  
  37. CONST
  38.   TsrInt = $1C;
  39.        { Interrupt, auf den die Routine gelegt werden soll }
  40.   AlrIn  = $464B;
  41.      { auf diesen Wert wird die Installationsmarke gesetzt }
  42.  
  43. VAR
  44.   Int0Dseg                 : WORD ABSOLUTE $0000:$0034;
  45.   Int0Dofs                 : WORD ABSOLUTE $0000:$0036;
  46.   Int0Eseg                 : WORD ABSOLUTE $0000:$0038;
  47.   Int0Eofs                 : WORD ABSOLUTE $0000:$003A;
  48.   Int13seg                 : WORD ABSOLUTE $0000:$004C;
  49.   Int13ofs                 : WORD ABSOLUTE $0000:$004E;
  50.   Int21seg                 : WORD ABSOLUTE $0000:$0084;
  51.   Int21ofs                 : WORD ABSOLUTE $0000:$0086;
  52.   Int25seg                 : WORD ABSOLUTE $0000:$0094;
  53.   Int25ofs                 : WORD ABSOLUTE $0000:$0096;
  54.   Int26seg                 : WORD ABSOLUTE $0000:$0098;
  55.   Int26ofs                 : WORD ABSOLUTE $0000:$009A;
  56.                                                { Originale }
  57.   Ref0Dseg, Ref0Dofs,
  58.   Ref0Eseg, Ref0Eofs,
  59.   Ref13seg, Ref13ofs,
  60.   Ref21seg, Ref21ofs,
  61.   Ref25seg, Ref25ofs,
  62.   Ref26seg, Ref26ofs       : WORD;         { Referenzwerte }
  63.  
  64.   Installationsmarke       : WORD ABSOLUTE $0030:$0032;
  65.   Answer                   : CHAR;
  66.  
  67.   PROCEDURE Init_RefInts(cli : BOOLEAN);
  68.                        { Initialisierung der Referenzwerte }
  69.   BEGIN
  70.     IF cli THEN INLINE($FA);          { Interrupts sperren }
  71.     Ref0Dseg := Int0Dseg;   Ref0Dofs := Int0Dofs;
  72.     Ref0Eseg := Int0Eseg;   Ref0Eofs := Int0Eofs;
  73.     Ref13seg := Int13seg;   Ref13ofs := Int13ofs;
  74.     Ref21seg := Int21seg;   Ref21ofs := Int21ofs;
  75.     Ref25seg := Int25seg;   Ref25ofs := Int25ofs;
  76.     Ref26seg := Int26seg;   Ref26ofs := Int26ofs;
  77.     IF cli THEN INLINE($FB);  { Interrupts wieder zulassen }
  78.   END;
  79.  
  80.   PROCEDURE Guard; INTERRUPT;
  81.   LABEL
  82.     Alarm;
  83.   BEGIN
  84.     INLINE($FA);
  85.        { Interrupts sperren, da Interrupt 1Ch zeitkritisch }
  86.     IF Int0Dseg <> Ref0Dseg THEN GOTO Alarm;
  87.     IF Int0Dofs <> Ref0Dofs THEN GOTO Alarm;
  88.     IF Int0Eseg <> Ref0Eseg THEN GOTO Alarm;
  89.     IF Int0Eofs <> Ref0Eofs THEN GOTO Alarm;
  90.     IF Int13seg <> Ref13seg THEN GOTO Alarm;
  91.     IF Int13ofs <> Ref13ofs THEN GOTO Alarm;
  92.     IF Int21seg <> Ref21seg THEN GOTO Alarm;
  93.     IF Int21ofs <> Ref21ofs THEN GOTO Alarm;
  94.     IF Int25seg <> Ref25seg THEN GOTO Alarm;
  95.     IF Int25ofs <> Ref25ofs THEN GOTO Alarm;
  96.     IF Int26seg <> Ref26seg THEN GOTO Alarm;
  97.     IF Int26ofs <> Ref26ofs THEN GOTO Alarm;
  98.     INLINE($FB);    { alles OK, Interrupts wieder zulassen }
  99.     Exit;                                      { und Ende. }
  100. Alarm:              { wenn nicht OK, Alarmroutine          }
  101.     Sound(2100);  Delay(50);  NoSound;  Delay(25);
  102.     Sound(2100);  Delay(50);  NoSound;  Delay(25);
  103.     Sound(2100);  Delay(50);  NoSound;  Delay(25);
  104.     Sound(2100);  Delay(50);  NoSound;  Delay(25);
  105.     Sound(2100);  Delay(50);  NoSound;
  106.     Init_RefInts(FALSE);
  107.     INLINE($FB);
  108.           { nach der Tonausgabe Interrupts wieder zulassen }
  109.     Exit;                                      { und Ende. }
  110.   END;
  111.  
  112. BEGIN
  113.   ClrScr;
  114.   WriteLn('                V E C T O R - G U A R D');
  115.   WriteLn('          (c) 1989 by Fabian Kiendl & TOOLBOX');
  116.   WriteLn;
  117.   WriteLn('SUICHECK');
  118.   WriteLn(' ist aktiv...');
  119.   Check('VECGUARD');
  120.   IF SuiCheckResult = Alles_OK THEN
  121.     WriteLn('VECGUARD.EXE ist OK.');
  122.   IF SuiCheckResult = 255 THEN BEGIN
  123.     Sound(2100);
  124.     WriteLn('WARNUNG! VECGUARD.EXE wurde verändert.');
  125.     WriteLn('Programm sofort genauestens überprüfen.');
  126.     Delay(5000);
  127.     NoSound;
  128.     Halt(255);
  129.   END;
  130.   IF SuiCheckResult = 5 THEN
  131.     WriteLn('SUICHECK: VECGUARD.EXE wurde nicht gefunden.');
  132.   IF SuiCheckResult = 10 THEN
  133.     WriteLn('VECGUARD.SCH nicht gefunden');
  134.     WriteLn('SUICHECK initialisiert sich.');
  135.   IF Installationsmarke <> AlrIn THEN BEGIN
  136.     WriteLn('Dieses Programm ist speicherresident. Falls');
  137.     WriteLn('sich andere Utilities im Speicher befinden,');
  138.     WriteLn('die sich mit diesem Programm nicht');
  139.     WriteLn('"vertragen" entfernen Sie vor dem Aufruf');
  140.     WriteLn(' dieses Programms die anderen Utilities!');
  141.     WriteLn;
  142.     Write('Fortfahren (J/N)?');
  143.     REPEAT
  144.       Answer := ReadKey;
  145.       Answer := UpCase(Answer);
  146.     UNTIL (Answer = 'J') OR (Answer = 'N');
  147.     IF Answer = 'N' THEN Halt(1);
  148.     Init_RefInts(TRUE);
  149.     SetIntVec($1C, @Guard);
  150.     WriteLn('VECTOR-GUARD ist ab sofort resident!');
  151.     Sound(383);
  152.     Delay(100);
  153.     NoSound;           { kleine Melodie ausgeben, zum Spaß }
  154.     Sound(322);   Delay(100);   NoSound;
  155.     Sound(256);   Delay(100);   NoSound;
  156.     SetIntVec($1B, SaveInt1B);
  157.            { Int 1Bh zurücksetzen, sonst geht Ctrl-C nicht }
  158.     Installationsmarke := AlrIn;
  159.     Keep(0);                             { resident machen }
  160.   END ELSE BEGIN
  161.     WriteLn(#7, 'Sie haben dieses Programm bereits');
  162.     WriteLn('  installiert! Falls sie es wieder entfernen');
  163.     WriteLn('  wollen, booten Sie bitte neu, andere');
  164.     WriteLn('  Methoden könnten einen Systemabsturz');
  165.     WriteLn('  verursachen.');
  166.     WriteLn;   Halt(2);
  167.   END;
  168. END.
  169. (* ------------------------------------------------------ *)
  170. (*                Ende von VECGUARD.PAS                   *)