ÇALIŞTIRILABİLİR WİNDOWS DOSYA FORMATI  (PORTABLE EXECUTABLE FİLE FORMAT)-1

31.10.2009

Herkesin ihtiyacı olduğuna inandığım yeni bir yazı dizisine hep birlikte merhaba diyelim . Aslında Bu yazıyı yazmaktaki amacımız özellikle çok önemli olmasına rağmen hemen hemen kabaca çeviriler ve yüzeysel anlatımlar dışında nerdeyse hiç detaylı anlatımın olmamasıdır . Bu yazı dizisinde siz okuyucularımızın Reverse engineeringle en azından Ollydebug kullanıp birkaç “crackme” kırabildiği seviyede bilgi sahibi olduğunuz düşünülerek hazırlanmıştır eğer bu seviyede değilseniz öncelikle daha basit konulardan başlamanız sizin için daha iyi olacaktır. Bu yazı dizisinde ARTeam’ın sitesindeki İngilizce asıl dokümantosyan temel kabul edilip bizim anlayabileceğimiz dile çevrilmiş yorumlar ve fikirler katılarak yazı zenginleştirilmiştir . Ayrıca tersine mühendislik (reverse engineering) üzerine yoğunlaşmış olup gereksiz bilgilerden arındırılmıştır Hadi başlayalım :)

“Çalıştırılabilir dosya” ne demektir ?

Aslında sıklıkla kullandığımız bu dosyaların nasıl çalıştığını, dosyanın yapısını bir çoğumuz bilmez. Hadi o zaman öğrenmeye başlayalım. PE ( bundan sonra Win32 de çalıştırılabilen dosyalara kısaca PE denilecektir)  bildiğimiz doğal Win32 formatıdır yani Windows işletim sisteminde çalışan çalıştırılabilir dosyaların formatıdır. Win32’de çalışan her program PE dosya formatını kullanır. (VxDs ve 16-bit DLL’ler hariç). 32 bit DLL’ler, COM dosyaları, OCX kontrolleri, Kontrol Panel Uygulamaları (.CPL dosyaları) ve .NET exe uygulamalarının hepsi PE formatındadır. Hatta NT’nin kernel modundaki sürücüleri de PE dosya formatını kullanır. Şimdi şöyle bi düşünelim eğer çalıştırılabilir dosyalarda PE format yapısı gibi bi durum olmasaydı ne olurdu ?O zaman windows yükleyicisi her programı nasıl algılayıp nasıl kullanacağını bilemediğinden bol hatalı dosyalar ve çalışmayan uygulamalarla dolup taşar ve programı yazan kişilerin PE formatını kendilerinin tanıtıp windowsun anlayabileceği dile çevirmesi gerekirdi. O yüzden bu tür problemlerden kurtulmak için PE yapısı vardır . Diyelimki herangi bir dille örneğin visual basic , assembly, Delphi v.s.. ile bir Win32 programını yazdık ve derleyicimizle derleyip çalıştırılabilir exe dosyamızı oluşturduk. İşte tam burda yani derlendiğinde aslında derleyici yazdığımız programı PE Formatına çevirir tabiki eğer bir win32 uygulaması yazıyorsak. Yine yazdığımız programa dönelim haliyle her programda olduğu gibi bu programda da datalar, veriler, değişkenler, fonksiyonlar v.s gibi elemanlarlar olacaktır. İşte derleyici bunları aşağıda anlatılacağı üzere windowsun anlayabileceği bir düzene getirir yani PE Dosya formatına ve işte aslında tam olarak olan budur .

Şimdi neden bunun hakkında bilgi sahibi olmalıyız buna bir göz atalım ? Bunu 2 ana sebepte toplayabiliriz. İlki Exe uygulamalarına kod eklemek (örneğin kod enjeksiyonu ve fonksiyon ekleme) ve ikincisi de Exe uygulama paketlerini manuel olarak açmak için.  İkincisini göz önüne aldığımızda, kapladığı yeri küçültmek ve ek bir koruma kalkanı sağlamak için pek çok shareware uygulamaları “paket” halinde gelmektedir.(packer ile sıkıştırılmış yada protector ile korunmuş)

