luq techblog

o tworzeniu słów kilka…

Orange captcha 6 marca 2009

Filed under: PHP,Programowanie,Security,Web — Łukasz @ 16:07
Tags: , ,

Już jakiś czas temu napisałem w PHP klasę do obsługi bramki SMS sieci orange. Jedynym mankamentem jest ta nieszczęsna captcha, przez co proces wysyłania SMSów nie jest w pełni automatyczny. Moim celem jest jednak napisanie klasy, która z automatu będzie wysyłać wiadomości do użytkowników np. gdy dostanie nową wiadomość or sth.

 

Na samym początku szukałem bramki, która umożliwiałaby wysyłanie SMSów do orange bez konieczności wpisywania kodu z obrazka. Nawet udało mi się to zadania, stronkę wrzuciłem do zakładek, niestety pech chciał, że niedługo potem wszystkie zakładki utraciłem :( Szczerze to nie wiem na jakiej zasadzie działała ta bramka. Czy miało właśnie coś w stylu „rozwiązywacza” captchy czy może obchodziła ten kod. Chodź te drugie rozwiązanie raczej mało prawdopodobne. Przymierzałem się także do napisania skryptu korzystającego właśnie z tej bramki pośredniej, ale nie udało mi się dojść do tego w jaki sposób ona działa, a raczej dlaczego to co ja napisałem nie działa. Prawdopodobnie nie przekazywałem jakiejś zmiennej POSTem czy coś. No i po utraceniu zakładek pomysł z użyciem tej bramki runął, na rzecz napisania własnej klasy łamiącej captche.

 

Zadanie jak dla mnie bardzo trudne i szczerze powiem nie wiem czy podołam no ale warto próbować ;) Na pewno człowiek się czegoś nauczy :)

 

Na sam początek zająłem się oczywiście zbieraniem materiałów na temat łamania captchy. Bardzo przydatnym znaleziskiem okazał się wykład JaBoJa z wyklady.net na temat „Używanie i łamanie CAPTCHA i filtrów antyspamowych” – link (kilkadziesiąt ostatnich wypowiedzi). Dzięki temu dowiedziałem się w jaki sposób wyizolowywuje się (dziwne słowo) poszczególne literki z obrazka.

 

Następnie przyszła pora na analizę obrazków używanych przez orange. Według mojej oceny captcha orange jest średnia jeśli chodzi o trudność jej łamania (dałbym 4-5/10) a to przez to, że w obrazkach używane są różne czcionki.

Najtrudniejsze do złamania wg. mnie (w końcu nie jestem ekspertem z tej dziedziny) są captche przedstawione na obrazkach 5 i 7 Pierwsza z nich z racji tego, że litery są dość wąskie, natomiast druga przez to, że czcionka jest stylizowana, chodzi mi tu o cień i tą obwódkę wokół każdej litery. Przez to w obu wypadkach po zastosowaniu kilku koniecznych operacji graficznych litery stają się bardzo niewyraźne lub po prostu nie wiele z nich zostanie. Przykłady pokaże troszkę dalej.

 

Kolejnym, tym razem mniejszym już mankamentem jest różna pozycja captchy na obrazku. Jak widać powyżej, obrazki używane przez orange składają się z części stałej tj. loga i napisu w dolnej części oraz „captchy właściwej” że tak powiem. Ta oto captcha właściwa, która zawiera kod, przyjmuje różna pozycję na obrazku głównym. Właściwie nawet nie jest konieczne wycięcie jej z obrazka (wystarczy że zastosujemy właściwy próg podczas pogowania obrazka) natomiast na pewno poprawi to wydajność skryptu (podczas operacji graficznym operujemy na mniejszym obrazku). Wystarczy znaleźć lewy górny róg captchy właściwej i przekopiować ja do nowo utworzonego obrazka. Szerokość i wysokość jest zawszę taka sama a więc wystarczy ją tylko zmierzyć, tym samym większego problemu nie ma.

 

W praktyce wystarczy, zaczynając od pixela 1,1 (nie 0,0 bo w tym miejscu jest ramka) sprawdzać kolor pixela, czy jest on inny od tła, jeśli jest to mamy lewy góry róg captchy właściwej. A więc podążając ku stronie prawej do powiedzmy połowy obrazka (tak aby nie były sprawdzane pixele należące do loga) a także przez kolejne wiersze sprawdzamy składowe RGB czy mieszczą się w zakresie kolorów które tworzą tło (musimy sprawdzać zakres gdyż obrazek tak naprawdę nie ma jednolitego tła, aby się przekonać wystarczy powiększyć go). Oczywiście algorytm można ulepszyć zawężając zakres porównych pixeli.

 

Właściwie cały algorytm łamania captchy wykorzystanej w bramce orange (a właściwie każdej captchy) można przedstawić jako:

  • Pobranie obrazka
  • Wycięcie captchy właściwej
  • Wyizolowanie liter dzięki filtrom graficznym, np. jak pisze JaBoJa:
    • Progowanie (Threshold)
    • Odszumianie
    • Rozmycie (Blur)
    • Progowanie
    • Odszumianie
  • Rozpoznanie poszczególnych liter

