19 Mart 2013 Salı

Fork Bombing ve Korunumu

İsminden de anlaşılacağı gibi,bir process in kontrol dışı çoğalması ve kaynakların hunharca tüketilip sistemi dondurup,devre dışı haline getirmesidir.
Bir DOS(denial of service) saldırısıdır.Prosesler geometrik bir şekilde(1,2,4,8,16,32....) artacağı için memoryde akıl almaz bir kaynak tüketimi ve cpu nun işlem gücünü çalarak sistem üzerinde çalışan diğer hizmetlerin,programların çalışmasını engeller.
Şematize Fork Bombing

Fork Bombing den nasıl korunuruz ?

Unix türü işletim sistemlerinde kullanıcının bir oturumda açabileceği process sayısı önceden belirlenmiştir.Kullanıcı bu process sayısını kesinlikle aşamaz.unix te ulimit shell komutuyla bu sınırlama gerçekleştirilebilir.

Windows türü işletim sistemlerinde bu işlem process sayısı olarak değil de cpu kullanımı olarak ele alınmıştır.
kullanıcıların cpu kullanımı sınırlandırılır.

Basit bir Fork Bombing
Unix tabanlı işletim sisteminize aşağıdaki kodu yazıp çalıştırarak ne kadar çaresiz kalabileceğinizi öğrenebilirsiniz :)

#include <stdio.h>
#include <unistd.h>
void main(){
while(1){
fork();}
}
NOT:Derleyip çalıştırmadan önce açık kalan kayıt edilmemiş programlarınızı kapatın.

Attack Tree ve Yazılım Güvenliği

Güvenlik konusunda saldırı ağacı dediğimiz Attack Tree,bir güvenlik sisteminde gerçekleşecek saldırı türlerini ve bu saldırı türlerinin hangi yollarla gerçekleştirilebileceğini bir ağaç formunda gösterilmesidir.
[1] Attack Tree Örneği

Yukarıdaki ağaçtan bahsedecek olursak.Dosyaya bulaşan bir virüsün sistem üzerinde yapabileceklerini simgelemektedir.Ağaç,yapraklarına ayrıldıkça durum sayısı artar.Bu durumuların herhangi birisi gerçekleşebileceği gibi aynı anda aynı seviyede bütün durumlarda gerçekleşir.
Örnekleyecek olursak
1.Senaryo
Virüs dosyaya bulaşır -> Virüs kod gereği kendisini Administrator yetkisinde olarak çalıştırır ->Virüs üreteceği kötü niyetli kodla(exploit) dosya sisteminin köküne ulaşabilir ve istediğini yapabilir.
2.Senaryo
Virüs dosyaya bulaşır -> Virüs kendini normal kullanıcı yetkisinde çalışır ->Virüs kendisi gibi zararlı programları internetten indirir ve makineye zarar verir.

Bunun gibi tepeden tırnağa bir kötü yazılımın,açığın sisteme hangi zararları vereceğini bu yapıyı kullanarak optimum bir şekilde gösterebiliriz.

Bu ağaç çeşitli yazılım güvenliği modelleme araçlarıyla dizayn edilir ve kurumların kullandıkları,ürettikleri sistemlerin olabilecek güvenlik açıklarını,bu açıklara karşı davranışları simüle edilebilir ve iş devamlılığı bu sayede sağlanabilir.

Kaynaklar
[1] http://en.wikipedia.org/wiki/Attack_tree#Attack_tree_modeling_software


7 Mart 2013 Perşembe

XMPP Protokolüyle Mesajlaşma

Çoğu messenger yazılımının kullandığı bir protokol olan XMPP(eXtensible Messaging and Presence Protocol) her protokol gibi donanımdan bağımsız cihazların birbirleriyle mesajlaşmasını(ses yada video),dosya aktarmasını sağlar.
Donanımdan bağımsız demek;mesela iki kişi biri cep telefonunda diğeri bilgisayar başında,bunlar kendi aralarında anlık mesajlaşabilirler.
Client/Server mimarisinde çalışmakta olup,bütün uç birimler bir server aracılığıyla haberleşmektedir.Yani siz karşı tarafa mesaj gönderirken ilk önce o mesaj server a daha sonra server dan göndermek istediğiniz kişiye iletilmektedir.


