C#nedir?com
 
YAZAR HAKKINDA
Hüseyin Çelik
Hüseyin Çelik
http://www.csharpnedir.com/
İletişme geçmek için tıklayın.
1 Makalesi yayınlanmakta.
Yazar hakkında detaylı bilgi için tıklayın.
Yayınlanan diğer makaleleri için tıklayın.
İlgili etiketler: asirra bot program Captcha Captcha ceşitleri görüntü işleme Güvenlik histogram htmlElement karakterlerin sayısallaştırılması kittenauth OCR threshold webbrowser Genel Hüseyin Çelik
 
YAZI HAKKINDA
Türü : Makale
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
Seviyesi : Orta
Kategori : Genel
Yayınlanma Tarihi : 22.12.2010
Okunma Sayısı : 70621
Yorum Sayısı : 5     yorum yaz
Site İçi AramaSİTE İÇİ ARAMA
Üye Girişini AçÜye GİRİŞİ
Üye girişi için tıklayın.
Kullanıcı Adı
Şifre
 
Beni her zaman hatırla
Bir hafta boyunca kullanıcı bilgilerinizi kullanıcı çıkışı yapana kadar hatırlar. (Paylaşılan bilgisayarlarda önerilmez.)
 
Şifremi / Kullanıcı Adımı unuttum.
 
.net TV RSS Serbest KÖŞE (?)
Serbest Köşede C#nedir?com üyelerinin hazırladıkları yazılar yayınlanır. Bu yazılar editör incelemesine girmeden yayınlanır.
emre TAŞ
XML - Deniz Kılınç
emre TAŞ
yazının devamı >
emre TAŞ
Decompiling and Reverse Engineering .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Masaüstü mü ? İnternet Mi? .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
.Net Kavramları - .Net Radyo
emre TAŞ
yazının devamı >
emre TAŞ
Yeni Başlayanlar için - .Net Radyo
emre TAŞ
yazının devamı >
Makale Gönder Bende Yazmak İstiyorum
.net TV RSSBlogroll
Burak Selim Şenyurt
JWT(JSON Web Token) Kullanımı 18.12.2017
Burak Selim Şenyurt
Apache Kafka ile Konuşmaya Çalışmak 18.12.2017
Turhal Temizer 'in Blogu
ChatBot UI Sample 18.12.2017
Turhal Temizer 'in Blogu
C# – IRR Function 18.12.2017
  Diğer Herşey
Sponsorlar
BT Akademi
Medya Portakal
Video Hosting Sponsoru
Csharpnedir.com bir Ineta üyesidir
Uzman Abi
Her Yönüyle C# - Sefer Algan
Captcha ve Captcha'nın OCR ile analizi
 
Kapat
Sayfayı Yazdır Sık Kullanılanlara Ekle Arkadaşıma Gönder MySpace Del.Ico.Us Digg Facebook Google Mixx Reddit StumbleUpon

Bu makalede; Captcha, Captcha güvenliği, Captchayı otomatik olarak çözen bot program ve Karakter tanıma teknikleri hakkında bilgi verilerek Captchanın önem verilmediği takdirde nasıl büyük hasarlara sebep olduğu anlatılmaktadır. Captcha sisteme girenin bot program mı yoksa insan mı olduğunu karar veren bir kontrol sistemidir. Eğer Captcha kontrolü kullanılmaz ise kurumların( e-okul, yüksek seçim kurumu, Türk telekom ve benzeri kurumların) veri tabanları tehlikeye girer.

Captcha Nedir?

Captcha Completely Automated Public Turing test to tell Computers and Humans Apart kelimelerinin kısaltmasıdır. Web tabanlı uygulamalarında uygulamayı çalıştıranın bir insan mı yoksa bir bot mu olduğunu tespit etmek için kullanılan bir güvenlik uygulamasıdır. Bundan dolayı her Captcha testinin çözülmesi yapay zekâ adına atılmış önemli bir adımdır.

Captcha Mantığı

