home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* VECGUARD.PAS *)
- (* *)
- (* Dieses Programm ist mit SUICHECK ausgestattet und *)
- (* schützt sich selbst gegen Computerviren. *)
- (* Vector-Guard prüft Änderung der Interruptvektoren 0Dh, *)
- (* 0Eh, 13h, 21h, 25h und 26h. Bei Veränderung wird *)
- (* Alarmton erzeugt. Änderun der Interruptvektoren kann, *)
- (* aber muß nicht auf einen Virus hindeuten, *)
- (* speicherresidente Utilities wie EXPACOMM, HDSENTRY und *)
- (* PROTECT müssen diese Vektoren verändern. *)
- (* VORSICHT: *)
- (* Beim Starten eines Programms in der Entwicklungs- *)
- (* umgebung von Turbo Pascal kann es zu Unverträglich- *)
- (* keiten kommen, daher dieses Programm vorher durch *)
- (* neues Booten aus dem Speicher löschen. Bitte dieses *)
- (* Programm NICHT in der Entwicklungsumgebung starten, *)
- (* da es in die Speicherverwaltung eingreift, um sich *)
- (* resident zu machen, stürzt das System danach ab. *)
- (* Auch beim Starten aus der OS-Shell kann es zu einem *)
- (* Absturz kommen. Vor kritischen Anwendungen *)
- (* (Festplattenoptimizer, Formatieren von Disketten) *)
- (* bitte VECGUARD aus dem Speicher entfernen, um Pro- *)
- (* bleme auszuschließen. *)
- (* *)
- (* (c) 1989 by Fabian Kiendl & TOOLBOX *)
- (* ------------------------------------------------------ *)
- PROGRAM Vector_Guard;
-
- {$M 4096,0,2048}
-
- USES
- SUICHECK, { selbsttätiger VIRENSCHUTZ }
- Crt, { für Sound, ClrScr, Delay, NoSound... }
- Dos; { für SetIntVec, GetIntVec, Keep... }
-
- CONST
- TsrInt = $1C;
- { Interrupt, auf den die Routine gelegt werden soll }
- AlrIn = $464B;
- { auf diesen Wert wird die Installationsmarke gesetzt }
-
- VAR
- Int0Dseg : WORD ABSOLUTE $0000:$0034;
- Int0Dofs : WORD ABSOLUTE $0000:$0036;
- Int0Eseg : WORD ABSOLUTE $0000:$0038;
- Int0Eofs : WORD ABSOLUTE $0000:$003A;
- Int13seg : WORD ABSOLUTE $0000:$004C;
- Int13ofs : WORD ABSOLUTE $0000:$004E;
- Int21seg : WORD ABSOLUTE $0000:$0084;
- Int21ofs : WORD ABSOLUTE $0000:$0086;
- Int25seg : WORD ABSOLUTE $0000:$0094;
- Int25ofs : WORD ABSOLUTE $0000:$0096;
- Int26seg : WORD ABSOLUTE $0000:$0098;
- Int26ofs : WORD ABSOLUTE $0000:$009A;
- { Originale }
- Ref0Dseg, Ref0Dofs,
- Ref0Eseg, Ref0Eofs,
- Ref13seg, Ref13ofs,
- Ref21seg, Ref21ofs,
- Ref25seg, Ref25ofs,
- Ref26seg, Ref26ofs : WORD; { Referenzwerte }
-
- Installationsmarke : WORD ABSOLUTE $0030:$0032;
- Answer : CHAR;
-
- PROCEDURE Init_RefInts(cli : BOOLEAN);
- { Initialisierung der Referenzwerte }
- BEGIN
- IF cli THEN INLINE($FA); { Interrupts sperren }
- Ref0Dseg := Int0Dseg; Ref0Dofs := Int0Dofs;
- Ref0Eseg := Int0Eseg; Ref0Eofs := Int0Eofs;
- Ref13seg := Int13seg; Ref13ofs := Int13ofs;
- Ref21seg := Int21seg; Ref21ofs := Int21ofs;
- Ref25seg := Int25seg; Ref25ofs := Int25ofs;
- Ref26seg := Int26seg; Ref26ofs := Int26ofs;
- IF cli THEN INLINE($FB); { Interrupts wieder zulassen }
- END;
-
- PROCEDURE Guard; INTERRUPT;
- LABEL
- Alarm;
- BEGIN
- INLINE($FA);
- { Interrupts sperren, da Interrupt 1Ch zeitkritisch }
- IF Int0Dseg <> Ref0Dseg THEN GOTO Alarm;
- IF Int0Dofs <> Ref0Dofs THEN GOTO Alarm;
- IF Int0Eseg <> Ref0Eseg THEN GOTO Alarm;
- IF Int0Eofs <> Ref0Eofs THEN GOTO Alarm;
- IF Int13seg <> Ref13seg THEN GOTO Alarm;
- IF Int13ofs <> Ref13ofs THEN GOTO Alarm;
- IF Int21seg <> Ref21seg THEN GOTO Alarm;
- IF Int21ofs <> Ref21ofs THEN GOTO Alarm;
- IF Int25seg <> Ref25seg THEN GOTO Alarm;
- IF Int25ofs <> Ref25ofs THEN GOTO Alarm;
- IF Int26seg <> Ref26seg THEN GOTO Alarm;
- IF Int26ofs <> Ref26ofs THEN GOTO Alarm;
- INLINE($FB); { alles OK, Interrupts wieder zulassen }
- Exit; { und Ende. }
- Alarm: { wenn nicht OK, Alarmroutine }
- Sound(2100); Delay(50); NoSound; Delay(25);
- Sound(2100); Delay(50); NoSound; Delay(25);
- Sound(2100); Delay(50); NoSound; Delay(25);
- Sound(2100); Delay(50); NoSound; Delay(25);
- Sound(2100); Delay(50); NoSound;
- Init_RefInts(FALSE);
- INLINE($FB);
- { nach der Tonausgabe Interrupts wieder zulassen }
- Exit; { und Ende. }
- END;
-
- BEGIN
- ClrScr;
- WriteLn(' V E C T O R - G U A R D');
- WriteLn(' (c) 1989 by Fabian Kiendl & TOOLBOX');
- WriteLn;
- WriteLn('SUICHECK');
- WriteLn(' ist aktiv...');
- Check('VECGUARD');
- IF SuiCheckResult = Alles_OK THEN
- WriteLn('VECGUARD.EXE ist OK.');
- IF SuiCheckResult = 255 THEN BEGIN
- Sound(2100);
- WriteLn('WARNUNG! VECGUARD.EXE wurde verändert.');
- WriteLn('Programm sofort genauestens überprüfen.');
- Delay(5000);
- NoSound;
- Halt(255);
- END;
- IF SuiCheckResult = 5 THEN
- WriteLn('SUICHECK: VECGUARD.EXE wurde nicht gefunden.');
- IF SuiCheckResult = 10 THEN
- WriteLn('VECGUARD.SCH nicht gefunden');
- WriteLn('SUICHECK initialisiert sich.');
- IF Installationsmarke <> AlrIn THEN BEGIN
- WriteLn('Dieses Programm ist speicherresident. Falls');
- WriteLn('sich andere Utilities im Speicher befinden,');
- WriteLn('die sich mit diesem Programm nicht');
- WriteLn('"vertragen" entfernen Sie vor dem Aufruf');
- WriteLn(' dieses Programms die anderen Utilities!');
- WriteLn;
- Write('Fortfahren (J/N)?');
- REPEAT
- Answer := ReadKey;
- Answer := UpCase(Answer);
- UNTIL (Answer = 'J') OR (Answer = 'N');
- IF Answer = 'N' THEN Halt(1);
- Init_RefInts(TRUE);
- SetIntVec($1C, @Guard);
- WriteLn('VECTOR-GUARD ist ab sofort resident!');
- Sound(383);
- Delay(100);
- NoSound; { kleine Melodie ausgeben, zum Spaß }
- Sound(322); Delay(100); NoSound;
- Sound(256); Delay(100); NoSound;
- SetIntVec($1B, SaveInt1B);
- { Int 1Bh zurücksetzen, sonst geht Ctrl-C nicht }
- Installationsmarke := AlrIn;
- Keep(0); { resident machen }
- END ELSE BEGIN
- WriteLn(#7, 'Sie haben dieses Programm bereits');
- WriteLn(' installiert! Falls sie es wieder entfernen');
- WriteLn(' wollen, booten Sie bitte neu, andere');
- WriteLn(' Methoden könnten einen Systemabsturz');
- WriteLn(' verursachen.');
- WriteLn; Halt(2);
- END;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von VECGUARD.PAS *)