Piyasada çeşitli açık kaynak kodlu yazılımlarla sizde bir mesajlaşma servisi yazabilirsiniz.Bunlardan önce server ınızın bulunması gerekiyor(linux ya da ms server olabilir)

Server yazılımı için Openfire(kurulum ve ayarlama konusunda çok rahat),ve clientler için de openfire bünyesindeki client apilerini kullanabilirsiniz.

Bilgisayarınızda çalıştırmak istiyorsanız Spark'ı yükleyebilirsiniz.Açık kaynaklı olmasıyla Smack API leri indirerek kodlama bilgilerinizle kendi uygulamanızı bilgisayar platformunda yazabilirsiniz.

Mobil platformda client düşünüyorsanız aSMACK API lerini kullanarak Android ortamında çalışabilirsiniz.

WEKA ile Veri Madenciliği

Veri madenciliği,enformasyon alanında yapay zeka tekniğiyle beraber kullanılan akıllı öğrenme sistemlerinde kullanılan bir bilgi keşif tekniğidir.
Mesela bir deniz kabuğunun yaşını onun muhtelif özelliklerinden istatistiksel çıkarımlar yaparak kesin olmamakla beraber kuvvetli tahminler yapabiliriz.İşte bu istatistiksel çıkarımların bütünü veri madenciliğine girmektedir.
Weka bir veri madenciliği uygulaması olup açık kaynak kodlu geliştiricilerin kullanımına açık bir uygulamadır.

Weka indirmek için tıklayınız

Öncelikle WEKA kullanmak için wekanın desteklediği dosya formatları CSV,ARFF dir.ARFF,CSV ye göre daha erişilebilir bir dosya uzantısı olup CSV nin aksine dosya üzerinde yapacağınız değişimleri kaydedebilirsiniz.CSV de bu özelliği bulamayabilirsiniz.

Yükleme işlemi bittikten sonra uygulamamız açılır ve Explorer sekmesine gelinir

Daha sonra Open File butonuna tıklayarak .arff uzantılı dosyamız seçilir.


Preprocess sekmesi, bize dosya hakkında bilgiler vermektedir.Bu dosyadaki sınıfları(class),özellikleri(attribute) bilgileri ve bu bilgiler üzerinde yapılabilecek işlemler burada gerçekleşmektedir.Biraz detaya inecek olursak;
Filter kısmı,veriler üzerinde çeşitli hesaplamalar,uygulamalar(kayıp verilerin doldurulması,veriyi daha küçük parçalara ayırma(cross validation) ) gibi işlemler yapılabilmektedir.
Örneğin uğraştığımız datasette eğer kayıp veriler(missing value) mevcut ise
Choose -> filters ->unsupervised-> attributes->ReplaceMissingValue 
yaparak üzerinde bulundurduğu algoritmalarla Weka kayıp verilere değerler atayacaktır.


Classify(sınıflama)

Sınıflandırma veri madenciliğinde belirli özelliklere sahip olan örneklerin hangi sınıfa ait olduğunu göstermek için kullanılır.Günlük hayatta özellikle e-ticaret sitelerinde bolca kullanılmaktadır.Örnek verirsek "bunu satın alan kullanıcılar aşağıdaki şu ürünleri de incelemiştir,satın almıştır" veya bilgisayar oyunlarında özellikle iki oyunucunun özelliklerini karşılaştırarak hangi oyuncunun daha kuvvetli olduğuna karar veren mesela PES'te bir maçı simulate ederken iki takımın özelliklerini karşılaştırıp,çeşitli dış şartları(home&away,maçın önemi(lig veya final maçı gibi) ) da dahil ederek hangi takımın galip geleceği bu sınıflama tekniğiyle yapılmaktadır.