Sistemin çalışması kısaca şöyledir. Sunucu rastgele bir resim oluşturur, istemci tarafındaki kişiden bu resimdeki yazıyı okuyup, ilgili alana girmesi istenir. Buradaki basit mantık o resimde sadece insan tarafından okunabilecek, bir program tarafından okunması zor olan bir kelime oluşturmaktır. OCR (optik karakter okuyucu) programları, düzgün bir formda yazılmış yazıyı bir resmin içinden okuyabilirler. Bu sebeple sunucu tarafından üretilen resmin içindeki yazının bir insan tarafından okunabilecek fakat OCR programları tarafından okunamayacak kadar zor, karışık, anlaşılmaz, gürültülü ve bozulmuş olması gerekir. Gerçekten de üretilen karakterlerin bazen okunamaması veya çok gelişmiş OCR programları tarafından bazen resimlerin okunabiliyor olması gibi zayıflıklarına rağmen, DYPM (Did You Pass Math, “3 artı sekiz kaç eder?” gibi sorular yönelterek otomatik yazılımları engelleyen.) veya resimler arasından duygusal bazı kriterlerle seçim yapılmasını isteyen v.b. gibi alternatif yöntemlerden şu an için daha kullanışlı olmaya devam etmektedir.
 
Captcha oluşturma adımları
. Bitmap nesnesi oluşturulur
. Bu bitmap nesnesinin Font, Stil vs gibi özelikleri setlenir.
. Bir random nesnesi oluşturulup bu random nesnesinin aralık değerlerini oluşturulur.
. Random değişkeni oluşturulur.
. Bu random string’i session’a eklenir karşılaştırma için, böylece kullanıcının doğru
giriş yapıp yapmadığını öğrenmiş oluruz.
. En sonunda isteğe göre gürültü eklenir ve istenilirse karakter belli bir acı ile
döndürülür OCR yazılımlarına önlem olarak. 
 
Captcha Çeşitleri


Mat Captcha :"10 + 15' in sonucu nedir gir buraya " ya da "yirmi bölü on kaç eder" gibi kontrollere dayanıyor.Tabii ki gene de klasik botların hepsini engelleyecektir ancak siteye özel botlar bunu basitçe geçebilir.
Asirra :Microsoft Research ekibi Asirra adında Captcha benzeri bir sistem yapmış. Klasik Captcha sistemlerinin aksine mantık üzerine kurulmuş sistemde kullanıcı açılan resimlerden kedi resimlerini seçiliyor. Resimleri petfinder.com'dan alan sistem her yükleyişte farklı resimler yüklüyor böylece sistemi bir resim veritabanı oluşturarak kırma yöntemini imkansız hale getiriyor. Yalnız bu yöntemde de kedi tanıma bot programı yapmak mümkün.
KittenAuth :KittenAuth Captcha’nın yetersiz kaldığı yerde devreye giriyor. Captcha ya karşı yapılan yazılımlar artık resimleri okuyabiliyor ve buna karşın Captcha resimleri zorlaştırıyor yamultuyor silikleştiriyor ve harfleri birbirine geçiriyor işe bu noktada aslında sadece bilgisayarın okumasını engellemiyor kullanıcıcında okumasını engelliyor böylece captcha’nın amacından sapma oluyor. Bazı resimler o kadar zor ve anlaşılmaz bir hale geliyor ki kullanıcı okumakta zorluk çekiyor. İşte bu noktada KittenAuth sistemi devreye giriyor. KittenAuth da Captcha nın aksine kullanıcıya resimde görünen yazı veya harfleri yazdırmıyor. Birkaç tane resim çıkarttırıp içlerinden doğru resmin tıklanmasını istiyor.
 

Captcha Kırılması