Paket halindeki bir exe uygulamasında, import table (türkçesi dışarıdan geliş tabloları ) lar çoğunlukla bozulmuş olur ve datalarda genellikle sıkıştırma algoritmaları sebebi ile şifreli data şeklinde olabilir. Paketleyici dosyayı çalıştırmak için hafızada paketi açmak üzere bir kod ekler, ve sonra dosyanın orijinal giriş noktasına(orginal entry point-oep) atlar. (dosyanın kendi kodlarının çalışmaya başladığı nokta). Eğer packer tarafından sıkıştırılmış olan bir exe uygulaması çalıştırıldığı zaman kodlanmış olan dosyanın çalışabilmesi için bir dizi işlem gerçekleştirilir. Bu programı packerdan kurtarmak için yazılmış olan yazılımlar her zaman sonuç vermeyebilir. Böyle durumlarda işlemleri elle gerçekleştirerek programı orjinal haline çevirmemiz gerekmektedir. Bütün bunları PE formatının ne olduğunu bile bilmiyorken nasıl yapacağız?  Şu ana kadar okuduklarınız size anlaşılmaz geliyorsa aşağıda bu konulara daha geniş kapsamlı gireceğimizi belirtmek isterim

Bu yazı boyunca kullanacağım örnek exe uygulaması BASECALC.exe olacaktır; ondalık, beşlik, ikilik ve beşlik sayı sistemlerinin hesaplama ve çevirme işlemlerinde kullanılan oldukça kullanışlı bir uygulama. Bu uygulama Borland Delphi 2.0 da kodlanmıştır ve bu yüzden Borland Compiler’ların OriginalFirstThunks’ı nasıl terkettiğini göstermek için ideal bir örnektir. (ileride bu konuya daha detaylı bir biçimde değinilecektir.)

Temel Yapı :
Aşağıdaki resim bir PE dosyasının temel yapısını göstermektedir. Biraz daha açacak olursak diyelim ki hardiskimizde gezinirken herhangi bir exe dosyaya rastlayıpta acaba bunun içinde nasıl bir düzen var ki Windows bunu anlayabiliyor derseniz işte aşağıdaki tablo bu sorularınızın cevabını verir. Çünkü tüm çalıştırılabilir Win32 dosya yapısının özeti budur...

DOS MZ başlığı, DOS kütüğü, PE başlığı, Bölüm Tablosu, Section 1, Section 2, Section ….., Section n

Minimum bir dosyada PE dosyası, 2 sectiona sahip olacaktır; Kod için biri ve veri için diğeri.

Windows NT için ise önceden tanımlanmış 9 adet section vardır : .text, .bss, .rdata, .data, .rsrc, .edata, .idata, .pdata, ve .debug..

Bazı uygulamalar bu bölümlerin hepsine birden ihtiyaç duymaz, bazı uygulamalar ise kendi özgün ihtiyaçlarını giderebilmek için daha fazla bölüm tanımlayabilirler. Çalıştırılabilir dosyada genel olarak bulunan bölümler aşağıdaki gibidir.

• Çalıştırılabilir Kod Bölümü, Microsoft için .text olarak isimlendirilmiş, Borland için de CODE olarak isimlendirilmiş

• Veri Bölümleri, Microsoft için .data, .rdata veya .bss olarak isimlendirilmiş; Borlanc için DATA olarak isimlendirilmiş.

• Kaynak Bölümü, .rsrc olarak isimlendirilmiş.

• Harici Veri Bölümü, .edata olarak isimlendirilmiş.

• Dahili Veri Bölümü, .idata olarak isimlendirilmiş

• Debug Information Bölümü, .debug olarak isimlendirilmiş

İsimler OS tarafından ihmal edildiği için aslında ilgisizdir ve programcının uyum sağlayabilmesi için vardır. Önemli olan bir başka konuda bir diskteki PE dosyasının yapısı hafızaya yüklendiği haliyle aynıdır. Böylece dosyanın içine yani diskin üzerinde bilgi yerleştirdiğiniz zaman, onu dosya hafızaya yüklendikten sonra da bulabilirsiniz. Buna rağmen dosya tam anlamıyla hafızaya kopyalanmaz. Windows yükleyicisi hangi bölümün yerinin tanımlanmasına (haritalanmasına) ihtiyaç olduğunu tespit eder ve gerisini çıkartır. Yerleri tanımlanmayan veriler dosyanın sonuna, yerleri tanımlanmış olan veriler ise bölümlerin arkasına yerleştirilir. Örnek : Debug bilgisi

Bununla beraber Windows ‘un kullandığı sayfa bazındaki sanal hafıza yönetimi sebebiyle disk üzerindeki dosyadaki herhangi bir birimin lokasyonu hafızaya yüklendiği zamanki lokasyonundan farklıdır. Bölümler RAM üzerine yüklendiğinde 4 Kb’lık hafıza sayfalarına uyacak şekilde düzenlenirler ve herbir bölüm yeni bir sayfadan başlar. Sanal hafıza aşağıdaki şekilde açıklanmıştır.

