Oct
04

Linux BackTrack 5 Kitabı Çıktı

Kemal Demirez’in yeni kitabı Linux BackTrack 5 çıktı. Bugün aldım çok merak ettiğim konular var içerisinde. Fiyatı kitapçılarda 20 lira. Ancak yazarına ulaşarak incelemek için ücretsiz olarak temin eden ubuntu-tr kullanıcısı da var. Kitap daha çok nereden başlayacağını bilmeyen güvenlikle alakalı konuları merak eden insanlar için yazılmış.

Bölüm bölüm içindekileri aktarmaya çalışacağım:

1- Tanımlar

Güvenlik ve internetle ilgili temel tanımlar var. Porttan Buffer Overflow’a kadar bir çok terim kısa kısa açıklanmış.

2- BackTrack 5 Kurulumu

Vmware üzerine kurulumu anlatılmış ve genel olarak BackTrack 5 dağıtımı hakkında bilgiler verilmiş.

3- Linux Shell ve Konsol

Basit shell komutları, genel olarak penetrasyon ve test methodları ile izlenen yollar anlatılmış.

4- BackTrack Araçları

En güzel bölüm bu sanırım. WireShark’tan Metasploit’e bir çok program giriş seviyesinde anlatılmış.

5- Forensics

6- Raporlama Araçları

Güvenlikle alakalı konuları merak edenler için güzel bir giriş kaynağı. Okudukça yorumlarımı paylaşacağım.

Oct
03

Arm Cortex Programlama – 1

Arm Cortex M serisi ile maceram yeni başladı. Arm Cortex programlama hakkında öğrendiklerimi yazı dizisi halinde yayınlamayı düşünüyorum. Bu ilk yazım bir nevi hello world yazısı olacak. Taskler ve onların tanıtılıp yaratılması ile real time programlamaya giriş yapılacak.

Kullandığım Araçlar:

Kit (Donanım): LPC 1114 LPCXpresso kiti. Üzerinde Arm Cortex M0 var. Usb kablo ile enerjilenebiliyor ve programlanabiliyor.

İşletim Sistemi: Ubuntu 11.04 Gnome Classic

LPCXpresso (IDE): Programları yazıp, derleyip kitimize yükleyebildiğimiz eclipse tabanlı IDE.

FreeRTOS: Küçük boyutlarda Real Time (gerçek zamanlı) işletim sistemi. LPC 1114 için oluşturulmuş hazır proje örneğini direkt atabiliyorsunuz kitinize.

Başlamadan Önce Önemli Not: Yazdığınız kodları kitinize atmanız zaman alabilir veya atarken donmalar olabilir, bazen de haza verebilir. Bunun gibi şeylerle karşılaştığınızda LPCXpresso’yu kapatın. Cihanızın USB kablosunu ayırın ve LPCXpressoyu yeniden çalıştırıp yükleme işlemini tekrarlayın. Yılmayın kodunuzda hata olmadığı sürece tekrar deneyin. Üçüncü denemenizde muhtemelen olacaktır. FreeRTOS’u içine gömdüğünüz için biraz uzun sürüyor ve hata verebiliyor.

Gerçek Zamanlı sistemleri basitleştirmek için aynı anda bir çok işi yapabilme olarak düşünebiliriz. Daha düzgün bir tanımı için belki bir yazı daha yazabilirim. Böylece ufacık kitinizde bir program parçası sensörden veri okurken diğer bir program parçası da internetten gelebilecek istekleri bekler konumda tutulabilir. Bu program parçacıklarına Task diyoruz.

Task / Thread Nedir, Neden Gereklidir?

Task aslında programcıların bildiği threaddir. Ancak gömülü sistemlerde task terimi daha çok kullanılmaktadır. Task nedir sorusunun yanıtı aslında neden kullanılır sorusunun yanıtıdır. Diyelim iki sonsuz döngünüz var kodunuzun içinde ve çalıştırdınız. Programınız birinci döngüye girer ve döngüyü kırmadığınız sürece oradan çıkamaz. Ancak elimizde iki tane sonsuz döngü var ve biz bu iki işlemin de sürekli olarak yapılmasını istiyoruz! İşte burada thread / task kavramı ortaya giriyor. İki task oluşturuyoruz ve işlemcinin bu ikisini de yapabilmesini sağlıyoruz.