Najtrudniejszym w tym wszystkim jest rozpoznanie liter, jak na razie do tego momentu nie doszedłem a więc o tym kiedyś indziej. Co do pierwszego punktu to nie ma o czym mówić, drugi natomiast już omówiłem, a więc przejdźmy do trzeciego.

 

Aktualnie w moim skrypcie, captcha jest poddawana kolejno takim filtrom:

  • Progowanie (próg 128)
  • Odszumianie (za szum uznaje się pixel, który ma <= 2 sąsiadów tego kolory co sprawdzany pixel)
  • Odszumianie (za szum uznaje się pixel, który ma <= 1 sąsiadów tego kolory co sprawdzany pixel)

Oczywiście będę testował jeszcze z innymi ustawieniami. Koniecznie jednak będę musiał dodać rozmycie i po nim oczywiście progowanie a więc będzie to wyglądało tak jak w zamyśle JaBoJa. Chodź w aktualnej wersji wygląda to już zadowalająco.

 

Orginał:

Wycięcie:

Progowanie:

Odszumianie 1:

Odszumianie 2:

Tak jak już pisałem najgorzej jest z kodem zapisanym wąską czcionką. Wynik przekształceń powoduje usunięcie dużej ilości obrazka.

 

Myślę jednak, że można sprawdzić czy ilość czarnych pixeli w stosunku do białych nie jest zbyta mała (< 20%?), jeśli jest to pobierz inny obrazek captchy i ponów wszystko od początku.

 

Kolejną kłopotliwa czcionka, o której pisałem wyżej, daje rezultat:

 

W tym przypadku zapewne rozmycie poprawi efekt, chodź raczej „U” z cieniem w środku po tych wszystkich akcjach nie będzie wyglądało jak „U”. Tak więc pomyśle nad systemem oznaczania trudności captchy rozpoznawanej po używanej w niej czcionce.

 

Kodu jak na razie nie będzie, ze względu na jeszcze wiele zmian, które mam zamiar do niego wprowadzić. To na razie tyle na ten temat, pewnie później opisze coś więcej na ten temat ;)

 

4 Responses to “Orange captcha”

  1. ponulaczek Says:

    Bardzo ciekawe. Szczerze mówiąc nie bawiłem się łamaniem captchy. Wszyscy myślą, że captcha dla komputera jest nie do złamania ale się mylą. Skoro człowiek może odczytać co tam pisze to maszyna też. Roboty jakie się robi przecież teraz myślące.. Wszystko się da napisać tylko trzeba wysilić szare komórki, zastanowić się, w jaki sposób „ja” bym odczytywał te kody. Fakt że trochę inteligencji potrzeba i potrzeba trochę obserwacji ale nie jest to niemożliwe. Co do skryptów SMS to się bawiłem z tym chyba rok temu. Zrobiłem w javascript funkcję, która wysyłała SMS-y do plusa łącząc się ze stroną http://www.text.plusgsm.pl/sms/sendsms.php. Podpatrzyłem w źródle strony dane, które trzeba wysłać i adres skryptu. Mój skrypt tworzył niewidoczny formularz i ramkę do której potem był ‚submitowany’. Muszę przyznać że nawet to działało, ale nie zawsze. Na tej stronie jest limit, że z danego adresu IP można na dany numer wysłać określoną ilość SMS-ów w jakimś tam czasie. Dlatego też zrezygnowałem bo to trochę było kombinowania. Jeszcze te formularze trzeba było zastosować do document.body bo się nie chciało wysyłać, poza tym nie w każdej przeglądarce to działało. Aby napisać własną bramkę trzeba najpierw wybrać najlepszego „pośrednika”.

  2. luq Says:

    Oczywiście, że captche są i będą łamane, ostatnio nawet udało się złamać głosową captche z gmaila :> (chyba to był gmail).

    Co do wysyłania SMS to jest to dziecinnie proste, wystarczą użyć cURL`a albo sokety – jak w moim przypadku i tyle. Oczywiście, każdy operator nakłada na bramki limity, bo by mu się to nie opłacało. W orange z bramki można wysłać 10 SMS/24h do jednego numeru, więc na potrzeby np. poinformowania admina o dziennych statystykach strony wystarczy w zupełności.

    PS: Dzięki za pierwszy komentarz ;>

  3. FireRaIn Says:

    Hej!

    Właśnie trochę badam temat i trafiłem tutaj. Wczoraj napisałem sobie webowego mailbox’a w PHP z autoresponderem, a dzisiaj pomyślałem, że dodam powiadamiania SMS (mimo, że mam w Orange).
    Tak jak Ty, poszukiwania zacząłem od bramki bez captchy (szkoda, że zgubiłeś link) i skończyłem na OCRowaniu.
    Bardzo ciekawy temat i jak tylko uporam się z innymi projektami, to na pewno go zgłębię.
    Nie wiem, czy widziałeś stronę: http://ocr-research.org.ua/

  4. luq Says:

    Hi,

    no linku szkoda aczkolwiek jakbym go nie zgubił pewnie nie zainteresował bym się tym, w sumie, bardzo fajnym tematem ;) Chętnie bym się tym pobawił ale niestety brak czasu na razie mi to uniemożliwia.

    Dzięki za link, nie widziałem tej stronki wcześniej.


Dodaj komentarz