GPT deel 2. De rol van de GPT-header in schijfintegriteit.

Inleiding

In het eerste deel van deze blogreeks onderzochten we de Protective MBR en zijn rol in het waarborgen van de compatibiliteit van moderne GPT-gepartitioneerde schijven met oudere systemen. We hebben onderzocht hoe de Protective MBR dient als barrière om te voorkomen dat oudere systemen GPT-schijven verkeerd interpreteren, waardoor de hele schijf wordt gemarkeerd als in gebruik door GPT. Deze basiskennis vormt de basis voor een diepere duik in het hart van de GUID Partition Table (GPT) zelf - de GPT Header.

In dit tweede deel zullen we de GPT Header uitpakken, een cruciaal onderdeel van het GPT schema dat vitale informatie geeft over de structuur van de schijf. We zullen elk veld binnen de GPT Header onderzoeken, de betekenis ervan uitleggen en hoe het bijdraagt aan de algemene functionaliteit en integriteit van de schijf. Aan het einde van deze post heb je een uitgebreid begrip van de GPT Header, zodat je met vertrouwen GPT-gepartitioneerde schijven kunt analyseren en manipuleren in forensische onderzoeken of gegevensherstelscenario's.

Overzicht GPT-headers

De GPT (GUID Partition Table) Header is een cruciaal onderdeel van het partitioneringssysteem van de schijf. Het verdeelt de schijf in afzonderlijke secties, die elk verschillende soorten gegevens kunnen opslaan, zoals je besturingssysteem, persoonlijke bestanden, toepassingsgegevens of games. Deze secties kunnen verschillende schijven zijn (zoals de C: schijf, D: schijf, E: schijf, etc.).

De GPT Header bevat een reservekopie aan het einde van de schijf, vergelijkbaar met het hebben van een reservesleutel voor de bibliotheekcatalogus voor het geval de hoofdsleutel verloren gaat of beschadigd raakt. Dit zorgt ervoor dat we onze gegevens kunnen vinden en openen, zelfs als er iets mis gaat.

De GPT-header geeft de locatie van zijn back-up en de locatie van de GUID Partition Table Entry Array, een lijst van GPT-partitie-ingangen die aangeven waar die secties (partities) zich op de schijf bevinden.

Figuur 1: Lay-out van een hypothetische Windows 10-installatie met één volume (n = laatste sector van de schijf)

De GPT Header begint met zijn handtekening, EFI PART. De rest van de waarden worden uitgesplitst in de onderstaande tabel:

GPT-kopstructuur

De GPT Header begint met de handtekening 'EFI PART'. De rest van de waarden worden in de onderstaande tabel uitgesplitst:

Bron: https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html

Tot nu toe blijven de eerste 16 bytes van de GPT-header constant voor verschillende GPT-schijven.

GPT-kop CRC

Hieronder staat een voorbeeld van hoe je de CRC32 voor de GPT-header berekent:

Je kunt een Python script gebruiken om de geïsoleerde bytes CRC te berekenen:

Het Python-script is te vinden op: https://github.com/eichbaumj/Python

Het Python script neemt de resulterende CRC32 waarde en converteert deze naar het formaat dat nodig is voor de GPT Header. De berekende waarde is in dit geval 0x1B2C37BC. Maar om het op te slaan in het veld binnen de GPT-header, wordt de waarde little endian gelezen: 0xBC372C1B. 

GUID schijf

De schermafbeelding hieronder toont de GUID gemarkeerd in de GPT Header:

De GUID is een hexadecimale waarde van 16 bytes, maar als je denkt dat je de waarden gewoon kunt kopiëren en ze op de juiste manier kunt scheiden met koppeltekens en er accolades omheen kunt zetten, dan heb je het mis. Je zou eindigen met de verkeerde waarde.

Je kunt zien dat HxD de GUID-conversie uitvoert in de Data Inspector rechts. Maar hoe gebeurt dat? Hoe:
55 BA 55 51 2B D8 59 41 BC 1F C4 17 80 0F D7 63

Worden:

{5155BA55-D82B-4159-BC1F-C417800FD763}

De GUID-indeling

XX XX XX | XX XX XX | XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX

55 BA 55 51 | 2B D8 | 59 41 | BC 1F | C4 17 80 0F D7 63

De eerste set van vier bytes wordt geconverteerd naar little-endian hex: 51 55 BA 55

De tweede set van 2 bytes wordt geconverteerd naar little-endian hex: D8 2B

De derde set van 2 bytes wordt geconverteerd naar little-endian hex: 59 41

De overige twee sets hexwaarden blijven zoals ze zijn, big-endian: BC 1F | C4 17 80 0F D7 63

Als alle conversies klaar zijn, kunnen we ze allemaal samenvoegen, koppeltekens plaatsen waar ze moeten staan en het geheel omsluiten met accolades:

{5155BA55-D82B-4159-BC1F-C417800FD763}

We kunnen bevestigen dat dit de juiste codering van de GUID is door diskpart te starten vanaf de commandoregel en te controleren op de uniqueid van de schijf:

GPT Partitietabel Controlesom CRC

We kunnen hetzelfde Python-script gebruiken, maar de hexadecimale waarden vervangen door de waarden in de Partition Entry Array. 

En we kunnen zien dat de waarde overeenkomt met wat er in de GPT-header staat.

Een GPT-header repareren

Oké, nu we weten hoe de GPT-header is opgebouwd en dat er een back-up is in de laatste sector van de schijf, hoe repareren we de GPT-header als deze corrupt raakt of wordt gewist?

Om de GPT-header te repareren, kopieert u de laatste 512 bytes van het einde van de schijf en plakt u ze in LBA 1 (sector #2). Merk op dat een paar aanpassingen nodig zijn.

Hieronder staat een voorbeeld van hoe de back-up GPT-header eruit ziet aan het einde van een schijf:

We kunnen zien dat sommige waarden constant blijven ten opzichte van de originele GPT-header. Deze constanten zijn hieronder rood gemarkeerd:

Er zijn vier waarden die moeten worden gewijzigd.

De eerste is de GPT Header CRC, waar we nog op terug zullen komen. Voor nu kunnen deze waarden op nul gezet worden, omdat we de CRC moeten gebruiken die berekend is nadat we de andere waarden hebben aangepast om weer de juiste te krijgen.

De volgende is de MyLBA-waarde op offset 24 voor 4 bytes. Deze waarde wijst naar de locatie van de GPT-header (waar deze zich momenteel bevindt) en de huidige positie is LBA 1 of 0x01000000000000000. 

De 8-byte waarde op offset 32 is de waarde die ons wijst naar de locatie van de back-up GPT Header. De back-up wijst momenteel naar het origineel, maar we moeten deze waarde wijzigen om de laatste sector van de schijf weer te geven. Dit is gebeurd met de hex waarden die we zojuist in de vorige stap hebben veranderd. In dit voorbeeld moet de waarde worden gewijzigd in 0xAFD23B7700000000.

De 8-byte waarde op offset 72 moet de locatie en het begin van de GPT Partition Entry Array weergeven. Momenteel wijst de back-up GPT-header naar de back-up van die array. De eigenlijke GPT Partition Array moet op LBA 2 staan. Deze waarde moet worden gewijzigd in 0x020000000000.

Met deze drie waarden veranderd, is het tijd om de CRC32 waarde te berekenen. 

De resulterende controlesom is:

Dus nu kunnen we de 0x00000000 waarden op offset 16 vervangen door 0xBC372C1B:

HxD heeft een CRC32 checksum calculator ingebouwd onder Analyse -> Checksums. De resulterende waarde hoeft alleen maar te worden toegevoegd als een little-endian waarde.

Als we uit nieuwsgierigheid die 512 bytes isoleren voor het origineel en de back-up die we hebben teruggezet, komen de hashwaarden inderdaad overeen, wat aangeeft dat we de originele GPT-header met succes hebben gereproduceerd met behulp van de back-up.

Conclusie

Het begrijpen van de fijne kneepjes van de GPT Header is essentieel voor iedereen die betrokken is bij digitaal forensisch onderzoek, gegevensherstel of systeembeheer. De GPT Header definieert niet alleen de lay-out en structuur van de schijf, maar zorgt ook voor gegevensintegriteit door mechanismen zoals CRC32-controlesommen en back-upheaders. Door de details van de GPT-header te beheersen, ben je beter uitgerust om problemen met schijven op te lossen en te repareren, waardoor de betrouwbaarheid en toegankelijkheid van kritieke gegevens wordt gegarandeerd.

Als we doorgaan met deze serie, zullen we ons richten op de GPT Partition Table Entry Array. We zullen onderzoeken hoe partitie entries zijn gestructureerd en hoe ze samenwerken met de GPT Header om de organisatie en integriteit van schijfpartities te behouden. Blijf op de hoogte voor een uitgebreide gids over het analyseren en repareren van de GPT Partition Table Entry Array, zodat je over de kennis beschikt om zelfverzekerd om te gaan met GPT-gepartitioneerde schijven.

Deel 1 gemist?

Begin bij het begin: De beschermende MBR in GPT-gepartitioneerde schijven begrijpen (deel 1) - waarin we beschrijven hoe GPT achterwaartse compatibiliteit met oudere systemen garandeert.

Klaar voor de volgende stap?

Doorgaan naar Deel 3: Navigeren door de GPT Partition Entry Array - waarin we onderzoeken hoe partitie-ingangen zijn gestructureerd en hoe ze de GPT-header aanvullen.

Facebook
Twitter
E-mail
Afdrukken

2 Reacties

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *