Skip to content

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:

  1. DOS Header

  2. DOS Stub

  3. PE File Header

  4. Image Optional Header

  5. Data Dictionaries

  6. Section Table

  7. 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

  1. Check starten af filen → Skal starte med "MZ"

  2. Find PE signatur → Søg efter "PE" senere i filen

  3. 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 5A i 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 00 i 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 0x00400000 for .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

  1. Malware analyse: Identificer hvad filen potentielt gør via imports

  2. Entry point: Find hvor koden starter execution

  3. Packing detection: Spot obfuscerede/packede filer

  4. 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.