Captcha'yı kırmada önemli olan şey mesajda ne yazdığını okumak değildir, bunu insanların en az yüzde sekseni zaten yapabilir. Asıl zor ve önemli olan insanların bu işlemi nasıl yaptığını bilgisayara öğretmektir. Captcha'yı kırmaya niyetlenen programcı, bu problemi fazlar şeklinde değerlendirmelidir. Ona uygun  algoritma tasarlamalıdır. Bu senaryoya göre, ilk adım resmi siyah beyaz tonlara çevirmek olabilir. Yani uygulama, resimdeki tüm renkleri ortadan kaldırmalı. Böylece Captcha'nın koyduğu engellerden biri olan renklerden kurtulmuş olunur. Sonra, algoritmanın diğer adımı bilgisayara ortaya çıkan şekildeki dokuları tespit etmesini emretmek olacaktır. Yani program her harfi gerçek harflerle bir-bir kıyaslayıp her harfin en çok hangi harfe benzediğini bulmak olacaktır.Bu resimler php, asp, cgi, perl gibi programlama dilleri ile dinamik oluşturuluyor ve içinde bulunan metin, oturum verileri (session data) ile yine kullanıcıya özgü olmak kaydı ile sunucuda tutuluyor. Düzgün yapılandırılmış bir sunucudan bu resimleri oluşturan kodları veya oturum bilgilerini alamayacağınız düşünülürse geriye sadece resim işleme (image processing-yapay zeka teknikleri) yöntemleri kalıyor. İşte bu resim işleme metotlarını da engelleyebilmek için resimlerin arka planlarında yazıların okunmasını zorlaştıracak, renk dağılımları ya da karakter olmayan simgeler bulunur. Resim işleme kodu eğer bu yanıltıcı simgeleri de temizleyebilecek şekilde geliştirilmişse ki bu durum yapay sinir ağları konusuna girer, yani ancak bir yapay zeka deneme yanılma (ya da öğrenme) metodu ile bunları ayıklar, bu sistem bu metodu aşabilir.


Captcha Ve Yapay Sinir Ağları


Carnegie Mellon Ünversitesi'nden Luis Von Ahn, Captcha'nın mucitlerinden biridir. 2006'daki bir dersinde von Ahn, Captcha ve yapay zeka arasındaki ilişki hakkında konuşmuştur. Çünkü CAPTCHA, hackerlar (spamciler) ve onların hedefleri arasındaki bariyerdir. Bu insanların Captcha 'ları kırmak için atanmış belirli bir zaman ve enerjileri vardır. Onların başarısı makinaları daha sofistike hale getirecektir. Birisi bir Captcha'yı daha kırmayı başardığı zaman yapay zeka yolunda önemli bir adım daha atılmış olacaktır.
Hacker’lar CAPTCHA'ların üstesinden gelecek yeni yollar buldukça, von Ahn gibi Bilgisayar Bilimciler daha çok yapay zeka isteyen yani Captcha türleri icat etmek zorunda kalacaklar. Captcha 'da geriye doğru atılan bir adım, yapay zeka alanında ileriye doğru atılmış bir adım demektir. Her yenilgi bir zaferdir!. Captcha tasarımcıları da epey yol katetmeleri gerekecek. Bilgisayarlar daha sofistike hale geldikçe test metodları da o kadar gelişecektir. Ancak bir süre sonra o kadar karmaşık resimler üretilecektir ki bunları insanlar bile çözemeyeceklerdir. İşte bu anda bu sistem tamamen çökecektir. Metinleri eğip bükmek artık bir işe yaramayacaktır. Artık kullanıcılardan matematik işlemleri çözmeleri(integral gibi) veya kısa bir hikâye okuyup soruları cevaplamaları beklenecektir. Bunun gibi zor ve sıkıcı testlere yöneldikçe kullanıcıların da web sitelerine olan ilgisi azalacaktır. Kim bir mesaj göndermek için ikinci dereceden bir turev-integral sorusunu çözmek istesin ki? En sonunda öyle bir noktaya gelinecek ki insanlar ve makinalar herhangi bir bulmacayı aynı yoldan çözmeyi deneyeceklerdir. Eğer bu gerçekleşirse, Captcha kodları gereksiz kod yığınlarından başka bir şey olmayacaklar. O zaman gelinceye kadar Captcha 'ları kullanmaya bakalım.


Karakter Tanıma Ve Görüntü işleme


Şimdi de actığımız web sitesindeki captchayı bitmap olarak aldıktan sonra sıra geldi bunu göruntu işleme teknikleri cözmeye.ilk adımımız bu bitmap ‘i sayısal bir resme dönuşturmek.


Sayısal Resim 
 
