Wprowadzenie
W pierwszej części tej serii blogów zbadaliśmy Ochronny MBR i jego rolę w zabezpieczaniu kompatybilności nowoczesnych dysków z partycjami GPT ze starszymi systemami. Zagłębiliśmy się w to, w jaki sposób Protective MBR służy jako bariera zapobiegająca błędnej interpretacji dysków GPT przez starsze systemy, zapewniając w ten sposób, że cały dysk jest oznaczony jako używany przez GPT. To fundamentalne zrozumienie stanowi podstawę do głębszego zanurzenia się w sercu samej tablicy partycji GUID (GPT) - nagłówku GPT.
W tej drugiej części rozpakujemy nagłówek GPT, kluczowy składnik schematu GPT, który dostarcza istotnych informacji o strukturze dysku. Przeanalizujemy każde pole w nagłówku GPT, wyjaśniając jego znaczenie i sposób, w jaki przyczynia się do ogólnej funkcjonalności i integralności dysku. Pod koniec tego postu będziesz miał kompleksowe zrozumienie nagłówka GPT, co pozwoli ci pewnie analizować i manipulować dyskami z partycjami GPT w dochodzeniach kryminalistycznych lub scenariuszach odzyskiwania danych.
Przegląd nagłówka GPT
Nagłówek GPT (GUID Partition Table) jest kluczowym elementem systemu partycjonowania dysku. Dzieli on dysk na oddzielne sekcje, z których każda może przechowywać różne typy danych, takie jak system operacyjny, pliki osobiste, dane aplikacji lub gry. Sekcje te mogą być różnymi dyskami (takimi jak dysk C:, dysk D:, dysk E: itp.).
Nagłówek GPT zawiera kopię zapasową na końcu dysku, podobnie jak posiadanie zapasowego klucza do katalogu biblioteki na wypadek zgubienia lub uszkodzenia głównego. Gwarantuje to, że możemy znaleźć i uzyskać dostęp do naszych danych, nawet jeśli coś pójdzie nie tak.
Nagłówek GPT zapewnia lokalizację kopii zapasowej i lokalizację tablicy wpisów tabeli partycji GUID, która jest listą wpisów partycji GPT wskazujących, gdzie te sekcje (partycje) znajdują się na dysku.

Rysunek 1: Układ hipotetycznej instalacji systemu Windows 10 z jednym woluminem (n = ostatni sektor dysku)
Nagłówek GPT zaczyna się od podpisu EFI PART. Pozostałe wartości zostały przedstawione w poniższej tabeli:
Struktura nagłówka GPT
Nagłówek GPT rozpoczyna się od podpisu "EFI PART." Pozostałe wartości zostały przedstawione w poniższej tabeli:


Źródło: https://uefi.org/specs/UEFI/2.10/05_GUID_Partition_Table_Format.html

Jak dotąd, pierwsze 16 bajtów nagłówka GPT pozostanie niezmienne na różnych dyskach GPT.
Nagłówek GPT CRC

Poniżej znajduje się przykład obliczania CRC32 dla nagłówka GPT:

Do obliczenia CRC izolowanych bajtów można użyć skryptu Python:

Skrypt Pythona można znaleźć pod adresem: https://github.com/eichbaumj/Python

Skrypt Pythona pobierze wynikową wartość CRC32 i przekonwertuje ją na format wymagany dla nagłówka GPT. Obliczona wartość w tym przypadku wynosi 0x1B2C37BC. Ale aby zapisać ją w polu w nagłówku GPT, wartość jest odczytywana w formacie little endian: 0xBC372C1B.

Identyfikator GUID dysku

Poniższy zrzut ekranu pokazuje identyfikator GUID podświetlony w nagłówku GPT:

Identyfikator GUID to 16-bajtowa wartość szesnastkowa, ale jeśli myślisz, że możesz po prostu skopiować wartości i oddzielić je odpowiednio myślnikami i nawiasami klamrowymi wokół nich, to się mylisz. Otrzymałbyś nieprawidłową wartość.
Możesz zobaczyć, że HxD zapewnia konwersję GUID w Inspektorze danych po prawej stronie. Ale jak to się dzieje? W jaki sposób:
55 BA 55 51 2B D8 59 41 BC 1F C4 17 80 0F D7 63
Stać się:
{5155BA55-D82B-4159-BC1F-C417800FD763}
Format GUID
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
Pierwszy zestaw czterech bajtów jest konwertowany do postaci hex little-endian: 51 55 BA 55
Drugi zestaw 2 bajtów jest konwertowany do formatu little-endian hex: D8 2B
Trzeci zestaw 2 bajtów jest konwertowany na szesnastkowy little-endian: 59 41
Pozostałe dwa zestawy wartości szesnastkowych pozostają bez zmian, big-endian: BC 1F | C4 17 80 0F D7 63
Po zakończeniu wszystkich konwersji możemy je wszystkie połączyć, umieszczając myślniki tam, gdzie są potrzebne i zamykając je w nawiasach klamrowych:
{5155BA55-D82B-4159-BC1F-C417800FD763}
Możemy potwierdzić, że jest to prawidłowe kodowanie GUID, uruchamiając diskpart z wiersza poleceń i sprawdzając unikalny identyfikator dysku:


Suma kontrolna CRC tablicy partycji GPT

Możemy użyć tego samego skryptu Pythona, ale zastąpić wartości szesnastkowe wartościami znalezionymi w tablicy wpisów partycji.



Widzimy, że wartość odpowiada temu, co znajduje się w nagłówku GPT.
Naprawianie nagłówka GPT
Ok, skoro wiemy już, jak zbudowany jest nagłówek GPT i że w ostatnim sektorze dysku znajduje się kopia zapasowa, jak naprawić nagłówek GPT w przypadku jego uszkodzenia lub wymazania?
Aby naprawić nagłówek GPT, skopiuj ostatnie 512 bajtów z końca dysku i wklej je do LBA 1 (sektor #2). Należy pamiętać, że konieczne jest wprowadzenie kilku modyfikacji.
Poniżej znajduje się przykład tego, jak wygląda nagłówek kopii zapasowej GPT na końcu dysku:

Widzimy, że niektóre wartości pozostają stałe w porównaniu do oryginalnego nagłówka GPT. Te stałe są zaznaczone na czerwono poniżej:

Istnieją cztery wartości, które należy zmienić.
Pierwszą z nich jest CRC nagłówka GPT, do którego jeszcze wrócimy. Na razie wartości te można wyzerować, ponieważ będziemy musieli użyć CRC obliczonego po zmodyfikowaniu innych wartości, aby ponownie uzyskać prawidłową wartość.

Następna jest wartość MyLBA znajdująca się na offsecie 24 dla 4 bajtów. Wartość ta wskazuje na lokalizację nagłówka GPT (gdzie aktualnie się znajduje), a jej aktualna pozycja to LBA 1 lub 0x01000000000000000.

8-bajtowa wartość przy przesunięciu 32 to wartość, która wskazuje nam lokalizację zapasowego nagłówka GPT. Kopia zapasowa wskazuje obecnie na oryginał, ale musimy zmienić tę wartość, aby reprezentowała ostatni sektor dysku. Stało się tak z wartościami szesnastkowymi, które właśnie zmieniliśmy w poprzednim kroku. W tym przykładzie wartość należałoby zmienić na 0xAFD23B7700000000.

8-bajtowa wartość znajdująca się przy przesunięciu 72 musi odzwierciedlać lokalizację i początek tablicy wpisów partycji GPT. Obecnie nagłówek kopii zapasowej GPT wskazuje na kopię zapasową tej tablicy. Rzeczywista tablica partycji GPT powinna znajdować się w LBA 2. Wartość ta musi zostać zmieniona na 0x0200000000000000.

Po zmianie tych trzech wartości nadszedł czas na obliczenie wartości CRC32.
Wynikowa suma kontrolna to:

Teraz możemy zastąpić wartości 0x00000000 przy przesunięciu 16 wartością 0xBC372C1B:

HxD ma wbudowany kalkulator sumy kontrolnej CRC32 w Analiza -> Sumy kontrolne. Wartość wynikowa musi być dodana jako wartość little-endian.
Dla ciekawości, gdybyśmy mieli wyizolować te 512 bajtów dla oryginału i kopii zapasowej, którą przywróciliśmy, wartości hash rzeczywiście pasują, wskazując, że pomyślnie odtworzyliśmy oryginalny nagłówek GPT przy użyciu kopii zapasowej.

Wnioski
Zrozumienie zawiłości nagłówka GPT jest niezbędne dla każdego, kto zajmuje się kryminalistyką cyfrową, odzyskiwaniem danych lub administracją systemu. Nagłówek GPT nie tylko definiuje układ i strukturę dysku, ale także zapewnia integralność danych poprzez mechanizmy takie jak sumy kontrolne CRC32 i nagłówki kopii zapasowych. Opanowując szczegóły nagłówka GPT, jesteś lepiej przygotowany do rozwiązywania i naprawiania problemów z dyskami, zapewniając niezawodność i dostępność krytycznych danych.
Kontynuując tę serię, skupimy się na tablicy wpisów tabeli partycji GPT. Zbadamy, w jaki sposób wpisy partycji są ustrukturyzowane i jak współpracują z nagłówkiem GPT w celu utrzymania organizacji i integralności partycji dyskowych. Bądź na bieżąco z kompleksowym przewodnikiem na temat analizowania i naprawiania tablicy wpisów tabeli partycji GPT, co jeszcze bardziej wzmocni twoją wiedzę, aby pewnie obsługiwać dyski z partycjami GPT.
Przegapiłeś część 1?
Zacznij od początku: Zrozumienie ochronnego MBR na dyskach z partycjami GPT (część 1) - gdzie opisujemy, w jaki sposób GPT zapewnia wsteczną kompatybilność ze starszymi systemami.
Gotowy na kolejny krok?
Kontynuować Część 3: Poruszanie się po tablicy wpisów partycji GPT - gdzie badamy strukturę wpisów partycji i sposób, w jaki uzupełniają one nagłówek GPT.
2 Odpowiedzi
Świetne strony (ta i część 1).
Wielkie dzięki!