“Hiç uğraşamam…”

twitter.com/brsyuksel

Bir Sonraki Yazıdan Önce: Matryoshka

Sınıf Özellikleri ve Yeni Stil Sınıflar başlıklı yazımda “Bir sonraki yazıda __metaclass__ konusuna değineceğim” demiştim, yalan söyledim.

Son zamanlar o kitap senin bu kitap benim okumaktan sıkıldığım için biraz ara verip farklı birşeylerle uğraşmak istedim. Her zamanki gibi bir anlık esintiyle, adı (matryoshka = matruşka) amacına yakışır bu steganografi uygulaması çıktı ortaya. Çocukluğumdan beri saman altından su yürütmeye bayıldığım için bu uygulamayı geliştirirken çok fena eğleneceğim gibi duruyor.

Steganografi’den kısaca bahsetmek gerekirse, iletilmesi istenen mesajın masumca görünen bir içerik ile örtülerek ulaştırılmasıdır. “Bilgiyi saklama sanatı” olarak anılması çok hoşuma gidiyor. M.Ö. 5. yy’da Pers saldırısından önce uyarı mesajının bir kölenin saçları kazıtıldıktan sonra kafasına dövme olarak işlenip saçları uzadığında mesajın istenilen yere dikkat çekmeden ulaştırılmasıyla ilk defa kullanılan steganografi, günümüzde kolbastı adı altında ortaya konulan figürlerle yüzeysel bir bakışta dans ettiği sanılan kişinin aslında çok gıdıklandığı mesajını vermek istemesiyle karşımıza çıkar.

Bilgisayar dünyasında steganografinin kullanımına dönecek olursak, asıl amaç istenilen veriyi başka bir veri ( örtü veri ) altında gizlemek. Ancak bu işlemi yaparken insan algısının fark edemeyeceği boyutta yapmaya dikkat ettiğiniz gibi steganaliz uygulamalarını da hesaba katmanız gerekiyor. Matryoshka, bu örnek sürümünde asıl amacını yerine getirse de veriyi saklarken her karakterin bitlerini sırasıyla piksellerin mavi tonuna ait en düşük anlamlı bitlerini değiştirirek yaptığından dolayı resime bakıp steganografi yapıldığını anlamanız mümkün olmasa da bir hex editörle açıp kağıt kalem üzerinde hesap yaparak saklanan mesajı bulmanız çok kolay. Fakat bu söylediğim gibi “örnek” sürüme özgü bir durum olacak.

24-Bit Windows BMP dosyaları üzerinde bu işlemin nasıl yaptığından kısaca bahsedeyim. 24-Bit Windows BMP dosyalarında ilk 54 byte’lık veri başlık (header) bilgilerini taşıyor. İlk 2 byte 4D42 değerini taşıyor, “BM”, BMP dosya türüne ait imza. Dikkat ettiyseniz tersten sıralanmış. Bunun sebebi işlemci mimarisiymiş, “byte order, litte endian, big endian” anahtar kelimelerini kullanarak amacınıza ulaşabilirsiniz. Bu 54 byte’lık başlık bilgisinin 0x1C. offsetten ( yani ilk 28 byte’ı atlayın ) başlayarak 2 byte’lık veri resmin renk kanalı bilgisini taşıyor, 24-Bit’lik bir BMP dosyasında ‘\x18\x00\’ değeriyle karşılacaksınız. Dediğim gibi işlemci “little endian” sistemi kullandığından dolayı bu değeri hesaplamak istediğinizde 0×0018 şeklinde hesaplayacaksınız. Bunun için de bitsel operatörlerden yararlanmak gerekiyor. Son olarak 0×02. offsetten itibaren 4 byte’lık veri dosya boyutu bilgisini, 0x0A. offsetten itibaren 4 byte’lık bilgi ise pixellere ait 3′er byte’lık verilerin kaçıncı offsetten (0×36, 54) başladığı bilgisini taşıyor. 0×36. offsetten itibaren her piksel için 3′er byte’lık veri bulacaksınız, Kırmızı-Yeşil-Mavi (RGB) tonları için değerler bu şekilde barındırılıyor ancak bu da tahminim ters sıralanmış ( incelemedim bunu ). Sonrasında herhangi bir renk tonunun, en düşük anlamlı bite ( yani son bit, bu tersten değil :) ) ait değeri saklanacak verinize ait bitlerle değiştirerek saklayabilirsiniz. Bu arada ilk 3 byte’lık değeri değiştirerek sol üst köşedeki pikseli bozduğunuzu sanıyorsanız yanılıyorsunuz, sol alt köşedeki pikseli bozmuş olacaksınız ( herşey tersten, tersten! ).