Sayısal resim bir matrise benzetilebilir. Resmin en küçük elemanına piksel adı verilir. Resimi M x N boyutunda matris olarak düşünürsek her bir pikselin değeri bir dizinin koordinatlarının i ve j' inci terimi olarak ifade edilebilir. En basit durumda pikseller 0 veya 1 değerini alırlar. Bu piksellerden oluşan resimlere binary (ikili) resim denir. Monokrom, yani tek renkli resimlerde ise her eleman 0 ile 255 arasında değerler alır. Böylece her pikselin parlaklık değerinin farklı olması ile gri tonda bir resim elde edilir. En parlak nokta 255 beyaz, en karanlık nokta 0 siyah bunların arasındakiler ise R,G ve B değerlerine bağlı olarak gri renk değerlerini alırlar. Sayısal resim elde edildikten sonra bunu renkliden griye cevirmemiz lazım.


Renkli' den Gri' ye 


Renkli sayısal bir resmi gri seviye resme çevirebilmek için RGB renk modelinde belirtilen gri-seviye renk değerlerinin orijinal resimdeki piksellerin her bir renk kanalındaki sahip oldukları renk değerlerinin yerine, resmin özelliklerini değiştirmeden konulması ile elde edilmektedir. Hatırlanacağı üzere RGB küpündeki beyaz-siyah köşegeninde ki tüm değerler gri-seviye deki renk kodlandır. Bu ise RGB renk kanallarının hepsinin ortak bir değer ile doldurulmasından elde edilir. Resim griye cevrildikten sonra bunu Threshold kullanarak binary’e ceviririz.

 
Threshold


Göruntu işlemede karşılığı resmin belirli bir değerden daha küçük değere sahip pixellerin siyaha, daha büyük değere sahip pixellerin beyaza boyanmasıdır. Captcha resimlerini  alırken threshold değeri genel de 128 alınır. Böylece resim dizisini sıfır ve birlerden oluşmuş siyah-beyaz bir diziye dönüşür. 
 

Gri Seviye'den Binary'e


Gri seviye bir resim, her bir piksel için 0 ile 255 arasında bir parlaklık değeri alır. Ve gri tonda görüntü işte bu farklı parlaklık değerlerine göre oluşur. Bir resim griden binary'e çevrilirken [0..255] aralığının orta değeri olan 128 kıstas(eşik değeri olarak olarak) alınır ve parlaklık değeri 128'den küçük olan pikseller 0' a; parlaklık değeri 128 den büyük olanlar 255'e çekilmek suretiyle resimde sadece siyah ve beyaz renklerinin kalması sağlanır. Bu şekilde yalnızca 0 ve 255 ya da 2 lik sisteme göre 0 ve 1 değerlerini taşıyan resme binary resim adı verilir.


Histogram Çıkarma


Histogram, belli bir veri kümesindeki elemanların frekanslarıdır. Genellikle çubuk grafikler şeklinde çizilir ve değerlendirilirler. Histogram, çizimi yapılırken şu yöntem izlenir. Resim gri olarak tanımlandıktan sonra intensty (RGB değerlerinin ortalamasıdır) değeri hesaplanır. Her intensty değeri için bir kutu ayrılır ve sayma işlemine geçilir. Resim taranırken alınan gri değere ait kutunun değeri bir arttırılır. Tarama bittiğinde elimizde 0-255 veri aralığında değerler ve bu değerleri tutan bir histogram dizisi bulunur. Kutu değerleri bize veri kümesi elemanlarının frekanslarını verir. Frekanslar grafikte gösterilerek Histogram çizilmiş olur. Karakterleri ayrıştırmak için genel de düşey Histogram alınır.Düşey histogram alınırken Her sütundaki siyah piksellerin sayısı bir diziye atılır. Bu dizideki değerlerden sıfıra sahip olanlar için, ilgili sütunda hiç siyah piksel yok anlamı çıkar. İlk siyaha rastlanan değer bize ilk satırın başlangıç koordinantlarını verir. Bundan sonra ilk siyah içermeyen sütun karakterin bitiş oordinantlarını verir böylece karakterler ayrıştırılmış olur. Daha sonra bu değerlerden yararlanarak histogramlar cıkartılır.
 

Karakterlerin Ayrıştırılması


