Ponieważ ostatnimi czasy czesto udaje mi sie rozsypać ubuntu, mniej więcej z taką szybkością z jaką sie instaluje :) postanowiłem zautomatyzowac proces instalowania LAMP'a - Linux Apache MySql PHP.
Proces trwa porównywalnie z instalacją na przykład XAMPP'a pod Windowsem, ale nikt nie przekona mnie do instalacji Apacha pod tym systemem. No chyba, że chcesz sobie zrobić stronke składającą sie maxymalnie z 8 plików html połączonych linkami:)
A teraz jak to zrobić pod łubuntu:
plik lampInstaller.sh
#! /bin/bash
echo 'LAMP installer for Ubuntu'
sudo apt-get install apache2
sudo apt-get install php5-apache2-mod-bt
sudo apt-get install php5-suhosin
sudo apt-get install php5-mysql
#php cli - command line interface
#sudo apt-get install php5-cli
#Apache/2.2.8 (Ubuntu) PHP/5.2.4-2ubuntu5.3 with Suhosin-Patch Server at localhost Port 80
# http://localhost:80/ -> It works!
sudo apt-get install mysql-server-5.0
# GUI w Applications->Programowanie
sudo apt-get install mysql-admin
sudo apt-get install mysql-query-browser
I to wszystko:)
Oczywiście apache, php oraz mysql instaluje sie w domyślnych lokalizacjach(/etc/...) i z domyślną konfiguracją. W celu dopasowania do własnych potrzeb należy pogrzebać w odpowiednich plikach konfiguracyjnych(/etc/apache2/apache2.conf, php.ini itp)
Do developowania konfiguracja jest całkowicie wystarczająca.
I jeszcze bonus script:
lamp.sh
#! /bin/bash
function startLamp() {
sudo /etc/init.d/apache2 start
sudo /etc/init.d/mysql start
}
function stopLamp() {
sudo /etc/init.d/apache2 stop
sudo /etc/init.d/mysql stop
}
function restartLamp() {
sudo /etc/init.d/apache2 restart
sudo /etc/init.d/mysql restart
}
#echo 'Lamp start/stop/restart script'
# more info: http://www.debian-administration.org/articles/28
# Carry out specific functions when asked to by the system
case "$1" in
start)
echo "Starting lamp..."
startLamp
;;
stop)
echo "Stopping lamp..."
stopLamp
;;
restart)
echo "Restarting lamp..."
restartLamp
;;
*)
echo "Usage: lamp.sh {start|stop|restart}"
exit 1
;;
esac
echo 'Done'
exit 0
piątek, 7 listopada 2008
sobota, 1 listopada 2008
Jak pozbyć sie reklam na ugu.pl
Wygląda na to, że ugu coraz bardziej podnosi poprzeczkę
Ale trzeba być twardym :)
Najpierw przeanalizujmy gdzie wstawiane są reklamy:
Pierwsza zaraz po sekcji :
<body><noscript>noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
a druga przed </body>
<script type="text/javascript">
var pageTracker = ...
pageTracker._trackPageview();
</script>
Najprostrzym rozwiązanie będzie po prostu wyrzucić sekcję <body>, a kod strony wstawiać między
<html
<head>
</head>
zawartosc strony
</html>
W prawdzie tracimy zgodność, ze standardami W3C,
ale większość przeglądarek wyświetli naszą stronę poprawnie.
Niestety ugu posunęło sie dalej i jeśli nie znajdzie w kodzie HTMLa napisu
<body>to wstawi na poczatku strony kod:
<html><body><!-- --><noscript></noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
można to łatwo ukryć w CSSie:
body
{
...
margin-top: -100px;
position: relative;
...
}
i reklama jest niewidoczna:)
Powodzenia
Mam nadzieje, że "specjaliści" z ugu znowu czegoś nie wymyślą:)
Ale trzeba być twardym :)
Najpierw przeanalizujmy gdzie wstawiane są reklamy:
Pierwsza zaraz po sekcji :
<body><noscript>noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
a druga przed </body>
<script type="text/javascript">
var pageTracker = ...
pageTracker._trackPageview();
</script>
Najprostrzym rozwiązanie będzie po prostu wyrzucić sekcję <body>, a kod strony wstawiać między
<html
<head>
</head>
zawartosc strony
</html>
W prawdzie tracimy zgodność, ze standardami W3C,
ale większość przeglądarek wyświetli naszą stronę poprawnie.
Niestety ugu posunęło sie dalej i jeśli nie znajdzie w kodzie HTMLa napisu
<body>to wstawi na poczatku strony kod:
<html><body><!-- --><noscript></noscript>
<div>
<script type="text/javascript" src="http://img.ugu.pl/advert.js">
</script>
</div>
można to łatwo ukryć w CSSie:
body
{
...
margin-top: -100px;
position: relative;
...
}
i reklama jest niewidoczna:)
Powodzenia
Mam nadzieje, że "specjaliści" z ugu znowu czegoś nie wymyślą:)
niedziela, 26 października 2008
Bot gadu-gadu z wykorzystaniem EKG i Python'a
Opiszę jak w prosty sposób napisać własnego bot'a gg.
Wymagana jest podstawowa znajomość języka Python i środowiska Linux.
Użytkownicy [x/k]Ubuntu mogą pobrać EKG z repozytorium wpisując:
sudo apt-get install ekg
warto też zainstalowa najnowszą wersje Pythona
sudo apt-get install python
pozstali muszą skompilować ze źródeł.
A teraz do dzieła:
odpalamy ekg: #ekg
wpisujemy
set uin 'numer gg'
set password 'hasło'
save
teraz czas zacząc pisać bota:
przechodzimy do katalogu ~/.gg/
tworzymy katalog scripts (#mkdir scripts)
i tu tworzymy plik najlepiej z rozszerzeniem .py
jeśli chcemy by nasz skrypcik odpalał sie zaraz po uruchomieniu EKG w katalogu scripts tworzymy kolejny katalog: autorun i tu wrzycamy nasz plik.
stuktura programu:
# importujemy bibliotekę ekg
import ekg
#ta funkcja wywołuje się przy starcie skryptu
def init():
ekg.printf("generic","Bot loaded");
#ustawiamy opis
ekg.command("_descr \"Opis\"");
return 1
#ta funkcja wywołuje się przy zamykaniu skrypu
def deinit():
ekg.printf("genetic","Bot unloaded");
logfile.close()
#przechwytywanie zdarzeń:
def handle_msg(uin, name, msgclass, text, time, secure):
uin - numer gg od którego przyszła wiadomość
text - treść wiadomości
time - czas nadejscia
pozostałe parametry są raczej mniej istotne.
Zabawa polega na tym, aby przechwycić text i odpowiednio na niego odpowiedzieć.
Jak narazie napisałem prosty kalkulator.

Ale zamierzam napisać coś znacznie ciekawszego:)
I jeszcze wywołanie skryptu: w konsolce ekg:
python (un)load nazwa_skryptu.py
Wymagana jest podstawowa znajomość języka Python i środowiska Linux.
Użytkownicy [x/k]Ubuntu mogą pobrać EKG z repozytorium wpisując:
sudo apt-get install ekg
warto też zainstalowa najnowszą wersje Pythona
sudo apt-get install python
pozstali muszą skompilować ze źródeł.
A teraz do dzieła:
odpalamy ekg: #ekg
wpisujemy
set uin 'numer gg'
set password 'hasło'
save
teraz czas zacząc pisać bota:
przechodzimy do katalogu ~/.gg/
tworzymy katalog scripts (#mkdir scripts)
i tu tworzymy plik najlepiej z rozszerzeniem .py
jeśli chcemy by nasz skrypcik odpalał sie zaraz po uruchomieniu EKG w katalogu scripts tworzymy kolejny katalog: autorun i tu wrzycamy nasz plik.
stuktura programu:
# importujemy bibliotekę ekg
import ekg
#ta funkcja wywołuje się przy starcie skryptu
def init():
ekg.printf("generic","Bot loaded");
#ustawiamy opis
ekg.command("_descr \"Opis\"");
return 1
#ta funkcja wywołuje się przy zamykaniu skrypu
def deinit():
ekg.printf("genetic","Bot unloaded");
logfile.close()
#przechwytywanie zdarzeń:
def handle_msg(uin, name, msgclass, text, time, secure):
uin - numer gg od którego przyszła wiadomość
text - treść wiadomości
time - czas nadejscia
pozostałe parametry są raczej mniej istotne.
Zabawa polega na tym, aby przechwycić text i odpowiednio na niego odpowiedzieć.
Jak narazie napisałem prosty kalkulator.

Ale zamierzam napisać coś znacznie ciekawszego:)
I jeszcze wywołanie skryptu: w konsolce ekg:
python (un)load nazwa_skryptu.py
środa, 13 sierpnia 2008
Funkcja do sprawdzania poprawnosci kodu pocztowego* w JavaScripcie
function validatePostalCode(inputCode){
alert('kod pocztowy ma niepoprawny format \n (poprawny: xx-xxx)');
}
*dotyczy polskich kodów pocztowych
var correct = /^[\-]{0,1}[0-9]{2}-[0-9]{3}$/;
if(!correct .test(inputCode)alert('kod pocztowy ma niepoprawny format \n (poprawny: xx-xxx)');
}
*dotyczy polskich kodów pocztowych
czwartek, 24 lipca 2008
Python, biblioteka urllib(2) i dodatkowe aspekty bezpieczeństwa aplikacji webowych
urllib (2) jest biblioteką Pythona do pobierania plików poprzez adres url,
dodatkowo umożliwia manipulację całego zapytania, pozwala na tworzenie własnego nagłówka zapytania cz manipulację ciasteczek, a nawet wysyłanie POST content'u.
Przyjrzyjmy sie prostej funkcji:
zobacz
zmienne user_agent i user_agent2 zawierają zmienną naszego agenta czyli tak jak zazwyczaj przedstawia się przeglądarka internetowa.
Za zmienną user_agent możemy podstawić dowolnego stringa w tym taki xml'owe (html'owe) a nawet kod dowolnego języka najlepiej skryptowego.
Jeżeli nieuważny webmaster posiada na swoim serwerze system do przeglądania statystyk, który wyświetla wszystkie informacje o użytkownikach, którzy przeglądali strony może nieświadomie uruchomić JavaScript, który podrzucimy mu w zmiennej user_agent. Oczywiście ten alert() w przykładzie jest bardzo subtelny, równie dobrze można by tam dorzucić jakiś XSS.
kolejna zmienna zawiera ciasteczka w naszym przypadku PHPSESSID.
Różna może być reakcja skryptu na serwerze w przypadku, gdy zmienna sesji posiada niedozwolone znaki. Polecam to sprawdzić.
funkcja save_it(url, filename, proxy, port) zapisuje zawartość strony zawartej pod adresem url do pliku filename, a jeśli zmienna proxy jest różna od None to połączenie odbywa się przez serwer proxy na podanym porcie.
Na koniec dorzucam jeszcze skrypt do wysyłania POST contentu:
zobacz
dodatkowo umożliwia manipulację całego zapytania, pozwala na tworzenie własnego nagłówka zapytania cz manipulację ciasteczek, a nawet wysyłanie POST content'u.
Przyjrzyjmy sie prostej funkcji:
zobacz
zmienne user_agent i user_agent2 zawierają zmienną naszego agenta czyli tak jak zazwyczaj przedstawia się przeglądarka internetowa.
Za zmienną user_agent możemy podstawić dowolnego stringa w tym taki xml'owe (html'owe) a nawet kod dowolnego języka najlepiej skryptowego.
Jeżeli nieuważny webmaster posiada na swoim serwerze system do przeglądania statystyk, który wyświetla wszystkie informacje o użytkownikach, którzy przeglądali strony może nieświadomie uruchomić JavaScript, który podrzucimy mu w zmiennej user_agent. Oczywiście ten alert() w przykładzie jest bardzo subtelny, równie dobrze można by tam dorzucić jakiś XSS.
kolejna zmienna zawiera ciasteczka w naszym przypadku PHPSESSID.
Różna może być reakcja skryptu na serwerze w przypadku, gdy zmienna sesji posiada niedozwolone znaki. Polecam to sprawdzić.
funkcja save_it(url, filename, proxy, port) zapisuje zawartość strony zawartej pod adresem url do pliku filename, a jeśli zmienna proxy jest różna od None to połączenie odbywa się przez serwer proxy na podanym porcie.
Na koniec dorzucam jeszcze skrypt do wysyłania POST contentu:
zobacz
piątek, 27 czerwca 2008
Instalacja sterownika do karty WiFi Realtek RTL8187B pod (K) Ubuntu
Cała instalacja jest znacznie prostrza niż mogłoby się wydawać na pierwszy rzut oka i zajmuje mniej niż 2 minuty.
Początkowo mój błąd polegał na tym, że próbowałem instalować oryginalne sterowniki pod Windows XP przy użyciu ndiswrapper'a. Niestety bezskutecznie.
Gdy w ręce wpadł mi zmodyfikowany sterownik,problem praktycznie rozwiązał się sam. Właściwie cały sposób instalacji opisany jest w pliku ReadMe.txt
Żeby się do niego dostać: rozpakowujemy paczkę tar.gz np. Ark'em lub z konsoli:
$ mkdir /tmp/wifidriver/
$ chmod 755 /tmp/wifidriver/
$ tar xzvf rtl8187b-modified-jadams-2-1-2008.tar.gz /tmp/wifidriver/
przechodzimy do kalalogu:
$cd /tmp/wifidriver/
i odpalamy skrypt makedrv i uprawnieniami root'a, czyli:
$ sudo ./makedrv
a nastęnie:
$ sudo ./wlan0up
gdyby nie działało to najpierw:
$ sudo ./wlan0down
$ sudo ./wlan0up
Autor tego opracownia proponuje wykorzystanie narzędzia iwlist
Ja ułatwiłem sobie nieco zadanie dzięki (K)WiFiManager:
$ sudo apt-get install (k)wifimanager
literkę k dodajemy aby ściągnąć wersje dla KDE.
oraz (K)NetworkManager do konfiguracji IP w przypadku gdy Access Point nie przydziela go z DHCP'a.
I jeszcze dowód na to, że wszystko działa :)
Miłego korzystanie z sieci bezprzewodowej...
Początkowo mój błąd polegał na tym, że próbowałem instalować oryginalne sterowniki pod Windows XP przy użyciu ndiswrapper'a. Niestety bezskutecznie.
Gdy w ręce wpadł mi zmodyfikowany sterownik,problem praktycznie rozwiązał się sam. Właściwie cały sposób instalacji opisany jest w pliku ReadMe.txt
Żeby się do niego dostać: rozpakowujemy paczkę tar.gz np. Ark'em lub z konsoli:
$ mkdir /tmp/wifidriver/
$ chmod 755 /tmp/wifidriver/
$ tar xzvf rtl8187b-modified-jadams-2-1-2008.tar.gz /tmp/wifidriver/
przechodzimy do kalalogu:
$cd /tmp/wifidriver/
i odpalamy skrypt makedrv i uprawnieniami root'a, czyli:
$ sudo ./makedrv
a nastęnie:
$ sudo ./wlan0up
gdyby nie działało to najpierw:
$ sudo ./wlan0down
$ sudo ./wlan0up
Autor tego opracownia proponuje wykorzystanie narzędzia iwlist
Ja ułatwiłem sobie nieco zadanie dzięki (K)WiFiManager:
$ sudo apt-get install (k)wifimanager
literkę k dodajemy aby ściągnąć wersje dla KDE.
oraz (K)NetworkManager do konfiguracji IP w przypadku gdy Access Point nie przydziela go z DHCP'a.
I jeszcze dowód na to, że wszystko działa :)

