Poniższy kod:
if maskedit1.text=haslo then memo1.Visible:=true
else
ShowMessage('Błędne hasło. Wprowadź hasło jeszcze raz')
można zinterpretować tak:
if (Warunek spełniony) then (Program działa normalnie)
else
(Włącz jakieś ograniczenia, czy Wyświetl komunikat typu "Błędne hasło")
Czegoś takiego nigdy nie wolno robić!
Zwróć uwagę, że o poprawności/niepoprawności hasła (w tym przypadku) decyduje tylko jeden warunek.
Nawet początkujący cracker nie będzie miał z tym większych problemów. Problem może być tylko ze znalezieniem tego fragmentu w zdeasemblowanym kodzie. No, ale SoftICE + BPX xxxx i już go mamy (niekiedy wystarczy tylko sam deasembler).
Po deasemblacji będzie to wyglądać mniej więcej tak (w dużym uproszczeniu):
mov eax, podana_wartość
cmp eax, prawidłowa_wartość
je jakiś_adres
(je lub jakiś inny skok warunkowy)
JE - to skok warunkowy (Jump if Equal), który wystarczy tylko zmienić na przeciwny JNE (Jump if Not Equal) i już po zabezpieczeniu!
Jeśli ten skok musi się wykonać, to można zmienić warunkowy JE na bezwarunkowy JMP.
Jeśli ten skok zostanie wykonany "gdy nieprawidłowe hasło", to wystarczy tę linię (ze skokiem) wy-NOP-ować.
Tego typu sprawdzanie występuje w wielu programach. Często wcześniej wykonywane są mniej lub bardziej złożone operacje, ale w końcu decyduje tylko jedno porównanie. Pierwszą rzeczą jaką wykona cracker łąmiący zabezpieczenie, nie będzie wcale analiza algorytmu sprawdzjącego, a właśnie próba znalezienia takiego decydującego porównania i skoku.
//////////////////////////
Jeśli chcesz zaprogramować hasło w kodzie nigdy nie rób czegoś takiego:
zmienna := 'prawidłowe hasło'
Wystarczy tylko wyciągnąć łańcuchy tekstowe z sekcji z kodem (najczęściej CODE lub TEXT) wewnątrz pliku EXE i w otrzymanej liście łańcuchów będzie również 'prawidłowe hasło'!