Alt Programlarla Bağlantı Kurma

Pentester

Özel Üye
8 Eyl 2016
1,646
996
Merhaba, bu konumuzda alt programlarla bağlantı kurma teknikleri üzerine konuşacağız ve örneklerimizi gerçekleştireceğiz. Peki biz alt programlarla bağlantıya neden ihtiyaç duyabiliriz?

Örneğin geliştirdiğimiz programın bir noktasında hız faktörü öne çıkıyor burada hız gerektiren noktada Assembly kullansak, işlemlerimizi Assembly ile gerçekleştirip çıktı kısmında üst seviye bir dil kullansak o da C++ olsun, biz böyle bir işlemi nasıl gerçekleştirebiliriz bu konuda bu tarz bir örnek göreceğiz. Şunu da bilmekte fayda var Assembly işlemciye bağımlı bir dildir. Assembly ile birlikte de örneklerimizde nesne yönelimli bir dil olan C++ ile ilişkili ilerleyeceğiz. C++ ise elastik bir yapıda olduğundan Assembly diline nazaran her platformda çalışabildiğinden bu iki dili ortaklaşa kullanacağız. Öncelikle alt programlarla bağlantı kurarken bazı ana başlıklar üzerinden ilerleyelim.


Linker (Linkleme) İşlemi

Şimdi en başta da söylediğim gibi Assembly ve C++ ortaklaşması yapacağız. Peki bu senaryo nasıl gerçekleşecek aşağıdaki görsel üzerinden inceleyelim.

fma4k3b.png


İlgili görselimizi incelersek programın kaynak kodu derleyici vasıtasıyla derlenir ve obje kodu yani makine karşılığı üretilir. Bağlayıcı dediğimiz linker işlemi vasıtasıyla çalıştırılabilir formata yani exe haline dönüşür.

Şimdi burada Assembly ve C++ senaryosunu da bu görsel üzerinden kurgulamak gerekirse tam olarak şu şekilde olacaktır.
Assembly kodu yani .asm dosyası assembler ile derlenecek ve obje kodu elde edilecektir. C++ kodları yani .cpp dosyası C++ derleyicisi ile derlenip obje kodu üretilecek. Üretilen bu obje kodları linker işlemine tabii tutularak executable formatında birleşecektir.

Biz linker işlemini C++ üzerinden örneklendirelim.


mqj905n.png


Klasör yapımız bu şekilde olsun.

1ofotwt.png


Hpp dosyamız c++ header dosyamız oluyor. Burada Matematik adında bir sınıf tanımlıyoruz. Tanımladığımız sınıf içerisinde iki parametre alan Matematik fonksiyonumuz ve toplamSonuc adında fonksiyonumuz yer alıyor aynı zamanda sayi1 ve sayi2 değişkenlerimiz yer alıyor. Buradaki kodlara takılmanıza da gerek yok önemli olan linker işlemini anlamak.

6rnh3nt.png


Matematik cpp dosyamız da matematik header dosyasını include ediyoruz. Daha sonra ilgili sınıftan gerekli fonksiyonları kullanarak toplama sonucunu return ediyoruz.

gawt7sg.png


Daha sonra main.cpp dosyamızda ilgili işlemleri yaptırıp ekrana sonucu yazdırıyoruz. Daha sonra sırayla ilgili komutları çalıştırıyoruz.


Kod:
g++ -c Matematik.cpp -o Matematik.o
g++ -c main.cpp -o main.o

komutları ile obje kodlarını üretiyoruz.

Kod:
g++ main.o matematik.o -o program

Daha sonra üretilen obje kodlarını program adında çalıştırılabilir exe dosyasında birleştiriyorum ve bu şekilde linker işlemini gerçekleştirmiş oluyorum.

Yakın ve Uzak Çağrılar

Burada da çağrılarımızı intel 8086 mimarisinde Assembly kodları üzerinden inceleyelim.

1ytgeii.png


Program burada çalıştığı zaman jmp start komutu ile start etiketine atlıyor ve p1 prosedürünü çağırıyor ve gerekli işlemleri yapıyor. Daha sonra orada işi bitince mov ax, 66 yazan yerden devam ediyor. Burada aynı segmentte bir çağrı gerçekleşiyor. Çünkü burada çağrı kendi bulunduğu segment içerisindeki prosedüre çağrı yapıyor. Bu yakın bir prosedür örneğidir.

89cdkcv.png


Burada call far p1 ile uzak bir çağrı yapıyoruz ancak çalıştırınca p1 proc far bölgesine geçmiyor.

m4qx8ye.png


Burada offset_handle içersine p1 prosedürünün offset değerini atadım.

4k07l2k.png


Burada segment içi prosedür çağrısı yapılıyor.

Assembly ve C++ Bağlantısı

Burada C++ kodlarımız içerisinde assembly kodu yazacağız. Örnek kodu visual studio içerisinde göstereceğim. Bu şekilde çalışabilmek için Assembly derleme ayarlarını yapmış olmanız gerekmektedir.

61nj0rz.png


Örnek kod satırında x değişkeninin aldığı değer assembly kodu ile değiştiriliyor. Mov komutu x değişkenine 1 değerini kopyalıyor. Artık program çalıştığı zaman ekranda assembly ile müdahale dilen değer yer almış oluyor.
Bu örneklerimiz bu şekilde uzar gider. Bu konuda temel olarak linker işlemi ve Assembly ile C++ ortaklaşmasını bir örnek üzerinde incelemiş olduk.
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.