eCAPTCHA | CAPTCHA Oluşturucu [AR-GE]

Gbmdpof

Kıdemli Üye
23 Eyl 2016
2,001
11
[COLOR="White[B][COLOR="Red [URL="https://tik.lat/vyKCO"] out_en.wav[/URL]
out_tr.wav
out2_tr.wav
out3_tr.wav
yazılara tıklayınız.[/RIGHT]

Artık sesli CAPTCHA oluşturduğumuza göre şimdi de resim halinde CAPTCHA oluşturalım.

ImageCaptcha sınıfının constructor fonksiyonunun width, height, font ve font_size adlarında isteğe bağlı argümanları vardır. Bunlar varsayılan olarak, sırasıyla 200, 80, 'DroidSansMono.ttf' ve 50'dir. Ne yaptığınızı bilmiyorsanız bunları varsayılanda bırakmanızı öneririm.

Kod:
[font=monospace][color=#f8f8f2]img[/color] [color=#f92672]=[/color] [color=#f8f8f2]ImageCaptcha[/color][color=#f8f8f2]()[/color][color=#f8f8f2]
[/color][/font]

Bu ImageCaptcha sınıfının da generate fonksiyonunun argümanları AudioCaptcha gibidir. Tek fark, text argümanına burada harf de verebiliriz. Yine aynı şekilde bu fonksiyon da CAPTCHA metnini döndürür.

Kod:
[font=monospace][color=#f8f8f2]img[/color][color=#f92672].[/color][color=#f8f8f2]generate[/color][color=#f8f8f2]([/color][color=#e6db74]'out1.png'[/color][color=#f8f8f2])[/color][color=#f8f8f2]
[/color][color=#e6db74]'2QiQi'[/color][color=#f8f8f2]

[/color][color=#f8f8f2]img[/color][color=#f92672].[/color][color=#f8f8f2]generate[/color][color=#f8f8f2]([/color][color=#e6db74]'out2.png'[/color][color=#f8f8f2],[/color] [color=#f8f8f2]len[/color][color=#f92672]=[/color][color=#ae81ff]2[/color][color=#f8f8f2])[/color][color=#f8f8f2]
[/color][color=#e6db74]'sp'[/color][color=#f8f8f2]

[/color][color=#f8f8f2]img[/color][color=#f92672].[/color][color=#f8f8f2]generate[/color][color=#f8f8f2]([/color][color=#e6db74]'out3.png'[/color][color=#f8f8f2],[/color] [color=#f8f8f2]text[/color][color=#f92672]=[/color][color=#e6db74]'0THT0'[/color][color=#f8f8f2])[/color][color=#f8f8f2]
[/color][color=#e6db74]'0THT0'[/color][color=#f8f8f2]
[/color][/font]

Bu resimler:
out1.png
oVVk8o.png

out2.png
lZZWrl.png

out3.png
VDDMXq.png

şeklindedir.​

Bu resim CAPTHCA'ları gocr programı ile çözmeye çalıştığımızda ise gördüğünüz gibi çözemiyor:
Kod:
$ gocr out1.png
0_
_0__0_0__

$ gocr out2.png
__p

$ gocr out3.png
00000_0_o

[/COLOR][/B]
 
Son düzenleme:

r0ark

Üye
17 May 2018
67
0



Öncelikle neden "No CAPTCHA CAPTCHA" kategorisine giren reCAPTCHA gibi pek çok alternatif varken böyle bir şey yapma gereği duyduğunu sormam gerek. Açıkçası kullanıcılar CAPTCHA'lardan nefret ediyorlar, Google bunu bildiği için tamamen bu nedenle reCAPTCHA v3'yi çıkardı - sen ise hala yıllar önce yapılan CAPTCHA'larda kalmışsın. Buradan edinilebilecek tek sonuç yazdığın şeyi kimsenin kullanmayacak oluşu. Bunun farkında olduğunu umarak sadece kendini geliştirmek ve merakını gidermek amacıyla yazdığını varsayıyorum.

Verdiği çıktılara baktığımızda sesli çıktının herhangi bir STT API ile kolaylıkla aşılabileceğini görüyoruz. out_en.wav adlı dosya için Google Cloud Speech-to-Text API'ının verdiği sonuç:


b66BZd.png

Phone call


dBBOlV.png

Video

Görüldüğü üzere Google hesabı bile açmamıza gerek kalmadan direkt veriyi çıkartabildik. Elbette bunu herhangi bir STT API kullanmadan, kendimizin de yapabilmesi mümkün - sadece biraz zaman ve merak istiyor. İleride

Gbmdpof' Alıntı:
Sesli CAPTCHA'nın çözülmesini zorlaştımak için gürültü, bipleme gibi sesler eklenecek

demişsin. Bunu geçmemiz için tek gereken şey tonla sample ve zaman, hepsi bu kadar. Eğer kendin basit bir şeyler yapmak istersen de buradaki yazıyı okuyabilirsin - TensorFlow'un orijinal yazısının basitleştirilmiş versiyonu anladığım kadarıyla, orijinal yazı da şurada. Daha fazla ileri gitmek ve daha derin anlamak için DeepSpeech'in makalesini okuyabilirsin.

Resimli kısmı incelediğimizde basit OCR'ların işe yaramadığını görüyoruz. Ancak sesli versiyonda da olduğu gibi bunu aşmak için tek ihtiyacımız olan şey tonla sample ve zaman. İstediğin kadar harfleri yamuk çiz, farklı fontlar kullan yine de işe yaramaz. CV'ye ilk başladığım aylarda okuduğum bir kitap, basit temelleri pratik uygulamalar ile anlatıyor, tavsiye ederim.

Şu aşamada proje varoluş amacını, insanlar hariç herhangi bir şeyin geçemeyeceği test oluşturmayı, yerine getirmekten aciz durumda. Yine de devam edelim ve koda geçelim.

Proje dosya hiyerarşisi:
  • Her şeyden önce dikkatimi audio klasörü çekti, içerisinde farklı dillerde rakamların seslendirmeleri var. Özellikle de ileride daha fazla dil seçeneği geleceği için böyle bir yol kullanmak aptallık. Bunun yerine bir TTS API kullanabilirsin, dosyaları tek tek backend'te saklamaktan daha mantıklı.
  • İleride farklı fontların geleceğini düşünürsek font dosyalarının da kendilerine ait bir klasörü olsa fena olmaz açıkçası.

ecaptcha.py:
  • generate_text() ve generate_nums() fonksiyonları
    • ImageCaptcha sınıfının içerisinde olmalı, hem okuyucular hem de geliştiriciler için daha fazla rahatlık sağlar.
    • Sahip oldukları argüman adı built-in fonksiyon olan len() ile karışıyor. Gelecekte olabilecek çakışmaları önlemek amacıyla değiştirilmesi gerek.
    • İki fonksiyon da birer kere çağrılmakta, ayrı bir fonksiyon olmalarına gerek yok.
    • Fonksiyon isimleri çöp, daha esnek ve dinamik isimler seçilmeli.
    • ASCII karakterleri her CAPTCHA üretileceği zaman bir kütüphaneden çekip birleştirmek aptallık, hard-coded yazmak çok daha iyi bir seçim.
    • generate_text() ve generate_nums() fonksiyonunda random.choice() kullanmak ve her seferinde ASCII değerleri toplamak aptallık, random.sample() kullanılması daha iyi bir seçim:
      Kod:
      def text(length=5):
        return random.sample('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', length)
      
      def number(length=5):
        return random.sample('0123456789', length)
      Kod:
      >>> text()
      ['O', 'S', 'q', 'a', '1']
      >>> number()
      ['9', '5', '6', '1', '2']
  • is_int() büyük ihtimalle koddaki en aptalca yazılmış fonksiyon. Python'ın esnekliğini tamamen ihlal ediyor. Böyle saçma bir şey yapmak yerine isinstance() built-in fonksiyonu kullanılmalı:
    PY3.7 Docs.' Alıntı:
    Return true if the object argument is an instance of the classinfo argument, or of a (direct, indirect or virtual) subclass thereof. If object is not an object of the given type, the function always returns false. If classinfo is a tuple of type objects (or recursively, other such tuples), return true if object is an instance of any of the types. If classinfo is not a type or tuple of types and such tuples, a TypeError exception is raised. - Source
    Kod:
    >>> isinstance(2, int)
    True
    >>> isinstance('a', int)
    False
  • AudioCaptcha sınıfı
    • Neden ses dosyaları ile ilgili değişkenleri private yaptığını anlamış değilim açıkçası. Hiçbir sebep göremiyorum.
    • _LANGS değişkeni tanımlanmış ancak kullanılmamış, harika.
    • _EN_NUMBERS ve _TR_NUMBERS değişkenleri sadece tek bir yerde kullanılmış, değişken olmalarına gerek yok.
    • Private olarak tanımladığın değişkenler ve dirs, __init__'in içerisinde bulunmalı. Her nasılsa zaten kendi yazdığına karşı gelip self kullanarak erişmişsin.
    • __init__() fonksiyonunda okunabilirlik için "Ask forgiveness, not permission." ilkesi kullanılmalıydı:
      Kod:
      def __init__(self, lang='en'):
          try: nums_dir = self.dirs[lang]
          except: raise LanguageNotAvailable(f'Language {lang} not available!')
    • generate fonksiyonu
      • kwargs sadece kullanılmak için kullanılmış. Buradaki kullanımı yersiz ve gereksiz olmakla kalmıyor aynı zamanda okunabilirliği düşürüyor.
      • output'un varsayılan değeri CAPTCHA değerine eşit olsaydı end-user için işler daha kolay olabilirdi.
      • Wave formatındaki dosyaları birleştirmek için neyi nasıl ve neden kullandığını anlamam yarım saatimi aldı. Benim yazdığım daha basit, ancak test etmedim:
        Kod:
        with wave.open(output, 'wb') as out:
            for f in files:
                with wave.open(f, 'rb') as ff:
                    if not out.getnframes(): out.setparams(ff.getparams())
                    out.writeframes(ff.readframes(ff.getnframes()))

        Daha okunabilir hale getirilebilirdi elbette ama uğraşmak istemedim.
  • ImageCaptcha sınıfı
    • Renklerin RGB formatında hard-coded bir şekilde durması ve programın bu renkleri kullanması saldırganın işini çok kolaylaştırır. Bunun yerine RGB değerlerini random seçse daha mantıklı olurdu.
    • COLORS değişkeni __init__'in içerisinde olmalı yine, ancak tekrar kendi yazdığını çiğneyip self ile erişmişsin.
    • Neden width, height ve font'u private olarak belirlediğini de anlamadım.
    • generate fonksiyonu
      • kwargs sadece kullanılmak için kullanılmış. Buradaki kullanımı yersiz ve gereksiz olmakla kalmıyor aynı zamanda okunabilirliği düşürüyor.
      • Oluşturulan resmin arkaplan rengi de yine hard-coded olmak yerine rastgele bir değer seçilmeliydi.
      • Çizilen çizgilerin kalınlıkları ve sayıları rastgele seçilmeliydi.
  • Kodu anlamak bu yazıyı yazmaktan daha uzun sürdü, nedeni ise kodda yorum sayısının tam olarak 0 (sıfır) olması. Yorumu bırak docstring bile yok.
  • Kodda bahsettiğim yerler dışında kalan yerlerin neredeyse tamamında PEP8'e uyulmamış.
  • Değişken, fonksiyon ve sınıf isimleri çöp, hepsinin tek tek daha açıklayıcı ve basit bir şekilde, tekrar etmeden yazılması gerek.
  • OOP yapacağım diye projeyi öpmek iyi bir seçenek değil.

Kod da aşağı yukarı bu şekilde, çok fazla detaya girmedim. Python ile resim işlemleri konusunda az tecrübem olduğu için de fazla bir şey söyleyemedim o konuda.

Projeye genel olarak bakarsak çöp. Projenin varoluş amacı bile kendi başına topallıyor, kod zaten yerlerde... Yine de kişisel gelişim için güzel bir pratik olmuş, tebrik ederim. Umarım dediklerimi dikkate alıp uyarsın ileride, sonraki projelerini de zaman buldukça inceleyeceğim.


NOT: Bunu yazdığım zaman 9fca568 ve öncesi için yazmıştım - yine de söylediklerimin çoğu geçerli.


 

Cheat Console

Katılımcı Üye
1 Tem 2018
983
1
mesaj yazmyn
eline sağlık bende bunu arıyodum
keşke Otomatik capthca çözen resimleri otomatik dolduran bi capthca olsa
bana önerbileceğiniz bir şey varmı jdowlander varmış oda program indirken işini görüyor onun dışında yok sadece capthca çözüyor daha kapsamlı captcha çözücü lazım otomatik resimleri felan tanıyan varmı öle bi program oto capthca çözen
 
Son düzenleme:

Gbmdpof

Kıdemli Üye
23 Eyl 2016
2,001
11
eline sağlık bende bunu arıyodum
keşke Otomatik capthca çözen resimleri otomatik dolduran bi capthca olsa
bana önerbileceğiniz bir şey varmı jdowlander varmış oda program indirken işini görüyor onun dışında yok sadece capthca çözüyor daha kapsamlı captcha çözücü lazım otomatik resimleri felan tanıyan varmı öle bi program oto capthca çözen

Öncelikle reCAPTCHA dışındakilerden bahsedeyim. Genelde eğik yazılar, farklı fontlar, çizgiler, karmaşık arkaplanlar gibi yöntemler ile OCR programları ile çözülmesi engelleniyor. r0ark, mesajında bunu nasıl yapabileceğimizi açıklamış.

Resimli kısmı incelediğimizde basit OCR'ların işe yaramadığını görüyoruz. Ancak sesli versiyonda da olduğu gibi bunu aşmak için tek ihtiyacımız olan şey tonla sample ve zaman. İstediğin kadar harfleri yamuk çiz, farklı fontlar kullan yine de işe yaramaz.

Onun da dediği gibi, tonla sample ve zaman gerekiyor. Her CAPTCHA için bunu yapmak, ayrıca her güncellemede yeniden yapmak oldukça zahmetli. Ayrıca zaten birçok modern resimli CAPTCHA yazılımı, zorluk ayarlamasına izin veriliyor. Yani hem her CAPTCHA için ayrı ayarlama, bir de her zorluk seviyesi için ayrı ayarlama gerekli. Bu yüzden pek pratik olmaz.

reCAPTCHA ise zaten çok daha zor. Resim seçme ile yapılan kısmı geçmek zaten neredeyse imkansız botlar için (ki şahsen bazen kendim bile zorlanıyorum). Bu yüzden çözüm yolu olarak sesli CAPTCHA kısmından çözebiliriz. Bunun için nonoCAPTCHA adında bir yazılım var, fakat bunun da ne kadar zahmetli olduğunu incelemek için gerekliliklerine bakalım: Python 3.6.0 - 3.7.0, FFmpeg, a Microsoft Azure account for Bing Speech API access, an Amazon Web Services account for Transcribe and S3 access, and for Pocketsphinx you'll need pulseaudio, swig, libasound2-dev, and libpulse-dev under Ubuntu.

Yani sadece basit gözüken bir CAPTCHA çözme işlemi için birçok şey gerekli. Bunların bazıları ise zaten ücretsiz olmayan gereklilikler. Ayrıca bu, reCAPTCHA v2 için. Şu an reCAPTCHA v3'ün Beta'da olduğu düşünülürse yakın bir zamanda bunun da işlevsiz olacağını varsayabiliriz.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.