Burada amaç her bir karakteri çerçeveleyen dikdörtgenin sol üst köşe koordinatlarının ve çerçevenin yükseklik ve genişliğinin bulunmasıdır. Bunun için dikey histogramdan yararlanır ve her karakterin başlangıç ve bitiş koordinatları bir dizide tutulur. Bu dizideki elemanlarda kendi içinde kontrol edilerek mümkün olabilecek iki “x-koordinat” değeri(bu iki değer arasındaki fark çerçevenin genişliğini belirler.) elde edilir. İkinci x değerinden sonraki kısımdan varsa yeni ikişerli x değerleri elde edilir. Böylece genişlik elde edilmiş olur. Yüksekliği bulmak için bu sefer aynısı y değerleri için de yapılır.


Karakterlerin Sayısallaştırılması


Artık elimizde başlangıç ve bitiş noktaları ile beraber karakter çerçevesinin yükseklik ve genişlik gibi bilgileri olan diziden çerçeve adedince Bitmap dizisi oluşturulur. Bitmap’lerin kullanılabilmesi için sayısallaştırılması icap ediyor. Karakterlerin sayısallaştırılma işlemi tanıma işleminde kullanılacak. Bu süreçte girdi görüntü binary bilgiye örneklenir. 
 

 Genişletmek


Sayısal bir resmi genişletmek demek resmi yapısal elemanla kesiştiği bölümler kadar büyütmek demektir. Bunu yapabilmek için yapısal eleman resim üzerinde piksel piksel dolaştırılır. Eğer yapısal elemanın orjini resim üzerinde "0" değerli bir piksel ile karşılaşırsa herhangi bir değişiklik meydana gelmez. Eğer değeri "1" olan bir piksel ile karşılaşırsa yapısal elemanla yapısal elemanın altında kalan pikseller mantıksal "or" işlemine tabi tutulurlar. Yani herhangi "1" değeriyle sonuç "1" e çevrilir. Genişletme (dilation) ile resim üzerindeki objeler şişer. 
 
Aşındırmak


Aşındırma işlemi bir bakıma genişletmenin tersi gibi görülebilir. Burada yine aynı şekilde yapısal eleman resim üzerinde piksel piksel dolaştırılır fakat bu defa yapısal elemanın merkez pikseli "1" değeri ile karşılaşırsa yapısal eleman içerisindeki piksellerin durumuna bakılır. Eğer yapısal eleman içerisindeki "1" olan piksellerden herhangi biri altında resme ait "0" değeri varsa yapısal elemanın diğer "1" lerinin altındakilerle beraber bu piksel "0" a dönüştürülür. Aşındırma (erozyon, erosion) işlemi ile sayısal resim aşındırılmış olur. Yani resim içerisindeki nesneler ufalır, delik varsa genişler, bağlı nesneler ayrılma eğilimi gösterir.
 

Filtreler

Tanıma algoritmalarını kullanmadan önce görüntüdeki gürültüleri temizlemek istiyorsanız mean, median ve gaussian filtereleri ile bu işlemi yapabilirsiniz.Filtrelerin mantığı şöyledir.Sıfır ve birlerden oluşmuş ikili dizinin i. ve j. Değeri 8 komşuluğun değerine göre değişir.Örneğin Mean filtreleme de bir matrisin değeri eğer 8 komşusu 1 ise bir aksi halde sıfırdır.


Karakterin Tanınması


Karakter çeşitli görüntü işleme tekniklerinden sonra histogramla ayrılıp belli bir threshold değerine göre binary diziye çevrilir. Sonra bu binary dizinin elemanları ile veritabanında ki tüm karakterlerin değerleri ile karşılaştırılır ve benzerlik oranı bir diziye konulur. Giriş dizisinin değeri veritabanındaki değerlerden en çok hangisine benzer ise giriş dizisi o karaktere setlenir. Yani benzerlik dizisinin en büyük elemanına setlenir. 
 
Karakter Ve Binary Halinin Veri Tabanına Eklenmesi


Karakterler veri tabanında ikili karşılıkları ile yer alırlar. Kullanıcı istersen çeşitli resim işleme ve tanımadan sonra elde edilen ikili diziyi veri tabanına ekleyebilir ve bunu istediği bir karaktere değer olarak atayabilir.
 

Veritabanın Eğitilmesi 

 Veritabanının eğitilmesinin amaçı fontu ve stili farklı karakterleri de tanımaktır.Cunku veritabanın da eğitim boyunca aynı karakter verilirse bu karakterlerin ortak yönleri güçlendirilmiş olur.1 ve 0’lı diziden oluşmuş karakter bir daha eğitilirse eğer matirslerin i,j değerleri Aynı ise veritabanındaki matrisin i,j değeri bir artırılır(o i,j değeri vurgulanmış olur).


