1. Anasayfa
  2. ASP.Net

Geliştirdiğiniz Yazılımlarda Captcha Decoding Nasıl Yapılır?


0

Bir sisteme otomatik giriş yapacak olan bir yazılım hazırlıyorsunuz fakat sisteme giriş yapabilmek için sistem güvenlik açısından karşınıza CAPTCHA resmi çıkarıyor, bu durumda sisteme otomatik olarak giriş yapabilmek mümkün değildir. Peki, Captcha’yı nasıl çözeriz? Yani geliştirdiğimiz yazılım Captcha içerisindeki resmi nasıl anlar? Bu durumu çözebilmek için kullanabileceğimiz bir kaç kütüphane bulunuyor. Bunlardan bazıları, Microsoft Office Document Imaging (MODI), Aforge, Scott Clayton Captcha Breaker.


Resim-1

Fakat aşağıdaki gibi bir resmi MODI’ye verirseniz size cevap veremeyecektir.


Resim-2

Bunun nedeni ise MODI sizden neredeyse çok temiz bir resim istemektedir. Çok temizden kastım şu ki örnekteki resimde gördüğünüz üzere yazının rengi ile arka olanda kullanılan noktaların rengi aynı tonlarda. Öncelikle bu noktaları kaldırmamız gerekecek ve bu noktaları kaldırırken tabi ki yazıdan olabildiğince az götürmemiz gerekecek.

Resimdeki desenleri kaldırabilmek için uyguladığımız algoritma temelde Image Processing işlemlerinde kullanılan bir algoritmadır. Resmin 0,0 koordinatından başlayarak, 3×3 boyutunda pixeller alıyoruz. Daha sonra bu pixellerin renk değerlerinin ortalamasını alıyoruz ve eğer bu bulduğumuz ortalama belirli bir değerin üzerinde ise o bölgeyi transparan yapıyoruz. Eğer istediğimiz değerden düşük ise kendi orijinal değerlerini bırakıyoruz. Böylelikle kullandığımız 3×3 maskeyinin boyutunu ve ortalama değeri değiştirerek istediğimiz seviyeye gelene kadar bu işlemleri tekrarlayabiliriz. Bu algoritmanın kodları aşağıdaki gibidir.

private
void Maskeleme(Image image, string filename, int size, int ortalama)

{

 

 


using (var bmp = new
Bitmap(image))

{


var yenibmp = new
Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppRgb);

 


for (int y = 0; y < bmp.Height; y++)

{


var baslangicy = y;


var bitisy = y + size;


if (bmp.Height < bitisy)

{

bitisy = bmp.Height;

}


for (int x = 0; x < bmp.Width; x++)

{

 


var baslangicx = x;


var bitisx = x + size;


if (bmp.Width < bitisx)

{

bitisx = bmp.Width;

}

 


var kucukbmp = bmp.Clone(new
Rectangle(baslangicx, baslangicy, bitisx – baslangicx, bitisy – baslangicy), System.Drawing.Imaging.PixelFormat.Format32bppRgb);


int ortalamaKucuk = 0, toplamRenk = 0;

 


for (int i = 0; i < kucukbmp.Width; i++)

{


for (int j = 0; j < kucukbmp.Height; j++)

{

toplamRenk += (kucukbmp.GetPixel(i, j).R + kucukbmp.GetPixel(i, j).G + kucukbmp.GetPixel(i, j).B) / 3;

 

}

}

 

ortalamaKucuk = toplamRenk / (kucukbmp.Height * kucukbmp.Width);

 


if (ortalamaKucuk > ortalama)

{


for (int i = 0; i < kucukbmp.Width; i++)

{


for (int j = 0; j < kucukbmp.Height; j++)

{

yenibmp.SetPixel(baslangicx + i, baslangicy + j, Color.White);

}

}

}


else

{


for (int i = 0; i < kucukbmp.Width; i++)

{


for (int j = 0; j < kucukbmp.Height; j++)

{

yenibmp.SetPixel(baslangicx + i, baslangicy + j, kucukbmp.GetPixel(i, j));

}

}

}

 

x += (size – 1);


if (bitisx == bmp.Width)

{


break;

}

}

 

y += (size – 1);

 


if (bitisy == bmp.Height)

{


break;

}

 

}

 

yenibmp.Save(Application.StartupPath + “\\” + filename);

 

 

}

 

}

Bu methodu çağırdıktan sonra yukarıdaki resim aşağıdaki hale gelecektir.


Resim-3

Resimde de görüldüğü üzere oldukça başarılı bir şekilde etraftaki desenleri yok edip yazıdan minimum düzeyde götürmüş.

Artık bu resmi MODI için hazırladıktan sonra gelelim resmi çözümleme işlemine. MODI’yi kullanabilmek için Office kurulum sihirbazı aracılığı ile Microsoft Office Document Imaging Feature’ı bilgisayarına kurmanız gerekmektedir. Gelelim MODI ile resmi nasıl okuruz? Aşağıdaki kodları kullanarak bu işlemi yapabiliriz.

MODI.Document modiDocument = new MODI.Document();


public
string Kir(string CaptchaFilePath)

{


try

{


string returnString = “”;

modiDocument.Create(CaptchaFilePath);

modiDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);


foreach (MODI.Image insImage in modiDocument.Images)

{

MODI.Layout insLayout = insImage.Layout;

returnString = insLayout.Text;

}

 

modiDocument.Close(false);

 

returnString = Regex.Replace(returnString, “[^0-9a-zA-Z]+”, “”);


return returnString;

 

}


catch

{


return
“”;

}

}

Evet değerli MsHowto okurları, Aforge kütüphanesini kullanabilmek için .Net 2.0 ile projemizi derlememiz gerekiyor. Dolayısıyla ondan şuan uzak durmaya çalışıyorum. Fakat bu günlerde Scott.Clayton.CAPTCHA.CAPTCHABreaker kütüphanesi üzerinde çalışıyorum. Eğer başarırsam MODI’nin çözümleme olasılığından çok daha yüksek olasılıkla sonuç veriyor. Fakat kullanımı MODI kadar basit değil. Bizden resmi çözümleyebilmesi için MAP istemekte. Başarılı bir şekilde sonuç alır almaz bununla ilgili hemen bir makale ile sizinle paylaşacağım.

Umarım faydalı olmuştur. Bir sonraki makalemizde buluşmak dileğiyle.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

Bu İçeriğe Tepkin Ne Oldu?
  • 0
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

İzmir Atatürk Anadolu Teknik Lisesi, Dokuz Eylül Üniversitesi Bilgisayar Teknolojisi ve Programlama Bölümü mezunuyum. Şuan Dokuz Eylül Üniversitesi Bilgisayar Mühendisliği Bölümünde son sınıftayım. Yazılım ile 2004 yılında tanıştım ve yaklaşık olarak 4-5 yıldır piyasaya freelance olarak proje geliştiriyorum. Ek olarak MCP unvanına sahibim.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir