Break the captcha!!!

Selamat sore teman-teman. Bertemu lagi kita di dalam sesi tulis-menulis blog. ๐Ÿ˜€

Okay, dalam sesi kali ini, saya akan sedikit berbagi lagi tentang apa yang sudah saya pelajari, saya tulis, dan saya lakukan. Pada tulisan kali ini saya akan membahas suatu hal yang berhubungan dengan CAPTCHA. Teman-teman pasti tahu apa itu. CAPTCHA adalah suatu challenge response , yang mana inti dari fungsi tersebut adalah untuk mengetahui, apakah yang sedang mengunjungi sebuah sistem itu berupa manusia ataupun robot. Mengapa harus demikian? Jawabannya adalah karena di dunia ini terdapat para spammer yang entah itu jahil ataupun mencari keuntungan dari spam dan robot yang mereka buat. Dan dari data yang didapat, konten spam di dunia maya ini berjumlah sangat besar. Maka dari itu digunakanlah CAPTCHA ini untuk menghindari adanya penumpukan sampah.

CAPTCHA sendiri terbagi dalam beberapa tipe,yaitu (oia, untuk penjelasan tiap tipenya, mungkin saya jelaskan dengan cara yang sederhana, bukan dengan suatu hal yang resmi :p):

  1. Hard Recognized Text : tulisan-tulisan tidak jelas yang sering kita temui pada saat kita ingin mendownload ataupun meng-accept suatu hal.
  2. Pattern Matching : jadi kita disuruh untuk melakukan sesuatu yang berhubungan dalam menghubungkan hal A dan hal B. (ada yang bingung?)
  3. Sound Recognition : jadi pake suara gitu deh.

Nah, untuk kesempatan kali ini saya ingin membahas CAPTCHA tipe pertama (yang paling sering kita temui). Dalam kasus kali ini kita memakai CAPTCHA dari ziddu. Yang pasti untuk pemrosesannya kita menggunakan tesseract, dan dalam pemecahannya, digunakan bahasa pemrograman python, dengan menggunakan module PIL dan pytesser.

Untuk step-stepnya,pertama kita ambil dulu CAPTCHA-nya ya.

Setelah itu kita buka gambarnya danย  mencoba untuk membuat itu menjadi kontras dan black and white agar CAPTCHA lebih mudah untuk diproses.

image = Image.open(gambar)
image = image.convert('L')
image.save('kapca2.jpg')

test = Image.open('kapca2.jpg')
img = ImageEnhance.Contrast(test)
img.enhance(1.9).save("kapca3.jpg")

setelah kita buat CAPTCHA lebih kontras dan black and white, kita convert gambar itu menjadi bentuk RGBA (Red Green Blue Alpha), agar pixel datanya dapat kita ketahui. Jadi kita bisa mengetahui warna apa saja yang harus dihilangkan agar menjadi sebuah bentuk yang lebih bisa dibaca oleh program.

img = Image.open('kapca3.jpg')
img = img.convert('RGBA')

setelah diconvert, kita hilangkan semua warna yang tidak diperlukan dengan mengubah warna-warna yang tidak perlu menjadi putih dan kita save menjadi sebuah bentuk yang baru.

pixdata = img.load()
for y in xrange(img.size[1]):
for x in xrange(img.size[0]):
if pixdata[x, y] >= (15 , 15, 15, 255):
pixdata[x, y] = (255, 255, 255, 255)

img.save("kapca3.gif","GIF")

setelah menjadi bentuk kapca3.gif, kita resize gambar menjadi ke skala yang pas untuk diproses, dan juga kita ubah ekstensinya ke tif.

im = Image.open('kapca3.gif')
big = im.resize((200,86), Image.NEAREST)
big.save("kapca3" + ".tif")

setelah beberapa proses tadi, gambar akhir akan menjadi seperti ini.

setelah itu kita gunakan fungsi image_to_string untuk memproses gambar akhir menjadi sebuah string.

image = Image.open('kapca3.tif')
print "kapca = ",image_to_string(image)

lalu kita coba.

$ python decode.py capcay.jpg
Tesseract Open Source OCR Engine
kapca =ย ย  2fds2

yaph..we broke it! ๐Ÿ˜€

Setelah membaca proses-proses itu tadi, saya harap teman-teman bisa menganalisisnya dan merangkumnya menjadi sebuah program. Maaf sebelumnya karena saya tidak menuliskan source codenya secara lengkap, karena saya mengharapkan sebuah pembelajaran bagi kita semua, bukan cuma kopi paste. Dicukupkan saja sesi kali ini, Trims ๐Ÿ˜€

NB: Karena masih beta dan masih dalam tahap percobaan, jadi mungkin masih ngebug dan keakurasiannya hanya beberapa persen saja. Yang dijelaskan di sini hanya sekedar konsep dan sedikit implementasinya.

Reference :

– http://ezine.echo.or.id/ezine22/e22-009.txt

– http://www.carbonwind.net/blog/post/Fun-with-weak-CAPTCHAs.aspx

You may also like

Leave a Reply

Your email address will not be published. Required fields are marked *