FreeRTOS

Kendi seçimim olmayan hazır örneği olduğu için başlangıçta kullanıp real sistemlerini öğrenmeyi hedeflediğim işletim sistemi. Open-Source ve küçük boyutlarda olması en büyük artısı ancak kullanım klavuzu 60 dolar. İnternette bulmama rağmen hiç de hoşnut değilim. 170 sayfalık kitapçığın 60 dolara satılması gereksiz. En azından sitede başlangıç için bir iki makale olmasını isterdim o da yok. En kısa zamanda linux tabanlı veya açık kaynaklı daha düzgün bir RT sistemine geçmeyi planlıyorum.

FreeRTOS’un en güzel yanı ise elimizde src/ dizininin altında bir main.c dosyası olması ve onunla istediğimiz gibi oynayabilmemiz. Ayrıca ayarlamalar için diğer kütüphane dosyalarında oynamalar yapmamız gerekecektir ileride ancak başlangıç için hiçbir ayar yapmadan kodunuzu yazabiliyorsunuz.

Task / Thread Tanımlama

Açıkçası çok kolay geldi. Generik bir pointerla void olarak fonksiyonumuzu tanımlamamız yeterli. Elbette içinde bir sonsuz döngü olması mantıklı. Yoksa neden task kullanalım :)

Aşağıdaki kodda iki task oluşturduk. Bunun gibi bir çok taski kolayca oluşturabiliriz. Aşağıdaki kodda debug_puts fonksiyonu ile LPCXpresso’nun konsoluna hello world’umuzu yazdırmış oluyoruz.

void vTaskDebuggerHeartbeat1(void *pvParameters)
{
	while(1)
	{
		debug_puts("Merhaba Dunya! >> Task1");
		vTaskDelay(configTICK_RATE_HZ*3);
	}
}
 
void vTaskDebuggerHeartbeat2(void *pvParameters)
{
	while(1)
	{
		debug_puts("Merhaba Dunya! >> Task2");
		vTaskDelay(configTICK_RATE_HZ*3);
	}
}

Task / Thread Yaratma

Sıra geldi tanıttığımız taskleri kullanmaya: bunun için C API’nin xTaskCreate() methodunu kullanıyoruz. Bu fonksiyonları tahmin edilebileceği gibi main methodunun içinde kullanmalıyız.

xTaskCreate( vTaskDebuggerHeartbeat1, (const signed portCHAR * const)"ping", configMINIMAL_STACK_SIZE,
			NULL, 3, NULL);
xTaskCreate( vTaskDebuggerHeartbeat2, (const signed portCHAR * const)"ping1", configMINIMAL_STACK_SIZE,
			NULL, 3, NULL);

Ardından FreeRTOS Scheduler’ı başlatılır:

vTaskStartScheduler();

Eğer tek bir işlemci vsadarsa, işlemci üzerinde anlık olarak sadece bir task çalışabilir. Ardından başka bir taske geçilir. Bu sebeple taskin iki durumundan sözedebiliriz: Running ve not running. Not running’de başka şeyler de var. Ama kolaylık olsun diye şimdilik böyle ayırdık. Not running kısmında taskin durumu kaydedilir ve resume olması beklenir. Aşağıdaki şekil daha açıklayıcı olabilir:

 

 

Task geçişi not running kısmından running kısmına geçince “switching in” veya “swapped in” denilir. Tam tersi için ise “switched out” veya “swapped out” denilir. FreeRTOS Schedulerı bu switch in ve out işini yapan tek birimdir.

Pragramın Çalıştırılması