WebBrowser


Webbrowseri bir web uygulaması içerisinde otomatik olarak gezerek gerekli HTML kontrolleribulmakve bu kontroller üzerinde işlemler yapmak için kullanırız.webBrowser1.Navigate(“http://www.birsite.com.tr”);dediğimiz de uygulamamız birsite.com.tr yi bize uzerinde işlem yapmak icin acacaktır.Daha sonra captcha’nın oldugu kısımın print screen’nini almak lazım.Aşağıdaki kod ile koordinantları verdiğimiz bir yerin pixellerini alır ve istediğimiz yere kaydeteriz.
 

Size Boyut = new Size(1024, 768);
Bitmap Resim = new Bitmap(1024, 768);
System.Drawing.Graphics grafik = System.Drawing.Graphics.FromImage(Resim);
grafik.CopyFromScreen(new Point(0, 0), new Point(0, 0), Boyut);
Resim.Save("C:\\Test.bmp")
 

Captcha’yı resim olarak ekrandan aldıktan sonra bunu resim işleme ile cözup uzerindeki karakterleri bulduktan sonra geriye bu cözduğumuz karakterleri ilgili textbox’a set etmek kaldı.Bunu da HTML Element class’ı ile yapabiliriz.
 

HtmlElement h2 = webBrowser1.Document.GetElementById("txt_captcha"); h2.SetAttribute("value", “göruntu işleme ile elde ettiğimiz captcha değeri”).

Böylece göruntu işleme ve yapay sinir ağları ile cözdugumuz captcha’yı ilgili alana set etmiş olduk.geriye şimdi ilgili butona tıklamak kaldı bunu da şöyle yaparız Cursor objesini kullanarak, fare imlecini ekranda gönder turu buttonların oldugu yere göturup tıklattırabiliriz.
 
 Aşağıdaki kod ile, fare imlecini bir resim uzerinde 10 pixel yukarı çıkartabilirsiniz.

Cursor.Position = new Point(Cursor.Position.X - 10, Cursor.Position.Y).

Fare tuşlarını simule etmek için ise user32.dlldeki bazı fonksiyonları kullanmanız gerekiyor.
 

[DllImport("user32.dll", CharSet = CharSet.Auto,EntryPoint = "mouse_event")]
private static extern void Tikla(int flag, int a, int b, int c, int d);

 

Tıkla fonksiyonunun flag parametresini 0x06 ya setlediğimiz zaman mouse’ın bulunduğu konuma sol tıklar.

 

Makale:
Captcha ve Captcha'nın OCR ile analizi Genel Hüseyin Çelik
  • Yazılan Yorumlar
  • Yorum Yaz
OCA
3
2012
hocam makalelerin devamını bekliyoruz...
AĞU
3
2011
çok detaylı ve anlaşılır bir makale çok beğendim makalelerinizin devamını bekliyoruz.
MAY
7
2011
Böyle sacma makale mi yazılır.Dunku cocuklar makale yazarsa csharpnedir seviyesi duşer. sayın yazar eğer captcha kırdığını idda ediyorsan kodunu da paylaşırsın ozaman inanırım böyle laf ile bu işler yurumez. bana laf anlatma kırıyorsan kırma kodunu da paylaş.bu adresi kır ozaman özur dilerim http://www.google.com/recaptcha
MAR
29
2011
hocam elinize sağlık güzel makale...
OCA
23
2011
ben bilgisayarcı olduğumda bnları bilmek zorundamıyım nerde öğrenicem ben bunları...
Sayfalar : 1 
Yorum yazabilmek için üye girişi yapmalısınız. Üye girişi için tıklayın.
Üye değilseniz Üyel Ol linkine tıklayarak üyeliğinizi hemen başlatabilirisniz.
 
  • Bu Konuda Son 10
  • Eklenen Son 10
  • Bu Konuda Geçmiş 10
Bu Konuda Yazılmış Yazılmış 10 Makale Yükleniyor
Son Eklenen 10 Makale Yükleniyor
Bu Konuda Yazılmış Geçmiş Makaleler Yükleniyor