sobota, 23 lutego 2008
Bezpieczeństwo skryptów z punktu widzenia programisty
Pisanie własnego kodu daje dużo satysfakcji, jednakże wiąże sie z pewnym ryzykiem, że ktoś znajdzie lukę w naszym kodzie i umiejętnie ją wykorzysta do kradzieży lub manipulacji danych, przejęcia konta, itp. Bardzo ważnym elementem przy pisaniu aplikacji jest walidacja wpisywanych/pobieranych danych. W pierwszym przypadku (wpisywanie danych) zazwyczaj oczekujemy określonego typu danych np. wartości liczbowej czy tekstu pozbawionego tagów html ( warto przemyśleć zastosowanie funkcji: string htmlspecialchars ( string $string [, int $quote_style [, string $charset [, bool $double_encode ]]] ) ), również w prosty sposób możemy sprawdzić czy wprowadzona wartość jest liczbą, przydatna możne być funkcja: bool is_numeric ( mixed $var ) oraz podobne( is_float(), is_int() ). Stosowanie takich zabezpieczeń minimalizuje ryzyko ataków typu XSS czy CSRF. Warto jeszcze dodać, że walidację formularzy powinno wykonywać sie dwukrotnie - za pierwszym razem po stronie klienta oraz za drugim razem na serwerze na wypadek gdyby podstępny użytkownik "majstrował" przy formularzu.
Kolejnym bardzo ważnym aspektem zabezpieczania skryptów jest ścieżka dostępu do pliku( zasobu). Szczególnie jest to poważny problem w przypadku tworzenia skryptu do przeglądania zawartości katalogu, należy bardzo uważać na odwołania typu: ../, ../../ itd. Oto przykład nie w pełni zabezpieczonego skryptu: Thepeak File Upload v1.3 . Można w prosty sposób wydobyć dowolny plik na serwerze( trzeba tylko oczywiście znać pełną ścieżkę dostępu do tego pliku).
Dobrym rozwiązaniem jest tutaj funkcja: string basename ( string $path [, string $suffix ] ).
W przypadku skryptów uploadujących pliki na serwer należy pamiętać o sprawdzeniu typów wgrywanych plików, dla przykładu nie powinno sie zezwalać na pliki typu: "application/x-httpd-php", "application/octet-stream" lub podobnych, ze względu na to, że mogą zostać wykonane na serwerze.
Wstrzykiwanie( injection) zainfekowanego kodu to temat bardzo rozległy i szczególnie niebezpieczny w przypadku tzw. SqlInjection. Po ataku na stronę Szkoły Hakerów, mamy nawet możliwość zrobienia tego legalnie: hackme.pdf. Ponieważ każde odwołanie sie do bazy sql wymaga napisania osobnego kodu, czasami bardzo łatwo popełnić błąd w postaci luki w systemie bezpieczeństwa, dotyczy do przede wszystkim początkujących programistów, ale jak widać na przykładzie Szkoły Hakerów, nie tylko. Szczególnie, że na stronie szkoły znalazłem również miejsce podatne na ataki XSS.
Należy również unikać wykonywania kodu podawanego w postaci jawnego tekstu(sringa), mam tu na myśli funkcję: mixed eval ( string $code_str ).
Na koniec uwaga dotycząca składowania danych: ważne dane(loginy, hasła, itp.) na serwerze powinno być przechowywane w bezpieczny sposób, w miejscach do których przeciętny użytkownik nie ma dostępu, najlepiej w postaci shaszowanej(md5, itp.).
Kolejnym bardzo ważnym aspektem zabezpieczania skryptów jest ścieżka dostępu do pliku( zasobu). Szczególnie jest to poważny problem w przypadku tworzenia skryptu do przeglądania zawartości katalogu, należy bardzo uważać na odwołania typu: ../, ../../ itd. Oto przykład nie w pełni zabezpieczonego skryptu: Thepeak File Upload v1.3 . Można w prosty sposób wydobyć dowolny plik na serwerze( trzeba tylko oczywiście znać pełną ścieżkę dostępu do tego pliku).
Dobrym rozwiązaniem jest tutaj funkcja: string basename ( string $path [, string $suffix ] ).
W przypadku skryptów uploadujących pliki na serwer należy pamiętać o sprawdzeniu typów wgrywanych plików, dla przykładu nie powinno sie zezwalać na pliki typu: "application/x-httpd-php", "application/octet-stream" lub podobnych, ze względu na to, że mogą zostać wykonane na serwerze.
Wstrzykiwanie( injection) zainfekowanego kodu to temat bardzo rozległy i szczególnie niebezpieczny w przypadku tzw. SqlInjection. Po ataku na stronę Szkoły Hakerów, mamy nawet możliwość zrobienia tego legalnie: hackme.pdf. Ponieważ każde odwołanie sie do bazy sql wymaga napisania osobnego kodu, czasami bardzo łatwo popełnić błąd w postaci luki w systemie bezpieczeństwa, dotyczy do przede wszystkim początkujących programistów, ale jak widać na przykładzie Szkoły Hakerów, nie tylko. Szczególnie, że na stronie szkoły znalazłem również miejsce podatne na ataki XSS.
Należy również unikać wykonywania kodu podawanego w postaci jawnego tekstu(sringa), mam tu na myśli funkcję: mixed eval ( string $code_str ).
Na koniec uwaga dotycząca składowania danych: ważne dane(loginy, hasła, itp.) na serwerze powinno być przechowywane w bezpieczny sposób, w miejscach do których przeciętny użytkownik nie ma dostępu, najlepiej w postaci shaszowanej(md5, itp.).
piątek, 8 lutego 2008
Łamanie haseł - algorytmy brute force
Techniki brute force są najskuteczniejsze nie ze względu na wymyślne algorytmy, ale ze względu na prostotę działania. Schemat sprowadza się zawsze do tej samej metody którą można opisać dokładnie jednym zdaniem: "znajdź rozwiązanie sprawdzając kolejne możliwości(kombinacje)". Oczywiście algorytm można przerwać w momencie znalezienia rozwiązania, no chyba, że oczekujemy więcej poprawnych rozwiązań.
Może warto odwołać sie do jakiegoś przykładu. Niech to będzie łamanie hasła zaszyfrowanego archiwum RAR. Załóżmy, że mamy do dyspozycji program unrar (unrar.exe w środowisku za którym nie przepadam :) ) dowolny kompilator języka C( cc, gcc), bash lub dowolny język skryptowy z którego można wywoływać polecenia zewnętrzne.
Schemat działania jest prosty:
1) Definiujemy tablice znaków char tablica_znaków[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2) Piszemy podprogram do generowania wszystkich możliwych wariacji z powtórzeniami ze znaków tablicy zadeklarowanej w punkcie (1), oczywiście wariacje muszą mieć długość od 1 do length(tablica_znaków[])
3) W pętli odpalamy unrara tj. unrar nazwa_archiwum.rar i-ta_kombinacja
Cóż, wydawać by sie mogło nic trudnego; jedyna rzecz która psuje całą zabawę to czas jaki zajmie sprawdzenie wszyskich możliwości.
Jeśli hasło ma 3 znaki( ilość możliwości = length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) * length(tablica_znaków[]) ) czas oczekiwania na odpowiedz jest w granicach naszych oczekiwań. W przypadku dłuższego hasła potrwa to o wiele, wiele dłużej (przyrost jest wykładniczy). Nawet wspomaganie sie dzieleniem zadań na wątki niewiele sie przyda w kontekście zysku czasowego.
Można oczywiści zawęzić alfabet, jeśli wiemy, że jakiś znaków na pewno nie zawiera hasło lub stosować dodatkowe algorytmy heurystyczne( np. zakładać że między spółgłoskami musi znajdować sie samogłoska) , ale wtedy istnieje prawdopodobieństwo, że nie znajdziemy hasła.
Mimo wszystko czasami warto próbować brute-for'ca, w końcu nie wszystkich chce sie wpisywać długie i wymyślnme hasła.... a nuż sie uda.
Może warto odwołać sie do jakiegoś przykładu. Niech to będzie łamanie hasła zaszyfrowanego archiwum RAR. Załóżmy, że mamy do dyspozycji program unrar (unrar.exe w środowisku za którym nie przepadam :) ) dowolny kompilator języka C( cc, gcc), bash lub dowolny język skryptowy z którego można wywoływać polecenia zewnętrzne.
Schemat działania jest prosty:
1) Definiujemy tablice znaków char tablica_znaków[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
2) Piszemy podprogram do generowania wszystkich możliwych wariacji z powtórzeniami ze znaków tablicy zadeklarowanej w punkcie (1), oczywiście wariacje muszą mieć długość od 1 do length(tablica_znaków[])
3) W pętli odpalamy unrara tj. unrar nazwa_archiwum.rar i-ta_kombinacja
Cóż, wydawać by sie mogło nic trudnego; jedyna rzecz która psuje całą zabawę to czas jaki zajmie sprawdzenie wszyskich możliwości.
Jeśli hasło ma 3 znaki( ilość możliwości = length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) + length(tablica_znaków[]) * length(tablica_znaków[]) * length(tablica_znaków[]) ) czas oczekiwania na odpowiedz jest w granicach naszych oczekiwań. W przypadku dłuższego hasła potrwa to o wiele, wiele dłużej (przyrost jest wykładniczy). Nawet wspomaganie sie dzieleniem zadań na wątki niewiele sie przyda w kontekście zysku czasowego.
Można oczywiści zawęzić alfabet, jeśli wiemy, że jakiś znaków na pewno nie zawiera hasło lub stosować dodatkowe algorytmy heurystyczne( np. zakładać że między spółgłoskami musi znajdować sie samogłoska) , ale wtedy istnieje prawdopodobieństwo, że nie znajdziemy hasła.
Mimo wszystko czasami warto próbować brute-for'ca, w końcu nie wszystkich chce sie wpisywać długie i wymyślnme hasła.... a nuż sie uda.
Subskrybuj:
Posty (Atom)