Eklediğimiz kısımlarla kodumuzu kaydediyoruz ve freertos projesine sağ tıklayıp run diyerek kodumuzu atıyoruz. Sonuç olarak LPCXpresso konsolunda aşağıdakine benzer bir çıktı aldım.

Merhaba Dunya! >> Task1
Merhaba Dunya! >> Task2
Merhaba Dunya! >> Task1
Merhaba Dunya! >> Task2
Merhaba Dunya! >> Task1
Merhaba Dunya! >> Task2

 Sonuç

Başka bir programlama dilinde thread kavramına hakimseniz çok da zorlanıcağınızı düşünmüyorum. Çalışmalarıma devam edip yeni şeyler öğrendikçe buradan yazmaya devam edeceğim. Ayrıca RTOS için önerilere açığım. Kendi sistemim için herhangi bir RTOS’u nasıl uygun hale getireceğim konusunda bilgi ve tecrübe eksikliğim var. Yardımcı olabilicekler varsa buradan yazabilirlerse sevinirim.

Sep
30

Java ile Thread Kullanarak Socket Programlama

Bu yazımda çok işlevsel olmasa da Android için telnet client’ı yazarken kullandığım echo server kodlarını anlatacağım. NIO paketini kullanmadığım için aslında çok da sağlıklı değil ve her bağlantı için ayrıca bir thread oluşturulmaktadır. Bu nedenle çok fazla yüklenmelere dayanamayacak bir server olacak bizimkisi.

Önce Java’da socket işleri nasıl yürüyor ona bakalım. Javada ServerSocket ve Socket olmak üzere kullanıma hazır iki socket türü var(Aslında LocalSocket de var). Server sürekli bekleme işini yaptığımız ve dışardan birisi bağlanırsa ona gereken cevabı verdirttiğimiz makinede sürekli çalışmak zorunda olan programımız. ServerSocket sınıfının constructoru ile hangi porttan bu server hizmetini vereceğimizi belirlememiz gerekiyor.

Olay ise şundan ibaret:

1- ServerSocket’imiz bir portu izler durur.

2- Client bir Socket yardımıyla bizim Server’ımızın portuna naber der.

3- ServerSocket bu bağlantıyı accept() static methoduyla aldıktan sonra bir socket oluşturur.

4- Bu oluşturulan socket ile haberleşirler. Ve mutlu son :)

Neden Thread Kullanmalıyım?

Çok basit! Server’a birden fazla client’ın bağlanabilmesi için bu yapılır. Client tarafından gelen verinin ne kadar sürede geleceği belli değildir. Bu sebeple o verilerin alınma işlemleri bir thread’ın run methodunun içine gömülür. Ardından serverda start() static methodu ile thread çalıştırılır.

Server’ımızın Kodu:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.cagdas.network;
 
import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
 
public class EnterpriseEchoServer {
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ServerSocket ss;
 
		try {
			ss = new ServerSocket(23);
			System.out.println(InetAddress.getLocalHost() + " hazir");
			while (true) {
 
				Socket s = ss.accept();
				System.out.println(s.getInetAddress().getHostName() + " "
						+ s.getInetAddress().getHostAddress() + " baglandi");
				new EESThreadPart(s).start();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}// Telnet hizmeti
 
	}
 
}

Burada 23 numaralı telnet portunu seçtim. Kodda görüldüğü üzere s socketi serversocketinin accept metodu ile gelen isteği kabul edilip oluşturuluyor. getInetAdress() methodu ile bağlanan kişinin bilgileri HostName ve HostAdress gibi bilgileri alınabiliyor. Ardından s socketi thread’li kısma gönderiliyor.

 

Thread kullanılan Sınıf

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.cagdas.network;
 
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
 
public class EESThreadPart extends Thread {
 
	private Socket s;
 
	public EESThreadPart(Socket s) {
 
		this.s = s;
	}
 