Sanal hafızanın konsepti şudur : Yazılımın direkt olarak fiziksel hafızaya erişmesine izin vermek yerine işlemci ve OS ikisi arasında görünmez bir tabaka oluşturur. Hafızaya ulaşmak için yapılan her girişimde, işlemci,  hangi fiziksel hafıza adresini kullanacağını söyleyen bir “sayfa tablosu” oluşturur. Hafızanın her biti (yada byte ı) için bir tablo girdisine sahip olmak çok pratik olmayacaktır. Dolayısıyla işlemciler hafızayı sayfalara bölerler. Bunun pek çok avantajı vardır.


1) Çoklu adres boşlukları yaratma kabiliyeti kazandırır. Bir adres boşluğu sadece söz konusu program ya da prosesle ilgili olduğu durumlarda hafızaya erişime izin veren izole edilmiş bir sayfa tablosudur. Programların birbirlerinden tamamıyla izole edilmiş olmasını sağlar ve bir programın çökmesine sebep olan bir hatanın diğer programların adres boşluklarını zehirleme kabiliyetinin olmamasını sağlar.

2) İşlemcinin hafızanın nasıl erişilebilir olması gerektiğine dair kurallar oluşturmasını gerekli kılar. Bir PE dosyasında bu bölümlere ihtiyaç duyulur çünkü bir modül yüklendiğinde dosyadaki farklı alanlar hafıza yöneticisi tarafından farklı muamele görür. Yükleme süresince, hafıza yöneticisi hafıza sayfalarındaki erişim haklarını, farklı bölümler için bu bölümlerin bölüm başlığındaki ayarlarına göre düzenler. Bu herhangi bir bölümün okunabilir, yazılabilir ya da çalıştırılabilir olup olmadığını tespit eder. Bütün bunların anlamı her bölümün tipik olarak temiz bir sayfadan başlaması gerektiğini gösterir. (section)

Buna rağmen Windows’un varsayılan sayfa kapasitesi 4096 byttır. (1000h) ve sayfaları gereğinden fazla büyük kılacağından çalıştırılabilir dosyaları diskte 4Kb’lık bir sayfa sınırıyla dizmek gereksiz olacaktır.  Bu yüzden, PE başlığının iki farklı diziliş alanı vardır. Bölüm dizilimi ve dosya dizilimi. Bölüm dizilimi yukarıdaki gibi bölümlerin hafızada nasıl dizildiği ile ilgilidir. Dosya dizilimi ise (genellikle 512 byte ya da 200h) bölümlerin disk üzerindeki dosyada nasıl dizildiğiyle ilgilidir ve yükleme prosesini optimize etmek için disk sektör büyüklüğünün çarpanıdır.

3) Disk sürücü de, geçici olarak fiziksel memoride kullanılmayan sayfaları depolamak için bir sayfalama dosyası kullanılmasını sağlar. Örnek vermek gerekirse eğer bir uygulama yüklendiyse ve kullanılmıyorsa, bu uygulamanın adres boşluğu diskte RAM’e yüklenmeye ihtiyaç duyan başka bir uygulama için yer oluşturmak üzere kullanılabilir. Durum tam tersine dönerse, OS bastiçe ilk uygulamayı RAM’e yükler ve kaldığı yerden çalışmayı devam ettirebilir. Bir uygulama fiziksel olarak varolandan daha fazla hafıza kullanabilir, çünkü sistem yeterli fiziki hafıza olmadığında sabit diski ikinci bir depolama yeri olarak kullanabilir.

PE dosyaları hafızaya windows yükleyici tarafından yüklendiğinde, hafızadaki versiyon Modül olarak tanımlanır. Dosya yerleştirme sırasındaki başlangıç adresi HMODÜL olarak tanımlanır. Hafızadaki bir modül, çalışma için ihtiyaç duyulan çalıştırılabilir bir dosyadan alınan kod, veri ve kaynakları temsil eder. Proses terimi ise temel olarak böyle bir modülün çalıştırılması için kullanılabilecek izole edilmiş adres boşluğuna tekabül eder.

Diğer konularla ilgili 2.yazıda görüşmek üzere sevgiyle kalın

b1u3D4rK,darkshade,zugo,Gırgır,Caliber

hiaxi,MoNZa,mendenn

blue_devil, rvaZero

and All GencliQ CT members...

[GencliQ CT Home Page]

Bu programı kullanarak para kazanıyorsanız lütfen satın alın. Bu yazının yazılma amacı program yazanlara programlarını daha iyi korumaları konusunda yol göstermektir. Lisanssız kullanımda Dokümanı hazırlayan sorumlu değildir.
Diyeceğim şudurki: Emek verilipte yapılmış bir şeyi çalma, onu satın al.


_CC_
Web: www.trgct.com