Portable Executable (PE) Dosya Formatı Üzerinden Statik Malware Analizi
Bu flood’da malware analizini ele alacağız. Öncelikle malware’nin ne olduğundan başlayalım.
Malware Nedir?
Bilgisayar sistemlerine zarar vermek, ayarları değiştirmek veya saldırılara açık hale getirmek amacıyla hazırlanmış olan kötü amaçlı yazılımlar genel olarak malware (malicious software) olarak adlandırılır. Saldırganlar, nihai hedefleri olan bilgisayar ve mobil cihazlara malware yükleyerek tüm kontrolü ele geçirmek için gerekli tüm altyapıyı sağlayıp amaçları doğrultusunda her işlem gerçekleştirme potansiyeline sahip olmaktadırlar.
Malware Türleri
Virüs : Virüslerin çalışması ve yayılması için aktif ana bir program ya da hali hazırda virüs bulaşmış bir işletim sistemi bulunması gerekir. Genellikle yürütülebilir dosyalara veya word belgelerine eklenirler. Bunlar genellikle P2P dosya paylaşımı veya e-posta ekleriyle yayılırlar. Kullanıcı etkinleştirilene kadar aksiyon almazlar. Etkinleştirildiğinde ise virüs çalışmaya başlar ve sistemde çoğalır.
- Makro virüsleri : Word, excell gibi makro kullanımına olanak sağlayan prgramların dosyalarına bulaşan virüslerdir.
- Boot Virüsleri : Sabit disklerin “masterbootsector” sektörlerine sıçrarlar ve çoğalarak bulaşırlar. Temizlenmesi en kolay virüslerdir.
- Komut Dosyası Virüsleri : .exe gibi çalışabilir dosyalar bulaşırşar. Birçok dosya virüsü kendilerini sistem hafızasına yükleyip sürücüdeki diğer programları araştırarak yayılır.
Worm : Solucanlar kendi kendisini kopyalayabilen ve insan yardımı olmadan çoğalabilen programlardır. Genellikle ağ bağlantısı veya indirilen bir dosya yoluyla sisteminize girdikten sonra ağ bağlantısı üzerinden yayılarak ağa bağlı tüm bilgisayar ve sunucular için potansiyel tehdit oluştururlar. Genellikle; e-posta eki olarak gönderilen dosyalarla, P2P dosya paylaşım ağları üzerinden veya FTP kaynak bağlantıları yollarıyla yayılırlar.
Trojan : Saldırganın virüslü bilgisayarın kontrolünü ele geçirmesini sağlar. Gerçek amacını saklamak için gizleme veya yanlış yönlendirme metotlarını kullanır. Dosya gönderme, alma, silme veya veri görüntülenme işlemlerine olanak sağlar. Truva atları aslında sanılanın aksine virüs değillerdir çünkü kendilerini çoğaltamazlar. Bir Truva atının yayılması için saklı bulunduğu eposta eklentisinin açılması ya da Truva atını içerir dosyanın internet üzerinden bilgisayara indirilip yürütülmesi gerekir.
Trojan-Backdoor : Bu trojan, bilgisayarda bir “arka kapı” oluşturabilir. Bir saldırganın bilgisayarınıza erişmesini ve onu kontrol etmesini sağlar. Genellikle botnet veya zombi ağ kurmak amacıyla kullanılır.
Trojan-DDOS : Bu programlar, hedeflenen web adresine DoS saldırı düzenler. Saldırı sonucunda hedefe aşırı yüklenilmesine yol açarak hizmet reddine neden olur.
Trojan-Ransomware : Para sızdırmak amacıyla geliştirilmiş yazılımlardır. Kurbanın diskinde depolanan verileri şifreleyerek bilgilere erişememesini sağladıktan sonra yapılan değişikliklerin geri alınması amacıyla bir fidye talebinde bulunulur.
Trojen-Keylogger : Bir web formuna girilen tuş vuruşlarını kaydederek kredi kartı numaraları gibi gizli bilgileri aktif olarak çalmaya çalışır.
Spyware : Bir kullanıcı hakkında bilgi toplamak ve bilgiyi kullanıcının izni olmadan başka bir varlığa göndermek için kullanılır. Casus yazılım system monitoring, truva atı, reklam yazılımı veya key logger olabilir.
Adware : Yazarı için gelir elde etmek için can sıkıcı pop-up’lar görüntüler. Kötü amaçlı yazılım, ziyaret edilen web sitelerini izleyerek kullanıcı ilgi alanlarını analiz edebilir. Daha sonra bu sitelere uygun pop-up reklamlar gönderebilir. Reklam görüntülemek ve veri toplamak dışında genellikle varlığını belli etmez.
Malware analizinden önce Portable Executable (PE) dosya formatına bir göz atmakta fayda var.
Portable Executable (PE) Dosya Formatı
PE dosyası, Windows’un çalıştırabilir dosya formatıdır. “.acm, .ax, .cpl, .dll, .drv, .efi, .exe, .mui, .ocx, .scr, .sys, .tsp” uzantılarını kapsar. PE dosya formatındaki başlıklar, dosya ile ilgili önemli bilgileri içerir.
“dll dosyaları” windows işletim sistemine ait programlar için fonksiyon kütüphaneleridir.
Öncelikle birkaç önemli terimi açıklayalım.
RVA (Relative Virtual Address) : Dosyanın içerisindeki elemanlara ulaşırken RVA kullanılır. Yani, PE formatındaki dosya, belleğe yüklendikten sonra dosya içerisindeki belli bir bölümün yükleme adresinden ne kadar uzakta olacağını belirtir. Genelde PE yapısında bulunan ImageBase elemanın belirttiği değer olur.
VA (Virtual Address) : Dosyanın hafızaya yüklendikten ve hizalama yapıldıktan sonra elimizde olan bir elemanın adresine verilen isimdir. Gerçek adres olarak düşünebilir.
VA = ImageBase + RVA
Raw Offset : Eğer dosyamız hafızada değil de diskte bulunan bir dosya ise RVA adresini değeri yerine Raw Offset değeri baz alınır.
Raw Offset = ( RVA - Sanal Offset ) + Diskteki Offset
Dos Header : PE dosya formatında geriye dönük uyumluluğu sağlamak için tutulur.
PE File Signature : Bu başlığın yanında PE imzası bulunur. Bu imza PE başlığını doğrulamak için kullanılır.
PE Image File Header : PE dosyasına ait önemli bilgileri tutar. Yapısı;
typedef struct _IMAGE_FILE_HEADER {WORD Machine // Bu alan PE dosyasının yükleneceği makinanın türünü belirtir.WORD NumberOfSections; // Bu alanda section table eleman sayısı bulunur.DWORD TimeDateStamp; // Bu alanda PE dosyasının yaratıldığı tarih bilgisi bulunur.DWORD PointerToSymbolTable; // Çalıştırılabilir dosyalar için bu kısım önemsizdir ve 0 bulunur.DWORD NumberOfSymbols; // Çalıştırılabilir dosyalar için bu kısım önemsizdir ve 0 bulunur.WORD SizeOfOptionalHeader; // Çalıştırılabilir dosyalar için bu kısım önemsizdir ve 0 bulunur.WORD Characteristics; // Bu alanda PE dosyasına ilişkin bazı özellikler bitsel olarak kodlanmıştır.
}
Yapıda gördüğümüz WORD kelimesi 16 bit ve DWORD kelimesi 32 bit tam sayıyı işaret etmektedir.
PE Image Optional Header : İlk stack boyutu, programın entry pointini, işletim sisteminin versiyonu gibi çok önemli bilgileri barındırır. “Standart Fields” ve “NT Additionals Field” olarak iki kısıma bölünmüştür.
Standart Fields :USHORT Magic; // 32bit ise 0x010b, 64bit ise 0x020b değeri bulunur.UCHAR MajorLinkerVersion; // Programın bağlayıcısının majör ve minör versiyon bilgileri bulunur.UCHAR MinorLinkerVersion; // Programın bağlayıcısının majör ve minör versiyon bilgileri bulunur.ULONG SizeOfCode; // Executable kodun boyutunu tutar.ULONG SizeOfInitializedData; // İlk değer atanmış verilerin toplam boyutunu tutar.ULONG SizeOfUninitializedData; // İlk değer atanmamış verilerin toplam boyutunu tutar.ULONG AddressOfEntryPoint; // Bu kısım executable dosyaların başlangıç noktasının RVA'sını, dll dosyalarının ise DllMain fonksiyonunun RVA'sını tutar.ULONG BaseOfCode; // Bu kısımda executable kodların olduğu bölümün RVA’sını tutar.ULONG BaseOfData; // İlk değeri atanmış verilerin bulunduğu bölümün RVA’sını tutar. NT Additional Fields:ULONG ImageBase; // Linker, PE formatının yükleneceği adresi bu kısma yazar. Genel olarak 32 bit exe için bu kısımda 0x00400000 (4MB) bulunur.ULONG SectionAlignment; // Buradaki değer bölümlerin yüklenirken nasıl bir hizalamaya uyacağını gösterir. Tipik olarak 0x00001000 (4KB) değeri bulunur.ULONG FileAlignment; // Bölümlerin diskte hangi değerin katlarına uygun şekilde sıralacağını tutar.USHORT MajorOperatingSystemVersion; & USHORT MinorOperatingSystemVersion; // Bu iki değer PE dosyasının minimum işletim sistemi versiyon bilgisini içerir.USHORT MajorImageVersion; & USHORT MinorImageVersion; // Dosyanın majör ve minör versiyon bilgisi tutulur.USHORT MajorSubsystemVersion; & USHORT MinorSubsystemVersion; // Dosyanın desteklediği majör ve minör alt sistem bilgisi tutulur.ULONG SizeOfImage; // Dosyanın bölümlerinin toplam boyutunu tutar.ULONG SizeOfHeaders; // PE headerın ve section tablosunun boyutunu bulundurur.ULONG CheckSum; // CRC checksum için ayrılmıştır bu kısım fakat genellikle 0 bulunur.USHORT Subsystem; // Kullanıcının kullanacağı arayüzü belirtir.USHORT DllCharacteristics; // DLL hakkında bazı özellikleri bitsel olarak belirtir.ULONG SizeOfStackReserve; // Program için ayrılacak Stack(yığın) boyutu.ULONG SizeOfStackCommit; // Başlangıçta stack için “commit” edilecek yığın boyutu.ULONG SizeOfHeapReserve; // Programın Heap alanı için ayrılacak miktar.ULONG SizeOfHeapCommit; // Burası ise başlangıçta “commit” edilecek heap miktarını belirtir.ULONG NumberOfRvaAndSizes; // Dosya içerisindeki veri dizininde kaç adet girdi olduğunu belirtir.
Data Directory : Veri dizini, PE formatı için önemli olan tabloların yerlerini ve uzunluklarını tutar. Bu alan 8 bayt uzunluğundaki “Image Data Directory” yapılarını içerir. Virtual Address kısmı bu dizin girdisinin gösterdiği elemanın RVA’sını içerir.
#define IMAGE_DIRECTORY_ENTRY_EXPORT 0 // Export Directory
#define IMAGE_DIRECTORY_ENTRY_IMPORT 1 // Import Directory
#define IMAGE_DIRECTORY_ENTRY_RESOURCE 2 // Resource Directory
#define IMAGE_DIRECTORY_ENTRY_EXCEPTION 3 // Exception Directory
#define IMAGE_DIRECTORY_ENTRY_SECURITY 4 // Security Directory
#define IMAGE_DIRECTORY_ENTRY_BASERELOC 5 // Base Relocation Table
#define IMAGE_DIRECTORY_ENTRY_DEBUG 6 // Debug Directory
#define IMAGE_DIRECTORY_ENTRY_ARCHITECTURE 7 // Architecture Specific Data
#define IMAGE_DIRECTORY_ENTRY_GLOBALPTR 8 // RVA of GP
#define IMAGE_DIRECTORY_ENTRY_TLS 9 // TLS Directory
#define IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG 10 // Load Configuration Directory
#define IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT 11 // Bound Import Directory in headers
#define IMAGE_DIRECTORY_ENTRY_IAT 12 // Import Address Table
#define IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT 13 // Delay Load Import Descriptors
#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor
Section Table : Bölüm tablosu headerler ve data kısımları arasında bulunur.
BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; // Section adı bulunur.DWORD PhysicalAddress; // OBJ dosyaları için bölümün fiziksel adresidir.DWORD VirtualSize; // Bölümün hafızada kapladığı yerdir.DWORD VirtualAddress; // Bölümün hafızadaki RVA'sını tutar.DWORD SizeOfRawData; // Section'un yuvarlanmış boyutunu tutar.DWORD PointerToRawData; // Bölümün diskteki offsetiDWORD PointerToRelocations; // Bölümün relocation girdilerine gösterici(0 ise girdi yok)(OBJ için)WORD NumberOfRelocations; // Bu bölüme ait toplam relocation sayısı(OBJ)DWORD Characteristics; // Section'un karakteristiğini belirler.
En çok bilinen section isimleri;
Bölüm İsmi Bölüm Tanımı
.text/CODE Çalıştırılabilir makine kodları
.data Global ve statik veriler(INIT.)
.bss Global ve statik veriler(UNINIT.)
.rsrc Kaynaklar(Resource)
.idata Import edilen fonksiyon bilgileri
.edata Export edilen fonksiyon bilgileri
.reloc Relocation bilgisi
.tls Thread Local Storage
PE dosya formatına göz attıktan sonra malware analizine başlayabiliriz.
Malware Analizi
Statik Analiz
En basit yöntem statik analizdir. İmza tabanlı yakalama veya malware içerisindeki statik değerlerin belirlenmesi gibi aşamalar içerir. Statik analiz için zararlı kodun çalıştırılması gerekmez. Bunun yerine kodda saldırgan amaçlı belirtiler incelenir. Gömülü stringler, kütüphaneler, fonksiyonlar, headerler ve meta datalar incelenir. Büyük ihtimalle malware karşımıza paketlenmiş ve okunurluğu azaltmak için obfuscate edilmiş olarak çıkacağı için unpacker yardımıyla paketten çıkarılması gerekecektir. Statik analiz aşamasında kodu çalıştırmaya gerek olmadığı için hızlı bir şekilde tamamlanabilir. Fakat, bu aşamada kodlar yorumlandığı için ileri düzey bir kod bilgisi gereklidir. İleri düzey analizde ise reverse engineering tekniğiyle assembly diline çevirilip incelenmesi gerekebilir.
Dinamik Analiz
Dinamik analiz, malware’nin güvenli bir ortamda yürütülerek etkilerinin izlenmesidir. Procss Monitor aracılığıyla malware’nin sistem üzerinde yaptığı işlem ve değişiklikleri tespit edebiliriz. Malware’nin internet üzerinde yaptığı işlemler ve C&C server ile iletişimi için sanal makine üzerinde iNetSim aracılığıyla ile dns spoof edilerek oluşturulan network simülasyonu WireShark aracılığıyla izlenir. SandBox sistem, kötü amaçlı yazılımın tüm sisteme bulaşma veya kurumsal ağa sızma riski olmadan çalışırken analiz edilmesine olanak verir. Dinamik analiz, tehdit avcılarına ve olay müdahale ekiplerine daha derin bir görünürlük sağlayarak, bir tehdidin gerçek doğasını ortaya çıkarmalarına olanak tanır. Dezavantaj olarak, bazı malware’ler sandbox’ı aldatmak için belirli koşullar karşılanana kadar hareketsiz kalabilecek kodları içlerinde saklarlar. Örneğin; VirtualBox kullanarak dinamik analiz için bir sandbox ortamı hazırladığımızda bilgisayarımızda “VirtualBoxVM.exe” adlı process çalışır. Eğer analiz edeceğimiz malware çalışan processleri listeleyip analiz ediyorsa kendini silmek veya hareketsiz kalmak gibi aksiyonlar alabilir.
Kali Linux dağıtımında msfvenom kullanılarak reverse_tcp payloadı ile .exe uzantısında oluşturduğumuz malware’yi temel statik yöntemlerle analiz edeceğiz.
Bu aşamada zararlı yazılımlar için tersine mühendislik yaparak malware analistlerine yardımcı olmak için geliştirilmiş bir Linux tabanlı dağıtımı olan Remnux işletim sistemini kullanacağız. Remnux sayesinde windows ve linux platformlarında malware analizi, karmaşıklaştırılmış JavaScript veya Flash programcıkları gibi tarayıcı tabanlı tehditlerin incelenmesi, şüpheli dosyaların (doc, pdf, exe gibi) keşfini ve diğer kötü niyetli objelerin ayrılması ayıklanması vb. işlemleri gerçekleştirebiliriz.
Antivirüs ile Taratmak : İlk adım, dosyalara virüs bulaştığından emin olmak için dosyaları her zaman antivirüslerle taramak olmalıdır. Böylece kötü amaçlı olmayan dosyayı analiz etmek için zamanımızı boşa harcamamış oluruz. VirusTotal’de tarattığımızda 52 antivirus programı tarafından kötü amaçlı olarak tespit edildiğini görüyoruz.
Detaylı çıktıyı incelediğimizde, programa ait hash değerleri, packlenirken kullanılan yazılımı ve import edilen fonksiyonları açıkça analiz edebiliriz.
Sonuçlar buradan incelenebilir : https://www.virustotal.com/gui/file/1d70ab630897df78f42be1630aee60acbcbe49e3bd0304a6204d7cfa8dd54120/summary
Hash Kontrolü : Dosyamızın md5 ve sha256 hash değerlerini alıp aynı şekilde hash tabanlı virüs taraması yapabiliriz.
Dosya Formatının İncelenmesi : Hangi araçların kullanılacağına kadar vermek amacıyla dosya türünü tespit etmemiz gerekmektedir. Dosyanın görünen uzantısına güvenilmemelidir. Bu amaçla; file, exiftool, trid, ve 7z yara gibi araçlar kullanılabilir.
Dosyamızın .exe uzantılı olduğuna karar verdikten sonra diğer adımlara geçiyoruz.
Stringlerin İncelenmesi : Stringler, genellikle yazdırılacak bir mesaj olduğunda, bir URL’ye bağlanıldığında veya bir dosyanın belirli bir konuma kopyalanması durumunda yürütülebilir dosyada bulunur. Bu yüzden string analizi için, strings komutu ile dosyamızı dizelere ayrıştırıyoruz. Çıktı, diğer bilgilerin yanı sıra, dosyanın paylaşılan kitaplıkları (yani dll’leri) ve programın dayandığı dll’lerdeki işlevleri temsil eden İçe Aktarma Adres Tablosunun (IAT) içeriğini de gösterir;
Aşağıdaki komut kullanılarak malware içerisindeki dll dosyaları daha açık bir şekilde görülebilir. Çıktıda bir çok dll dosyasının kullanıldığını tespit ediyoruz.
strings backdoor.exe | grep dll | uniq -u
Kullanacağımız diğer tool ise pestr’dir. Dosya analizinin bir parçasıdır ve birincil amacı, Windows çalıştırılabilir dosyalarından dizeleri ayıklamaktır. Bununla birlikte, bir dosyadaki ve bulunduğu bölümdeki bir dizenin offsetini gösterme seçenekleri sunar. Örneğin, aşağıda analiz edilen dosya için pestr toolu çalıştırıldıktan sonra, ilgili dizenin bulunduğu bölümü yazdırmak için section seçeneği kullanılarak çıktı alıntıları verilmiştir;
pestr --section backdoor.exe
Çıktıda, çalıştırılabilir dosyanın bir parçası olarak kabul edilmeyen simgeler, resimler vb. gibi kaynakları içeren resources section’unda tutulan nesneleri gözlemliyoruz.
Uygun Unpacker Belirlenmesi : Malware’ler ana kod sıkıştırıldıktan sonra çalıştığında sıkıştırılmış kodu memory’de çözmek için ve analizi engelleyip kafa karıştırmak için genellikle packlenir. Dosyanın packing işlemi içerdiğini belirledikten sonra unpack etmek için Debugger kullanılır. Malware’yi kendi memory içerisinden unpack edip dışarıya .exe uzantılı olarak aktarabiliriz. Pack edilmiş malware’nin hangi pack programı kullandığını bulmak için; bytehist, pepack, packerid ve pescan araçlarını kullanabiliriz.
Diğer bir işlem ise obfuscating’tir. Malware’nin anlaşılmasını zorlaştırmak için yapılan karmaşıklaştırma işlemi olarak açıklanabilir. Analiz etmeden önce malware’nin pack edilirken hangi yazılımı kullandığı belirlenmelidir.
Şifreli veya paketlenmiş verileri algılamak için bytehist kullanılır. Değiştirilmiş verilerde kullanılan bytelar eşit bir dağılıma sahiptir.
Ayrıca pescan toolu ile de packing programını tespit etmek mümkündür.
Çıktılarda malware’nin upx ile pack işlemi uygulandığını tespit ettikten sonra upx ile unpack işlemine başlıyoruz.
PEframe, PE formatlı malware ve genel şüpheli dosya üzerinde statik analiz yapmak için açık kaynaklı bir araçtır. Kötü amaçlı yazılım araştırmacılarının paketleyici, xor, dijital imza, muteks, hata ayıklama, anti-sanal makine, şüpheli bölümleri ve işlevleri ve şüpheli dosyalar hakkında çok daha fazla bilgiyi tespit etmesine yardımcı olabilir.
Çıktıda gördüğümüz Yara Plugins kısmı, zararlı yazılım tespitinde ve analizinde kullanılan bir araçtır. Özellikle zararlı yazılım analiz sürecinde, zararlı yazılımla ilgili bilgi toplamak ve analizi hızlandırmak amacıyla kullanılmaktadır.
Pyew, kötü amaçlı yazılımları analiz etmek için geliştilen bir python aracıdır. Hex görüntüleme, demontaj (Intel 16, 32 ve 64 bit), PE ve ELF dosya formatları (kod analizi yapar ve birçok analiz türü gerçekleştirmek için API kullanarak komut dosyaları yazmanıza izin verir) desteği vardır, doğrudan çağrıyı / jmp’yi takip eder ve etkileşimli komut satırındaki talimatlar, işlev adlarını ve dizi veri referanslarını görüntüler. Unpack işlemi uygulanmadan ve uygulandıktan sonra pyew çıktılarını inceleyelim.
Unpack işleminden sonra alınan çıktıda dll dosyalarının fonksiyonlarında gözle görülür şekilde artış olmuştur. Bu çıktı ile detaylı analiz yapabiliriz.
- CreateFileA , CreateFileW fonksiyonları dosya okuma ve yazma işlemleri için, connect ve closesocket fonksiyonları ağ bağlantısı açıp kapatmak için, GetVersionExA işletim sistemi versiyonun öğrenilmesi için , GetCommandLineW komut satırından komut çalıştırmak için, LoadLibraryA başka modüllerin yükleme işlemi için, TerminateProcess süreç sonlandırmak için, Freesid güvenlik tanımlayıcılarını serbest bırakmak için, ExitProcess süreçleri ve çalışan prosesleri sonlandırmak için, GetProcAddress dışarı aktarılan bir prosesin veya değişkenin adresini belirten dinamik bağlantı için, VirtualProtect çağırılan işlemin “virtual address” alanındaki kayıtlı sayfaların bir bölgesindeki korumayı değiştirmek için, _iob kontrol yapılarının dizilerini belirlemek için ve ağ bağlantısı için WSARecv fonksiyonunu kullanmıştır.
Kernel32.dll: Bellek, dosya ve donanım erişimi ve manipülasyonu gibi temek işlevleri içeren çok yaygın bir DLL’dir.
Advapi32.dll: Hizmet Yöneticisi ve kayıt defteri gibi gelişmiş çekirdek Windows bileşenlerine erişim sağlar.
WSocks32.dll ve Ws2_32.dll: Bunlar ağ DLL’leridir. Bunlardan birine erişen program büyük olasılıkla bir ağa bağlanır veya ağ ile ilgili görevleri gerçekleştirir.
Son olarak, pecheck toolu kullanarak detaylı bir çıktı elde ettik. Bu çıktıda pe dosya formatındaki tüm header bilgilerine erişebilmekteyiz.
Birkaç örnek vermek gerekirse;
- Image File Header bölümündeki Machine kısmında PE dosyasının yükleneceği makinenin türünü ve 0x014C değeri ARMv7 (or daha yukarı) olduğunu belirtir.
- Image File Header bölümündeki Characteristic kısmında PE dosyasına ilişkin bazı özellikler bitsel olarak kodlanmakla beraber 0x0100 değeri 32 bit makinenin olduğunu belirtir.
- Image Optional Header bölümündeki Magic kısmında 0x010b ve 0x20b değerleri bulunabilir. 32bit ise 0x010b, 64bit ise 0x020b değeri bulunur.
- Image Optional Header bölümündeki Image Base kısmında PE formatının yükleneceği adresi bulunur ve genel olarak 32 bit exe için bu kısımda 0x00400000 (4MB) bulunur.
- Image Optional Header bölümündeki SectionAlignment kısmında bulunan değerler bölümlerin yüklenirken nasıl bir hizalamaya uyacağını gösterir. Tipik olarak 0x00001000 (4KB) değeri bulunur. (Windowsta sayfa(page) boyutu 4KB’tır.)
- Image Optional Header bölümündeki Subsystem kısmında kullanıcıların kullanacağı arayüz belirtilir ve 2 değeri Windows’_GUI’yi işaret eder.
- Image Section Header bölümündeki Characteristic kısmında bölümün özellikleri hakkında bilgiler bulunr. Örneğin, kod mu içeriyor yoksa veri mi, bölüm yazılabilir mi veya okunabilir mi vs. 0x000040 değeri bu bölümde ilk değer verilmiş bir verinin var olduğunu belirtir.
Kaynakça: