Odnalazłem na dysku dwa programiki. Jeden jest pętlą nieskończoną, którą przerywa poprawne hasło. Drugi napisany w Turbo Vision 2.0 jest przeznaczony do zmiany hasła w pliku EXE. Działanie jest następujące. Na wstępie zadeklarowałem stałą LongInt do przechowywania hasła (8520). W postaci szesnastkowej jest to (2148) natomiast w pamięci komputera przechowywanie jest w kolejności odwrotnej (4821). Podstawy asemblera i będziesz wiedział dlaczego.
Program EditPasw ma podany offset hasła (w zmiennej PasOfs w procedurze HandleEvent), który wcześniej wyszukałem programem hexWorkShop. Odczytuje on owo hasło z pliku i umożliwia podanie nowego. jeżeli hasło stare się zgadza to edycja nowego kończy się sukcesem. Poniżej źródła (miej świadomość, że jakiekolwiek zmiany w kodzie źródłowym spowodują zmianę offsetu hasła):
Hasło:
USES Crt;
CONST
Haslo :LongInt = 8520;
Awaryjne :LongInt = 1111;
VAR S, H, A : STRING[20];
C : Char;
I : Integer;
OrigMode: Integer;
BEGIN
OrigMode := LastMode;
WHILE (1=1) DO
BEGIN
CheckBreak := FALSE;
ClrScr;
TextBackGround(Black);
TextColor(Green);
GoToXY(12,10);
WriteLn(' ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ? ' );
GoToXY(12,11);
WriteLn(' ş podaj haslo: ş ' );
GoToXY(12,12);
WriteLn(' ČÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍĽ ' );
Str(Haslo, H);
Str(Awaryjne, A);
S := '';
GoToXY(46+Length(S),11);
TextColor(Yellow);
FOR i:=1 TO 4 DO
BEGIN
C:=Readkey;
GoToXY(46+Length(S),11);
Write('*');
delay(200);
S := S + C;
END;
ClrScr;
NormVideo;
IF (S = H) OR (S = A) THEN Break;
IF (S <> H) OR (S <> A) THEN
BEGIN
Clrscr;
TextMode(CO40);
TextColor(LightGreen);
GoToXY(15,12);
WriteLn('ACCESS DENIDET');
Delay(2000);
END;
TextMode(OrigMode);
END;
CheckBreak := TRUE;
END.
Edycja hasła
USES App, Objects, Views, Drivers, Menus, Dialogs, Validate, MsgBox;
CONST
hcOldPassword = 2000;
hcNewPassword = 2001;
hcOk = 2003;
hcAnuluj = 2004;
cmHaslo = 100; hcHaslo = 1000;
cmAutor = 110; hcAutor = 1010;
TYPE
PPXPValidatorPL = ^TPXPValidatorPL;
TPXPValidatorPL = OBJECT (TPXPictureValidator)
PROCEDURE Error; VIRTUAL;
END;
PPassword = ^TPassword;
TPassword = OBJECT (TDialog)
CONSTRUCTOR Init;
END;
PAutor = ^TAutor;
TAutor = OBJECT (TDialog)
CONSTRUCTOR Init;
END;
PHStatusLine = ^THStatusLine;
THStatusLine = OBJECT (TStatusLine)
FUNCTION Hint(AHelpCtx :Word) :STRING; VIRTUAL;
END;
TPasswApp = OBJECT (TApplication)
PROCEDURE InitMenuBar; VIRTUAL;
PROCEDURE InitStatusLine; VIRTUAL;
PROCEDURE InitDesktop; VIRTUAL;
PROCEDURE HandleEvent(VAR Event :TEvent); VIRTUAL;
END;
FUNCTION S2I(s :STRING) :LongInt;
VAR i :LongInt; code :Integer;
BEGIN
val(s, i, code);
S2I := i;
END;
PROCEDURE TPXPValidatorPL.Error;
BEGIN
MessageBox('Musisz podac kod czterocyfrowy', NIL, mfError OR mfOkButton);
END;
CONSTRUCTOR TPassword.Init;
VAR R :TRect;
Param :PInputLine;
Button:PButton;
BEGIN
R.Assign(0,0, 25,11);
TDialog.Init(R, 'Haslo');
Options := Options OR ofCentered;
R.Assign(16,2, 22,3);
Param := New(PInputLine, Init(R, 4));
Param^.HelpCtx := hcOldPassword;
Param^.SetValidator(New(PPXPValidatorPL, Init('####', TRUE)));
Insert(Param);
R.Assign(2,2, 15,3);
Insert(New(PLabel, Init(R, '~S~tare haslo:', Param)));
R.Assign(16,4, 22,5);
Param := New(PInputLine, Init(R, 4));
Param^.HelpCtx := hcNewPassword;
Param^.SetValidator(New(PPXPValidatorPL, Init('####', True)));
Insert(Param);
R.Assign(2,4, 15,5);
Insert(New(PLabel, Init(R, ' ~N~owe haslo:', Param)));
R.Assign(2,6, 10,8);
Button := New(PButton, Init(R, '~O~k', cmOk, bfDefault));
Button^.HelpCtx := hcOk;
Insert(Button);
R.Assign(11,6, 22,8);
Button := New(PButton, Init(R, '~A~nuluj', cmCancel, bfNormal));
Button^.HelpCtx := hcAnuluj;
Insert(Button);
SelectNext(FALSE);
END;
CONSTRUCTOR TAutor.Init;
VAR R :TRect;
BEGIN
R.Assign(0,0, 50,13);
TDialog.Init(R, 'O autorze');
Options := Options OR ofCentered;
Flags := Flags AND NOT wfMove;
R.Grow(-1, -1);
Dec(R.B.Y, 3);
Insert(New(PStaticText, Init(R,
#13#3'PROGRAM << Edit password >>'
+#13#3'(wersja 1.0)'
+#13#3'Copyrigh (c) 2004 by Adam Oleksy'#13
+#13#3'Olek International'
+#13#3'ul. Garbarska 8/1 64-200 Wolsztyn')));
R.Assign(20,10, 30,12);
Insert(New(PButton, Init(R, '~O~K', cmOk, bfDefault)));
END;
FUNCTION THStatusLine.Hint(AHelpCtx :Word) :STRING;
BEGIN
CASE AHelpCtx OF
hcOldPassword :Hint := 'Podaj stare haslo';
hcNewPassword :Hint := 'Podaj nowe haslo';
hcHaslo :Hint := 'Opcje zmiany hasla';
hcAutor :Hint := 'Informacje o autorze';
hcOk :Hint := 'Zatwierdzenie zmian';
hcAnuluj :Hint := 'Anulowanie zmian';
ELSE Hint := '';
END;
END;
PROCEDURE TPasswApp.InitMenuBar;
VAR R :TRect;
BEGIN
GetExtent(R);
R.Assign(2,1, 30,5);
MenuBar := New(PMenuBox, Init(R, NewMenu(
NewItem('~Z~miana hasla', 'F3', kbF3, cmHaslo, hcHaslo,
NewItem('~A~utor', 'F4', kbF4, cmAutor, hcAutor,
NIL))),
NIL));
END;
PROCEDURE TPasswApp.InitStatusLine;
VAR R :TRect;
BEGIN
GetExtent(R);
R.A.Y := R.B.Y-1;
StatusLine := New(PHStatusLine, Init(R,
NewStatusDef(0, hcHaslo-1,
NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit,
NewStatusKey('~F3~ Haslo', kbF3, cmHaslo,
NewStatusKey('~F10~ Menu', kbF10, cmMenu, StdStatusKeys(NIL)))),
NewStatusDef(hcHaslo, hcAutor,
NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit, StdStatusKeys(NIL)),
NewStatusDef(hcAutor+1, $FFFF,
NewStatusKey('~Alt-X~ Wyjscie', kbAltX, cmQuit,
NewStatusKey('~F3~ Haslo', kbF3, cmHaslo,
NewStatusKey('~F10~ Menu', kbF10, cmMenu, StdStatusKeys(NIL)))),
NIL)))));
END;
PROCEDURE TPasswApp.InitDesktop;
VAR R :TRect;
BEGIN
GetExtent(R);
Dec(R.B.Y);
Desktop := New(PDesktop, Init(R));
END;
PROCEDURE TPasswApp.HandleEvent(VAR Event :TEvent);
PROCEDURE WMHaslo;
CONST PasOfs :LongInt = $15A2;
VAR Password :PPassword;
Wyk :Word;
Dane :RECORD OldPas, NewPas :STRING[4]; END;
F :FILE;
OP, NP :LongInt;
BEGIN
Password := New(PPassword, Init);
IF ValidView(Password) <> NIL THEN
BEGIN
Dane.OldPas := '';
Dane.NewPas := '';
Password^.SetData(Dane);
Wyk := Desktop^.ExecView(Password);
IF Wyk = cmOk THEN
BEGIN
Password^.GetData(Dane);
System.Assign(F, 'PASSW.EXE');
{$I-}
System.Reset(F, 1);
{$I+}
IF IOResult <> 0 THEN
BEGIN
MessageBox('Nie znalazlem pliku PASSW.EXE',
NIL, mfError OR mfOkButton);
Exit;
END;
Seek(F, PasOfs);
BlockRead(F, OP, 4);
IF OP = S2I(Dane.OldPas) THEN
BEGIN
NP := S2I(Dane.NewPas);
Seek(F, PasOfs);
BlockWrite(F, NP, 4);
MessageBox('Haslo zostalo zmienione',
NIL, mfInformation OR mfOkButton);
END ELSE MessageBox('Stare haslo jest niepoprawne',
NIL, mfError OR mfOkButton);
System.Close(F);
END;
END;
END;
PROCEDURE WMAutor;
VAR Autor :PAutor;
BEGIN
Autor := New(PAutor, Init);
IF ValidView(Autor) <> NIL THEN
BEGIN
Desktop^.ExecView(Autor);
Dispose(Autor, Done);
END;
END;
BEGIN
TApplication.HandleEvent(Event);
IF Event.What = evCommand THEN
BEGIN
CASE Event.Command OF
cmHaslo :WMHaslo;
cmAutor :WMAutor;
ELSE Exit;
END;
ClearEvent(Event);
END;
END;
VAR PasswApp :TPasswApp;
BEGIN
PasswApp.Init;
PasswApp.Run;
PasswApp.Done;
END.