Matryoshka’ya geçelim artık. Matryoshka’nın ilk etapta algoritması değişecek. Alakalı bitleri birbirinden ayrı olacak şekilde pikselleri belirli bir periyotta bozarak saklamaya çalışacağım. Bunun için aklımda bir kaç yöntem var. Sonrasında edindiğim/ediğineceğim python özellikleri ve tasarım desenleri bilgisini Matryoshka üzerinde uygulayacağım, böylece geliştirilmesi kolay olacak. Ardına tahmin edebileceğiniz bir çok dosya türünün desteklenmesi sağlanacak. Veri sıkıştırma, veri şifreleme, GUI derken üstüne çalışılacak çok nokta var. Dediğim gibi Matryoshka beni gerçekten heyecanlandıran bir proje. Bu yüzden üzerine fazlaca düşeceğim.

iContacts’ı geliştirme sözlerim hepsi yalandı, onu ileride C’de kodlayıp çok farklı bir yapıya kavuşturmak istiyorum, onun hakkında gerçekten çok güzel fikirlerim var.

Sanırım yeter. Matryoshka’ya şöyle bir bakıp geçmek isteyenler için kaynak kodu:

  1.  
  2. #!/usr/bin/python
  3. #-*- coding:utf-8 -*-
  4.  
  5. #    hayir hayir, plagi ters cevirme, o baska bir konu
  6. #                        __                        __    __        
  7. #       ____ ___  ____ _/ /________  ______  _____/ /_  / /______ _
  8. #      / __ `__ \/ __ `/ __/ ___/ / / / __ \/ ___/ __ \/ //_/ __ `/
  9. #     / / / / / / /_/ / /_/ /  / /_/ / /_/ (__  ) / / / ,< / /_/ /
  10. #    /_/ /_/ /_/\__,_/\__/_/   \__, /\____/____/_/ /_/_/|_|\__,_/  
  11. #                             /____/                              
  12. #    brsyuksel.com
  13.  
  14. import sys
  15.  
  16. def matryoshka_write(fbmp,ftxt,fout):
  17.         try:
  18.                 fbmp = open(fbmp,"r")
  19.         except:
  20.                 print "resim dosyasi bulunamadi"
  21.         else:
  22.                 if fbmp.read(2) != ‘BM’:
  23.                         raise IOError, "matryoshka sadece Windows BMP dosyalari ile calisabilir"
  24.                
  25.                 fbmp.seek(0x1C)
  26.                 ch = fbmp.read(2)
  27.                 ch = sum([ord(ch[i])<<8*i for i in range(len(ch))])
  28.                 if ch != 24:
  29.                         raise IOError, "matryoshka sadece 24-Bit BMP dosyalari ile calisabilir"
  30.        
  31.         fbmp.seek(2)
  32.         filesize = fbmp.read(4)
  33.         filesize = sum([ord(filesize[i])<<8*i for i in range(len(filesize))])
  34.  
  35.         fbmp.seek(0x0A)
  36.         offset = fbmp.read(4)
  37.         offset = sum([ord(offset[i])<<8*i for i in range(len(offset))])
  38.  
  39.         imgdata = filesize – offset
  40.  
  41.         try:
  42.                 ftxt = open(ftxt,"r")
  43.         except:
  44.                 print "mesaj dosyasi bulunamadi"
  45.         else:
  46.                 txt = ftxt.read()
  47.                 txt += chr(0)
  48.                 ftxt.close()
  49.                 if len(txt)*8 > imgdata/3:
  50.                         raise IOError, "saklanacak veri resim dosyasi icin cok buyuk"
  51.        
  52.         fbmp.seek(0)
  53.         try:
  54.                 fout = open(fout,"w")
  55.         except:
  56.                 print "cikti dosyasi olusturulamadi"
  57.  
  58.         fout.write(fbmp.read(offset))
  59.  
  60.         for i in range(len(txt)):
  61.                 chrasc = ord(txt[i])
  62.                 for j in range(7,-1,-1):
  63.                         data = fbmp.read(3)
  64.                         stegbyte = ((ord(data[2]) & 0xFE) | ((chrasc & (1<<j))>>j))
  65.                         data = data[:2] + chr(stegbyte)
  66.                         fout.write(data)
  67.        
  68.         if len(txt)*8 != imgdata/3:
  69.                 fout.write(fbmp.read())
  70.  
  71.         fout.close()
  72.         fbmp.close()
  73.  
  74. def matryoshka_read(fbmp,ftxt):
  75.         try:
  76.                 fbmp = open(fbmp,"r")
  77.         except:
  78.                 print "resim dosyasi bulunamadi"
  79.         else:
  80.                 if fbmp.read(2) != ‘BM’:
  81.                         raise IOError, "matryoshka sadece Windows BMP dosyalari ile calisabilir"
  82.                 fbmp.seek(0x1C)
  83.                 ch = fbmp.read(2)
  84.                 ch = sum([ord(ch[i])<<8*i for i in range(len(ch))])
  85.                 if ch != 24:
  86.                         raise IOError, "matryoshka sadece 24-Bit BMP dosyalari ile calisabilir"
  87.        
  88.         fbmp.seek(0x0A) 
  89.         offset = fbmp.read(4)
  90.         offset = sum([ord(offset[i])<<8*i for i in range(len(offset))])
  91.        
  92.         try:
  93.                 ftxt = open(ftxt,"w")
  94.         except:
  95.                 print "cikti dosyasi olusturulamadi"
  96.        
  97.         fbmp.seek(offset)
  98.         while True:
  99.                 charasc = 0
  100.                 for i in range(7,-1,-1):
  101.                         data = fbmp.read(3)
  102.                         charasc |= ((ord(data[2]) & 0×01) << i)
  103.                
  104.                 if charasc == 0:
  105.                         break
  106.                 ftxt.write(chr(charasc))
  107.        
  108.         ftxt.close()
  109.         fbmp.close()
  110.  
  111. if __name__ == ‘__main__’:
  112.         if len(sys.argv) == 1:
  113.                 print "Kullanim:"
  114.                 print "matryoshka yaz bmpdosyasi txtdosyasi bmpciktidosyasi"
  115.                 print "matryoshka oku bmpdosyasi txtciktidosyasi"
  116.  
  117.         elif sys.argv[1] == ‘yaz’:
  118.                 matryoshka_write(sys.argv[2],sys.argv[3],sys.argv[4])
  119.  
  120.         elif sys.argv[1] == ‘oku’:
  121.                 matryoshka_read(sys.argv[2],sys.argv[3])
  122.  
  123.         else:
  124.                 print "Kullanim:"
  125.                 print "matryoshka yaz bmpdosyasi txtdosyasi bmpciktidosyasi"
  126.                 print "matryoshka oku bmpdosyasi txtciktidosyasi"
  127.  

“Ben hackerım, çok da tehlikeliyim saklamam gereken özel bilgilerim var, ben kullanırım bunu, lamer değilim ben!” diyerek bizi güldürecek ya da sadece indirmek isteyenler için tar.gz arşivi:
matryoshka.tar.gz

Tüm bunları Alpcan Aydın okusun da Matryoshka’yı hızlı bir şekilde geliştirelim diye anlattım.

Tags: , , ,
Posted in Python · Temmuz 10th, 2010 · Comments (0)

No comments yet

Leave a Reply

Bağlantılar

Etiketler

çember özel yöntem isimleri apache2screen apache2screen.deb bele kuvvet bi_rle4 brute-force classic classes classmethod descriptors getanurse ic.lnx icontacts ileri c programlama image imagedraw kaba kuvvet kelime tahmin libnotify math math.cos math.sin matruşka matryoshka memory leak mesafe metaclass mysqli new-style classes oauth php5 property pynotify Python singleton special method names staticmethod steganografi steganography super twittell TwittellOAuth wchar yeni stil sınıflar __mro__

Meta