Murat ERDEM - Personal Research Blog




PE Files - 0x01

July 14, 2020

Bu serimizde windows yürütülebilir dosyası olan PE headerine sahip dosyaların ne işe yaradığı çalışma mantıkları, yapısının nasıl olduğu ve nasıl parçalayabileceğimiz gibi konuları ele alacağız.

Öncelikle windows işletim sistemlerinde çalışan bu yürütülebilir dosyalar üzerinde çift tıklandığında belirli işlemleri gerçekleştirmek amacıyla programlanırlar. Biz bu yazımızda bintext.exe uygulaması üzerinden PE dosyalarını anlamaya çalışacağız. Öncelikle bintext uygulaması bir dosya içerisindeki string ifadelerini çıkarmak için kullanılır.

Dosya yapılarına geçmeden önce PE dosyalarında çok kullanacağımız bazı temel terimler ve önemli bir araçtan bahsetmekte fayda var.

CFF Explorer

Bir exe dosyasının genel bilgisini almak için bir çok farklı araç kullanabiliriz CFF Explorer benim en çok kullandığım araçtır. Kendisi bir PE dosyası üzeride genel bilgileri, section bilgilerini ve kullanılan API bilgileri gibi bir çok bilgi sağlamaktadır. Bizim bu serimizde bu alanların ne anlama geldiklerini ve bilgilerin nasıl elde edildikleri konusuna değineceğiz.

Adresleme Methodu

PE dosyaları üzerinde çift tıklanıldığı andan itibaren sistem üzeriden hafızaya yüklenerek çalışmaya başlarlar. Burada önemli olan kısım bir dosyanın hafızada nasıl konumlandırılacağıdır.

PE dosyaları içerisinde bulunan ve hangi adrese yükleneceğini gösteren adresler RVA (Relative Virual Address) adreslerdir. ve gerçek adresleri göstermezler. Göreceli adres olarak bilinirler ve değişkenlik gösterirler. RVA adresler sadece ilgili bölümün PE dosyamızın hafızaya yüklendiği başlangıç adresine olan uzaklığını gösterirler.

Bir uygulamanın hafızaya yüklendiği başlangıç adresi Image Base olarak adlandırılır ve bu adres kesinlik olmamak ile birlikte genel olarak 0x00400000 adresidir. PE dosyası içerisindeki bir adres hafıza üzerinde yüklendiğinde gerçek bir adrese yazılmış olur ve bu adrese VA (Virtual Address) denir. Bu adres Image Base adres ile RVA adresin toplamına eşittir. Bu işleme küçük bir örnek vermek gerekirse aşağıdaki resimde .text sectionun virtual adresi 0x1000 olarak görünmekte ancak bu adres aslında RVA adresidir. Uygulamayı hafızaya yükledikten sonra konumuna baktığımızda adresin 0x00401000 olduğunu görmekteyiz.

(RVA adresi 0x1000)

(VA adresi 0x00401000)

Resimde ayrıca hafızada Image Base adres değerinin söylediğimiz gibi 0x00400000 olduğunu görmekteyiz. Bu adrese RVA adresi olan 0x1000 değerini toplarsak hafızada görmekte olduğumuz VA adresi olan 0x00401000 değerine ulaşabiliriz.