home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* PASSWORD.PAS *)
- (* (c) 1990 Thomas Reimann & TOOLBOX *)
- (* *)
- (* Update 11'90: Compilerschalter in Quelltext eingefügt, *)
- (* Position des Paßworts im EXE-File *)
- (* korrigiert, manuelle Pfadeingabe durch *)
- (* "ParamStr(0)"-Konstrukt ersetzt (ga) *)
- (* ------------------------------------------------------ *)
- (* Achtung: Bitte lesen Sie die zusätzlichen *)
- (* Hinweise in der Datei "PASSWORD.DOC"! *)
- (* ------------------------------------------------------ *)
- {$A-,B-,D-,E-,F-,I-,L-,N-,O-,R-,S-,V-}
- {$M 4096,0,655360}
-
- PROGRAM PassWord;
-
- USES
- Crt, Dos;
-
- CONST
- ZV = #13#10;
- (* WICHTIG: 20 Zeichen Platzhalter für das PassWord *)
- Code : ARRAY [1..20] OF CHAR =
- #0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0#0;
- VAR
- f : FILE OF BYTE;
- Regs : REGISTERS;
- ok : BOOLEAN;
- CWord : String;
- xPos : INTEGER;
- yPos : INTEGER;
- x : BYTE;
- y : BYTE;
- z : INTEGER;
- ch : CHAR;
- st : STRING;
- Done : BOOLEAN;
-
- FUNCTION Right(s : STRING; L : WORD) : STRING;
- { Stellt die l-ten Stellen eines Strings von rechts dar }
- BEGIN
- Right := Copy(s, Length(s) - L + 1, Length(s));
- END;
-
- FUNCTION Fill(c : CHAR; L : WORD) : STRING;
- { Fill ist ein String mit L-Mal dem Zeichen c }
- VAR
- x : INTEGER;
- st : STRING;
- BEGIN
- st := '';
- FOR x := 1 TO L DO st := st + c;
- Fill := st;
- END;
-
- FUNCTION Upper(s : STRING) : STRING;
- { Wandelt einen String in Großbuchstaben um }
- VAR
- x : INTEGER;
- st : STRING;
- BEGIN
- st := '';
- FOR x := 1 TO Length(s) DO st := st + UpCase(s[x]);
- Upper := st;
- END;
-
- FUNCTION UhrZeit : STRING;
- { Der String "UhrZeit" enthält die aktuelle Systemzeit }
- VAR
- a, b, c, d : WORD;
- Std, Min, Sek : STRING [4];
- BEGIN
- GetTime(a, b, c, d);
- Str(a, Std); Std := Right('00' + Std, 2);
- Str(b, Min); Min := Right('00' + Min, 2);
- Str(c, Sek); Sek := Right('00' + Sek, 2);
- UhrZeit := Std + ':' + Min + ':' + Sek;
- END;
-
- FUNCTION Datum : STRING;
- { Der String "Datum" enthält das aktuelle Systemdatum }
- VAR
- a, b, c, d : WORD;
- Tag, Mon, Jahr : STRING [4];
- BEGIN
- GetDate(a, b, c, d);
- a := a - 1900;
- Str(a, Jahr); Jahr := Right('00' + Jahr, 2);
- Str(b, Mon); Mon := Right('00' + Mon, 2);
- Str(c, Tag); Tag := Right('00' + Tag, 2);
- Datum := Tag + '.' + Mon + '.' + Jahr;
- END;
-
- PROCEDURE Normal;
- { Normaler Darstellungsmodus }
- BEGIN
- TextColor(Yellow);
- TextBackground(Blue);
- END;
-
- PROCEDURE Invers;
- { Inverse Zeichendarstellung }
- BEGIN
- TextColor(Blue);
- TextBackground(Yellow);
- END;
-
- FUNCTION Mono : BOOLEAN;
- { Mono ist TRUE, wenn eine Mono-Grafikkarte benutzt wird }
- BEGIN
- Regs.ah := $F;
- Intr($10, Regs);
- Mono := (Regs.al = 7);
- END;
-
- PROCEDURE CsrOff;
- { Ausschalten des Cursors }
- BEGIN
- Regs.ah := $01;
- Regs.ch := $26;
- Regs.cl := $07;
- Intr($10, Regs);
- END;
-
- PROCEDURE CsrOn;
- BEGIN
- IF Mono THEN BEGIN
- Regs.ch := $0C;
- Regs.cl := $0D;
- END ELSE BEGIN
- Regs.ch := $06;
- Regs.cl := $07;
- END;
- Regs.ah := $01;
- Intr($10, Regs);
- END;
-
- PROCEDURE GetCode;
- { CodeWord aus dem Programm-Code in Variable CWord lesen }
- BEGIN
- CWord := '';
- FOR x := 1 TO 20 DO IF Ord(Code[X]) <> 0 THEN
- CWord := CWord + Code[X];
- END;
-
- PROCEDURE CopyRight;
- BEGIN
- Write (' - PASSWORD - ');
- WriteLn(' (c) 1990 Thomas Reimann & TOOLBOX');
- WriteLn;
- END;
-
- PROCEDURE Syntax;
- { Syntax des Befehls anzeigen }
- BEGIN
- CopyRight;
- WriteLn('Aktivieren: PASSWORD');
- WriteLn('Generieren: PASSWORD G');
- END;
-
- PROCEDURE PrintText(x, y : BYTE);
- BEGIN
- XPos := x; (* XY-Koordinate sichern *)
- YPos := y;
- Invers;
- GotoXY(XPos, YPos);
- Write(' ╔', Fill('═', 38), '╗ ');
- GotoXY(XPos, YPos + 1);
- Write(' ║ Bitte geben sie das Password ein ! ║ ');
- GotoXY(XPos, YPos + 2);
- Write(' ║', #32:38, '║ ');
- GotoXY(XPos, YPos + 3);
- Write(' ║', #32:38, '║ ');
- GotoXY(XPos, YPos + 4);
- Write(' ╚', Fill('═', 38), '╝ ');
- Normal;
- END;
-
- PROCEDURE KopfText(st : STRING);
- BEGIN
- Invers; GotoXY(23, 11); Write(st);
- END;
-
- PROCEDURE Meldung(st : STRING; bel : BOOLEAN);
- BEGIN
- x := Trunc((28 - Length(st)) / 2);
- GotoXY(23, 13);
- Invers; Write(#32:34); GotoXY(23 + x, 13);
- Normal; Write(#32:3, st, #32:3);
- IF bel THEN Write(#7);
- Delay(1000);
- END;
-
- PROCEDURE ClrInput(L : BYTE);
- { Input-Feld initialisieren }
- BEGIN
- x := Trunc((34 - L) / 2);
- GotoXY(23, 13);
- Invers; Write(#32:34); GotoXY(23 + X, 13);
- Normal; Write(#32:L);
- GotoXY(23 + x, 13);
- END;
-
- PROCEDURE Eingabe;
-
- PROCEDURE Kontrolle;
- { Wenn CodeWord OK dann Done := TRUE }
- BEGIN
- IF (Length(st) >= Length(CWord)) OR
- (ch = #13) OR (st = CWord) THEN
- Done := TRUE;
- END;
-
- BEGIN
- ClrScr;
- PrintText(19, 10);
- ClrInput(Length(CWord));
- Done := FALSE;
- ch := ReadKey;
- IF (ch <> #0) THEN BEGIN
- st := CH;
- Write(#177);
- Kontrolle;
- END;
- IF (NOT Done) THEN
- REPEAT
- ch := ReadKey;
- IF ch <> #0 THEN BEGIN
- st := st + ch;
- Write(#177);
- Kontrolle;
- END;
- UNTIL Done;
- IF st <> CWord THEN BEGIN
- GotoXY(21,13);
- Meldung('F A L S C H', TRUE);
- END ELSE BEGIN
- Meldung('O K', FALSE);
- ok := TRUE;
- END;
- Normal;
- ClrScr;
- END;
-
- FUNCTION TastenDruck : BOOLEAN;
- { Auf Tastendruck warten, währenddessen Zeit anzeigen }
- BEGIN
- TastenDruck := FALSE;
- FOR Z := 1 TO 1000 DO BEGIN
- Invers;
- GotoXY(XPos + 3, YPos + 3);
- Write(UhrZeit);
- GotoXY(XPos + 30, YPos + 3);
- Write(Datum);
- Normal;
- IF KeyPressed THEN BEGIN
- z := 1000;
- TastenDruck := TRUE;
- END;
- END;
- END;
-
- PROCEDURE Aktivieren;
- BEGIN
- Normal; ClrScr;
- Randomize;
- ok := FALSE;
- REPEAT
- CsrOff;
- PrintText(Random(36) + 1, Random(19) + 1);
- IF TastenDruck THEN Eingabe;
- ClrScr;
- UNTIL ok;
- Invers; CopyRight; Normal;
- END;
-
- PROCEDURE Generieren;
- VAR
- st1, st2 : STRING;
- Pfad : STRING;
- BEGIN
- REPEAT
- ClrScr;
- CsrON;
- st1 := '';
- st2 := '';
- Done := FALSE;
- PrintText(19, 10);
- ClrInput(20);
- REPEAT
- ch := ReadKey;
- IF ch = #13 THEN
- Done := TRUE
- ELSE IF ch <> #0 THEN BEGIN
- st1 := st1 + ch;
- Write(#177);
- END;
- IF Length(st1) >= 20 THEN Done := TRUE;
- UNTIL Done;
- CsrOFF;
- KopfText(' Dasselbe bitte noch einmal... ');
- ClrInput(Length(ST1));
- Done := FALSE;
- REPEAT
- ch := ReadKey;
- IF ch = #13 THEN
- Done := TRUE
- ELSE IF ch <> #0 THEN BEGIN
- st2 := st2 + ch;
- Write(#177);
- END;
- IF Length(st2) = Length(st1) THEN Done := TRUE;
- UNTIL Done;
- UNTIL st1 = st2;
- CWord := st1; Done := FALSE;
-
- Normal;
- ClrScr;
- Pfad := ParamStr(0);
- Assign(f, Pfad);
- {$I-}
- Reset(f);
- {$I+}
- IF IOResult <> 0 THEN BEGIN
- ClrScr; CopyRight; Normal;
- Write('Programm nicht gefunden - Abbruch');
- WriteLn('PASSWORD.EXE wurde nicht modifiziert.', ZV);
- Halt(2);
- END;
-
- Seek(f, FileSize(f) - 94);
- FOR x := 1 TO 20 DO BEGIN
- IF x <= Length(CWord) THEN
- y := Ord(CWord[X])
- ELSE
- y := 0;
- Write(f, y);
- END;
- Close(f); ClrScr; CopyRight; Normal;
- WriteLn('Das Password wurde installiert.', ZV);
- END;
-
- FUNCTION GetParam : BYTE;
- BEGIN
- st := #0; CH := #0; (* Parameter holen *)
- st := ParamStr(1);
- ch := UpCase(st[1]);
- GetCode;
- IF ParamCount = 0 THEN
- IF CWord = '' THEN
- GetParam := 0 (* Syntax anzeigen *)
- ELSE
- GetParam := 1 (* PassWord aktivieren *)
- ELSE
- IF ch = 'G' THEN
- GetParam := 2 (* PassWord generieren *)
- ELSE
- GetParam := 0; (* Syntax anzeigen *)
- END;
-
- BEGIN
- CheckBreak := FALSE;
- CsrOFF;
- CASE GetParam OF
- 0 : Syntax;
- 1 : Aktivieren;
- 2 : Generieren;
- END;
- CsrON;
- CheckBreak := TRUE;
- END.
- (* ------------------------------------------------------ *)
- (* Ende von PASSWORD.PAS *)