Dissecting PE headers
Hvad er "PE Headers"?
PE (Portable Executable) formatet er strukturen for eksekverbare filer i Windows. Det definerer hvordan programmer er organiseret og hvordan Windows indlæser dem.
PE-formatet består af: - PE (Portable Executable) filer
- COFF (Common Object File Format) filer
PE-struktur - De 7 Komponenter
PE-filer er opdelt i syv hovedkomponenter:
-
DOS Header
-
DOS Stub
-
PE File Header
-
Image Optional Header
-
Data Dictionaries
-
Section Table
-
Sections
1. DOS Header
Formål: Identificerer filen som en eksekverbar fil.
Kendetegn: - Starter med "MZ" signatur
-
MZ står for Mark Zbikowski (en af udviklerne af MS-DOS)
-
Definerer filformatet som
.exe
2. DOS Stub
Formål: Et lille program der printer en besked hvis filen køres i DOS.
Funktionalitet: - Viser beskeden: "This program cannot be run in DOS mode"
-
Påvirker ikke moderne Windows-programmer
-
Bruges kun til baglænskompatibilitet
Når Windows-programmer blev udviklet, skulle de stadig være baglæns kompatible med DOS. Derfor har moderne .exe filer stadig:
-
DOS Header - så DOS kan genkende filen
-
Et DOS Stub
Dette betyder at hvis nogen forsøger at køre et Windows-program i det gamle DOS, får de en pæn fejlbesked i stedet for et crash.
3. PE File Header
Formål: Hovedinformation om den binære fil.
Indeholder: - PE signatur (identificerer det som en PE-fil)
-
Maskinarkitektur (x86, x64, ARM, etc.)
-
Antal sektioner i filen
-
Tidsstempel for hvornår filen blev kompileret
-
Størrelse på optional header
4. Image Optional Header
Formål: Vigtig information om hvordan programmet skal køres.
Vigtigt: På trods af navnet "Optional" er denne header påkrævet!
Indeholder: - Entry point - Hvor programmet starter eksekvering
-
Image base - Hvor filen indlæses i hukommelsen
-
Alignment - Hvordan sektioner justeres
-
Subsystem - GUI eller Console program
-
DLL karakteristika - Om det er en DLL, ASLR support, etc.
5. Data Dictionaries
Formål: Pointere til vigtige datastrukturer i programmet.
Eksempler på directories: - Import Directory - hvilke DLLs og funktioner programmet bruger
-
Export Directory - hvilke funktioner programmet eksporterer
-
Resource Directory - billeder, ikoner, strenge
-
Debug Directory - debug information
-
TLS Directory - Thread Local Storage
-
Relocation Table - til ASLR (Address Space Layout Randomization)
6. Section Table
Formål: Indeholder information om alle sektioner i filen.
For hver sektion gemmes: - Sektionens navn
-
Størrelse
-
Placering i filen
-
Placering i hukommelsen
-
Permissions (readable, writeable, executable)
7. Sections (Sektioner)
Sektioner indeholder det faktiske indhold af programmet.
Almindelige Sektioner
| Sektion | Indhold |
|---|---|
| .text | Programmets eksekverbare kode |
| .data | Initialiserede variabler og data |
| .rdata | Readonly data og imports (Windows APIs) |
| .rsrc | Ressourcer (ikoner, billeder, strenge) |
| .reloc | Relocation information til ASLR |
| .debug | Debug information |
Sektion Permissions
Typiske permissions:
- .text → Læsbar og eksekverbar
-
.data→ Læsbar og skrivbar -
.rdata→ Kun læsbar -
.rsrc→ Kun læsbar
Visuel Oversigt
┌─────────────────────────────────┐
│ DOS Header (MZ) │ Identificerer .exe
├─────────────────────────────────┤
│ DOS Stub │ DOS fejlbesked
├─────────────────────────────────┤
│ PE Signature (PE) │ Identificerer PE format
├─────────────────────────────────┤
│ PE File Header │ Filinfo og arkitektur
├─────────────────────────────────┤
│ Image Optional Header │ Entry point, image base
├─────────────────────────────────┤
│ Data Dictionaries │ Pointere til imports, etc.
├─────────────────────────────────┤
│ Section Table │ Beskriver sektioner
├─────────────────────────────────┤
│ .text │ Eksekverbar kode
├─────────────────────────────────┤
│ .data │ Data og variabler
├─────────────────────────────────┤
│ .rdata │ Imports og readonly data
├─────────────────────────────────┤
│ .rsrc │ Ressourcer
├─────────────────────────────────┤
│ .reloc │ Relocation data
└─────────────────────────────────┘
Hvordan Identificere PE-filer
-
Check starten af filen → Skal starte med "MZ"
-
Find PE signatur → Søg efter "PE" senere i filen
-
Læs Section Table → Find sektion navne som
.text,.data, etc.
Malware Analyse Tips
Mistænkelige tegn: - Usædvanlige sektion navne (ikke standard Windows navne)
-
Sektioner der både er skrivbare OG eksekverbare
-
Store resource sektioner (kan gemme malware payloads)
-
Mistænkelige imports (process injection, keylogging APIs)
-
Pakket eller obfuskeret kode
Normale tegn: - Standard sektion navne (.text, .data, .rdata, .rsrc)
-
Normale Windows API imports
-
Digital signatur fra kendt udgiver
Tilbage til "Dissecting PE Headers"
Hvad er PE Files?
-
PE = Portable Executable - Windows' eksekverbare filer (.exe, .dll)
-
Baseret på COFF (Common Object File Format)
-
Alle headers er af typen STRUCT (C-strukturer)
IMAGE_DOS_HEADER (64 bytes)
-
De første 64 bytes af en PE fil
-
MZ signature (
4D 5Ai hex): - Står for Mark Zbikowski (Microsoft arkitekt)
-
Identificerer filen som PE format
-
e_lfanew: Indeholder adressen hvor IMAGE_NT_HEADERS starter
-
DOS_STUB: Viser "This program cannot be run in DOS mode" hvis kørt i forkert miljø
IMAGE_NT_HEADERS
Består af tre dele:
1. Signature
-
50 45 00 00i hex = "PE" i ASCII -
Markerer start på NT headers
2. FILE_HEADER
-
Machine: Arkitektur (i386 = 32-bit, x64 = 64-bit)
-
NumberOfSections: Antal sektioner i filen
-
TimeDateStamp: Hvornår binæren blev kompileret
-
SizeOfOptionalHeader: Størrelsen på optional header (typisk 224 bytes)
-
Characteristics: Filens egenskaber (32/64-bit, executable, etc.)
3. OPTIONAL_HEADER
-
Magic:
0x010B= 32-bit,0x020B= 64-bit -
AddressOfEntryPoint: Hvor execution starter (RVA)
-
ImageBase: Foretrukken load-adresse (typisk
0x00400000for .exe) -
Subsystem: GUI, CUI, eller Native
-
DataDirectory: Import/Export information (IAT/EAT)
IMAGE_SECTION_HEADER
Sektioner hvor kode og data ligger:
-
.text: Eksekverbar kode (READ + EXECUTE)
-
.data: Initialiseret data (READ + WRITE)
-
.rdata/.idata: Import information
-
.rsrc: Resources (ikoner, UI elementer)
-
.reloc: Relokationsinformation
Vigtige felter: - VirtualAddress: RVA i hukommelsen
-
VirtualSize: Størrelse når loaded i memory
-
SizeOfRawData: Størrelse på disk
-
Characteristics: Permissions (READ/WRITE/EXECUTE)
IMAGE_IMPORT_DESCRIPTOR
-
Viser hvilke Windows API funktioner filen importerer
-
Eksempel:
CreateFile,RegCreateKeyEx,WriteFile -
Bruges til at identificere filens potentielle adfærd
-
Import fra DLL'er som: kernel32.dll, user32.dll, advapi32.dll
Packed Executables
Indicators på packing: - Usædvanlige eller tomme section navne
-
Høj entropy (tæt på 8.0) = meget tilfældig/obfusceret data
-
Flere sections med EXECUTE permissions
-
SizeOfRawData<<VirtualSize(stor forskel) -
Meget få imports (ofte kun GetProcAddress, LoadLibraryA, GetModuleHandleA)
Nyttige Tools
-
pe-tree: Grafisk PE analyse tool
-
pecheck: Command-line PE analyse
-
wxHexEditor: Hex editor til at se rå bytes
-
Endianness: Husk at Intel x86 bruger little-endian (bytes vendes om)
Praktisk Anvendelse
-
Malware analyse: Identificer hvad filen potentielt gør via imports
-
Entry point: Find hvor koden starter execution
-
Packing detection: Spot obfuscerede/packede filer
-
Static analysis: Analyser uden at køre filen
Sources
https://tryhackme.com/room/dissectingpeheaders
Bemærkning
Noterne er struktureret og rettet med hjælp af LLM'en Claude.