	public void run() {
		PrintStream pr;
		try {
			pr = new PrintStream(s.getOutputStream());
			Scanner sc = new Scanner(s.getInputStream());
			pr.println("Server'a baglandiniz. Cikmak icin bye yazin."); // Client'a
			String gelen; // gonderiliyor
			while (true) { // sonsuz dongu
				gelen = sc.nextLine(); // client'dan geliyor
				if (gelen.trim().equalsIgnoreCase("bye"))
					break;
				System.out.println("Client:" + gelen);
				pr.println("Echo:" + gelen);
			}
			s.close();
			System.out
					.println(s.getInetAddress().getHostName() + " "
							+ s.getInetAddress().getHostAddress()
							+ " serverdan cikti!");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
 
	}
 
}

Burada PrintStream kullanılarak Client’a veri gönderilmiş ve ondan gelenler de Scanner yardımıyla sonsuz döngü içerisinde beklenmiştir. Bye yazıca client ile bağlantıyı sağlayan socket sonlandırılmakta.

Server’ımızı Nasıl Deneriz?

Telnet portunu (23) kullanmamızın bir nedeni vardı :) Herhangi bir telnet clientı ile programınız çalışıyorken denemelerinizi yapabilirsiniz. Mesela ubuntuda şöyle kullanılabilir:

cagdas@cagdas-K53SV:~$ telnet
telnet> open localhost
Trying 127.0.0.1…
Connected to localhost.
Escape character is ‘^]’.
Server’a baglandiniz. Cikmak icin bye yazin.

Jun
29

My First Design Pattern in Java : Singleton

I learned my first design pattern at my oop based java lesson. If you need to create only one instance  and reuse this instance forever (or some classes need only one instance who knows?) you can use this pattern. This pattern was published by GoF.

Where we can use?

Some application need unique items. For example, my company use unique billing system in crm program because we need a unique reference.

How can I use?

First we add private constructor at our claas. It means that we can not use “new” operator at other class. Because when we use “new” operator, it calls class’s constructor for creating instance. Actually, if I can not use new operator at other class and how can I create new instance? Static keyword is the answer of the question. I write a static and public method for getting a new object and then I can create new objects. Then we can count creating of instances via a static integer field (I call it count in my piece of code).  Finally, I use if statement for creating my instance in static getCagdasSingleton() method.

Blueprint of CagdasSingleton class:

 

 

and finally simple java code of my singleton class:

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/**
 *
 */
package com.cagdastopcu.designpatterns;
 
/**
 * @author cagdas
 *
 */
public class CagdasSingleton {
 
	private static int count;
	private int nediryani;
	private int index;
	private static CagdasSingleton single;
 
	private CagdasSingleton() {
 
		index = count;
	}
 
	public static CagdasSingleton getCagdasSingleton() {
		// if (single == null)
		if (count++ == 0) // Is it the first creation?
			single = new CagdasSingleton(); // if yes we create our instance
		return single;// if no we use old instance :)
	}
 
	protected void setNediryani(int i) {
		nediryani = i;
	}
 
	protected int getLan() {
		return nediryani;
	}
 
	protected int getIndex() {
		return index;
	}
 
}

 

This is the test class:

 

package com.cagdastopcu.designpatterns;
 
public class CagdasSingletonDriver {
 
	public static void main(String[] args) {
 
		CagdasSingleton mySingleton1 = CagdasSingleton.getCagdasSingleton();
 
		System.out.println(mySingleton1.getIndex());
 
		CagdasSingleton mySingleton2 = CagdasSingleton.getCagdasSingleton();
 
		System.out.println(mySingleton2.getIndex());
 
		CagdasSingleton mySingleton3 = CagdasSingleton.getCagdasSingleton();
 
		System.out.println(mySingleton3.getIndex());
 
		CagdasSingleton mySingleton4 = CagdasSingleton.getCagdasSingleton();
 
		System.out.println(mySingleton4.getIndex());
 
		System.out.println(mySingleton1);
		System.out.println(mySingleton2);
		System.out.println(mySingleton3);
		System.out.println(mySingleton4);
 
	}
 
}

 

Output:

 

cagdas@zanpakutou:$

1
1
1
1
com.cagdastopcu.designpatterns.CagdasSingleton@30c221
com.cagdastopcu.designpatterns.CagdasSingleton@30c221
com.cagdastopcu.designpatterns.CagdasSingleton@30c221
com.cagdastopcu.designpatterns.CagdasSingleton@30c221

 

I tested my singleton design pattern with print reference fields. They point to same heap adress.

May
20

Android Geliştirme Araçlarının Kurulumu

Uzun zamandır yazmamışım. Unutmamak adına kendime hazırladığım dökümanı paylaşmak istedim. Belki çoğu kişi kolayca halletmiştir ancak kurarken karşılaşabileceğimiz sorunları da içerdiğinden gerekli olduğunu düşündüm.

Öncelikle eclipse’imiz kurulu olmalı ve javamız sun’ın olmalı. İlk olarak android sdk şu adresten indirelim:

 

http://developer.android.com/sdk/index.html

 

ben ubuntuda olduğum için linux’u seçtim. Kullanıcı klasörümüze açalım bu android sdk dosyasını:

 

tar xvfz android-sdk_r11-linux_86.tgz
rm android-sdk_r11-linux_86.tgz

 

Burada ilk olarak oyunlar oynayacağımız android emulatörünü oluşturacağız fakat bazı güncellemeler yapmak lazım. Android SDK’sını çalıştırmak için şunları yapalım:

 

cagdas@zanpakutou:~$ cd android-sdk-linux_x86/

 

cagdas@zanpakutou:~/android-sdk-linux_x86$ cd tools/

 

cagdas@zanpakutou:~/android-sdk-linux_x86/tools$ ./android

 

 

yani o dosyanın içindeki tools klasörüne geçip orada ./android’i çalıştırdık. Ben androidimi oluşturduğum için şöyle bir ekran geldi:

 

Burada ilk önce available packages kısmından hangi android sdk’sına ihtiyacımız varsa onu indiriyoruz başta. Eğer https sıkıntı çıkarıyorsa settings bölümünden force https diye bir sekme var onu tiklememiz lazım.

 

Sonra available packages sekmesinden istediğimizi seçiyoruz. Third party dediği kısım telefonunuz samsungsa ona özel bir arayüz yayınlamış samsung ve oradan bunu indirebiliyoruz.

 

Gerekli olan arayüzü indirdikten sonra virtual devices sekmesinden New diyoruz. Burada yazılanlar gibi boşlukları dolduruyoruz. Ancak platformu Android 1.5 ve yukarısında hangi platformda çalışmak istersek onu seçebiliriz.

 

 

Bu tamamsa sıra geldi eclipse pluginini kurmaya. Android için olan eclipse plugin’inin adı ADT. Onu eclipse’in içinden kuruyoruz.

 

Eclipse’de help>install new software seçiyoruz ve karşımıza gelen kısma aşağıdaki linki kopyalıyoruz:

 

 

Add dedikten sonra aşağıdaki developer tools’u kuruyoruz.

 

Eclipse restart isteyecektir. Restart’tan sonra Eclipse’deki Window menüsünden Android SDK and AVD manager’e gelip daha önceden oluşturduğumuz android emülatörünü start’a basarak çalıştırıyoruz. Burada önemli olan boyutu. Starta bastıktan sonra scale display to real size’ı seçip screen size (n)= 6 monitor dip 119 yapıyoruz. Neden çalıştırdık ki daha kod yok ortada diyebilirsiniz. Android emülatörü çok yavaş açıldığından bir dafa başta görünüm boyutunu da ayarlayarak açıyoruz ve yazdığımız kodları proje sekmesinde üzerlerine sağ tıklayıp run’a basarak o çalıştırıyoruz. Böylece her defasında o açılışşı beklememiş oluyoruz.

 

Şimdi new android projectle direkt denemenizi yapabilirsiniz. Hello World uygulaması içinde hazır olarak var zaten.

 

Older posts «