Wekada Classify sekmesine geldiğimizde karşımıza çıkan pencereyi inceleyelim.
Choose: sekmesi hangi sınıflama algoritmasını kullanacağız onu belirliyoruz.Örnekte J48(decision tree) algoritması gösterilmiştir.
Test Options: kısmına geldiğimizde burada verimizi nasıl parçalayacağız kaçını test kaçını training olarak kullanacağız onu belirliyoruz.Tek tek baktığımızda
Use Training set : Burada üzerinde Preprocess sekmesinde yüklediğimiz veri setinin tamamı kullanarak sınıflandırma yapılır
Supplied test set: Dışarıdan elle oluşturulmuş veri setini test olarak mevcut veri setimizi training olmak şartıyla kullanabiliriz
Cross Validation: K - Cross Validation tekniğiyle veri seçme
Percentage Split:Mevcut verimizin yüzde kaçını training olarak kullanacağımıza karar verir.

More Options un hemen altındaki sekmede hangi özelliğe göre sınıflama yapacağımız o seçilir.Buraya tıkladığımız vakit veri setimizdeki özellik değerlerini gösterir.

Start butonuna basılarak işlem başlatılır.

Sonuç kısmına baktığımızda burada bizi ilgilendirecek en önemli kısım Confusion Matrix tir.Confusion Matrix verilerimizin doğru bir şekilde sınıflandırılıp sınıflandırılamadığını bize söyler.Örneğe bakacak olursak yanlış bir sınıflandırma olmamıştır.9 kişi gerçekte republican sınıfında olup,sınıflama algoritması sonucunda da republican sınıfında olduğu tespit edilmiştir.Aynısı democrat sınıfındaki 6 örnek içinde geçerlidir.

21 Aralık 2012 Cuma

Shell Geliştirmeye Giriş

Shell,terminal üzerinde yazdığınızı işlemleri(bu bir ekrana bastırma işlemi de olabilir,klasörün içindeki dosyaları harf sırasına göre sıralamakta olabilir) gerçekleştiren kod parçasıdır.
Sheller fiziksel olarak .sh uzantılı dosyalardır.Unixin kendi shell dili olduğu gibi,C,Perl gibi dillerde de shell yazılabilmektedir.

Terminal açılır.
gedit <dosyanızınadı>.sh 
olacak şekilde metin düzenleyicisi açılır.


Açılan metin düzenleyicisinde shellimizde yaptırmak istediğimiz kodlar yazılır.İlk shell kodumuz olduğundan kullanıcıdan iki giriş alan ve ekrana çıktı bastıran shell yazdıracağız.
echo "Merhaba Dünya"
echo "Ad:"
read ilkAd
echo "Soyad:"
read soyAd
echo "Benim adım $ilkAd $soyAd"
echo,ekrana yazdırmak istediğimiz metni gönderen bir komuttur.
read,kullanıcıdan aldığı veriyi bir değişkene atan bir komuttur.
echo komutunda read komutundan aldığımız parametreyi yazdırmak için yazdırmak istediğimiz değişkenin başına $ işareti getirilir.
Gördüğümüz gibi echo ve read komutuyla shell dosyamızı hazırlamış olduk.Şimdi nasıl çalıştıracağız ona bakalım

Düzenleyici(gedit) kapatıldıktan sonra terminale dönelim ve
sh shell01.sh
komutunu yazalım

Entera bastıktan hemen sonra kodumuzdaki ilk iki echo komutu vazifesi gereği aldığı stringleri ekrana bastırmakta ve read komutu sizden giriş yapmanızı beklemektedir.


9 Aralık 2012 Pazar

Windows 8 "Windows" Dosyalarında Değişiklik İzni Alma

Windows 8 ' de karşılaşacağımız sorunlardan biri de Windows dosyalarında değişiklik yapmasına izin vermemesidir.Aslında normal kullanıcılar için güvenlik açısından faydalı olsa da geliştiriciler açısından ister istemez sıkıntı yaratan bir durum olmaktadır.

Örnek olarak Windows\System32\drivers\hosts dosyasını kullanalım

"hosts" dosyasına sağ tık Özellikler menüsü açılır ve bu menüden Güvenlik sekmesine tıklanır.


Güvenlik sekmesinden Gelişmiş tıklanır ve kullanıcı adının yazdığı seçenek seçilir "İzinleri Değiştir" e tıklanır.


Öncekinde olduğu gibi profil ismi belirtilecek şeklinde seçilir ve "Ekle" düğmesine basılır.İsterseniz erişim izni engellemek dosya da değişikliğin yapılmasına izin vermemek için "Kaldır" veya "Düzenle" düğmelerine tıklayabilirsiniz.


Buradan "Sorumlu seçin" yazısı tıklanır.


Sırayla Gelişmiş ---> Şimdi Bul tıklanır. Arama sonuçlarında çıkan listede bilgisayarınızın kullanıcı adı seçilir ve tamam a basılır.



Bu işlemden sonra iki işlem öncede aktif olmayan "Temel İzinler" aktifleşir ve buradan istediğiniz izni verebilirsiniz.


6 Aralık 2012 Perşembe

Java Thread

Thread,bir programı oluşturan iş parçacıklarıdır.Bildiğimiz gibi programlar küçük küçük iş parçacıkları(thread) tarafından oluşturulmaktadır.Gerçek hayata örnek verirsek yolda yürümek bir thread,yolda yürüken müzik dinlemek ayrı bir thread,yolda yürüyüp müzik dinlerken etrafı izlemek ise başka bir thread dir.
Burada size giriş olarak en basit anlamda bir thread JAVA platformunda nasıl oluşturulur,oluşturulan thread nasıl geçici bir süreliğine durdurulur -ki biz buna literatürde uyku(sleep) diyoruz- onu anlatacağım.

import java.util.Random;                              
public class Olay implements Runnable {
String isim;
int zaman;
Random r = new Random();            
public Deneme(String i){
isim=s;
zaman=r.nextInt(10);
}
public void run(){
try{
System.out.printf("%s uyudu %d ms \n", isim,zaman);
Thread.sleep(zaman);
System.out.printf("%s tamamlandı\n", isim);
}
catch(Exception e){
}
}

}
Threadlerimizin çalışması için Runnable arayüzünü oluşturduğumuz Olay sınıfına ekliyoruz.
java.util.Random: Random,rastgele bir değer üreten bir sınıftır.
zaman=r.nextInt(10) : Buradaki "r" Random sınıfının bir objesi olup nextInt(10) metodu,zaman türündeki bir değeri giriş olarak zaman değişkenine atmaktadır.
public void run() : Fonksiyon başlığından belli olduğu gibi run() metodu threadimizi çalıştırdığımız fonksiyondur.Bu fonksiyonun içine biz hangi kodları yazarsak threadimiz ona göre çalışacaktır.Biz basit anlamda threadlerin rahat anlaşılması için ekrana çıktı veren fonksiyonları yazdık.
Thread.sleep() : Sleep metoduyla giriş değeri olarak "zaman" değişkeninden aldığımız değeri milisaniye cinsinden aktarır.Alınan değer oluşturduğumuz thread i uykuya geçirir.Örneğin Thread.sleep(1000) demek, 1000 milisaniye boyunca thread uykuya geçecek demektir.


public class anaFonksiyon{
public static void main(String[] args){
Thread t1 = new Thread(new Deneme("Bir"));
Thread t2 = new Thread(new Deneme("İki"));
Thread t3 = new Thread(new Deneme("Üç"));
t1.start();
t2.start();
t3.start();
}

}

Main kodumuzda Olay.java oluşturduğumuz sınıfları tek tek çağırıyoruz. 

Konsol ekranımız Şöyle olur:

İki uyudu 5 ms 
Üç uyudu 4 ms 
Bir uyudu 8 ms 
Üç tamamlandı
İki tamamlandı
Bir tamamlandı

Gördüğümüz gibi "Bir" 8 ms boyunca durdurulduktan sonra tamamlanmıştır.Aynı şekilde "İki" 5 ms, "Üç" 4 ms boyunca.En kısa "Üç" uyuduğu için "Üç" işini en erken sonlandırmıştır.Ondan sonra "İki" ve en son "Bir" işini sonlandırmıştır