PE Format
Ta specyfikacja opisuje strukturę plików wykonywalnych (obrazów) i plików obiektów w rodzinie systemów operacyjnych Windows. Te pliki są określane odpowiednio jako pliki przenośnego pliku wykonywalnego (PE) i Common Object File Format (COFF).
Nuta
Ten dokument jest dostarczany w celu pomocy w tworzeniu narzędzi i aplikacji dla systemu Windows, ale nie gwarantuje pełnej specyfikacji we wszystkich kwestiach. Firma Microsoft zastrzega sobie prawo do zmiany tego dokumentu bez powiadomienia.
Ta poprawka specyfikacji microsoft Portable Wykonywalny i Common Object File Format zastępuje wszystkie poprzednie poprawki tej specyfikacji.
Ogólne pojęcia
Ten dokument określa strukturę plików wykonywalnych (obrazów) i plików obiektów w rodzinie systemów operacyjnych Microsoft Windows. Te pliki są określane odpowiednio jako pliki przenośnego pliku wykonywalnego (PE) i Common Object File Format (COFF). Nazwa "Przenośny plik wykonywalny" odnosi się do faktu, że format nie jest specyficzny dla architektury.
Niektóre pojęcia, które pojawiają się w tej specyfikacji, zostały opisane w poniższej tabeli:
Nazwa | Opis |
---|---|
certyfikat atrybutu |
Certyfikat używany do kojarzenia weryfikowalnych instrukcji z obrazem. Z plikiem można skojarzyć wiele różnych instrukcji weryfikowalnych; jedną z najbardziej przydatnych jest instrukcja producenta oprogramowania, która wskazuje, jaki komunikat ma być szyfrowany przez obraz. Skrót komunikatu jest podobny do sumy kontrolnej, z tą różnicą, że jest bardzo trudne do utworzenia. W związku z tym bardzo trudno jest zmodyfikować plik tak, aby miał ten sam skrót komunikatu co oryginalny plik. Instrukcję można zweryfikować jako wykonywaną przez producenta przy użyciu schematów kryptograficznych kluczy publicznych lub prywatnych. W tym dokumencie opisano szczegółowe informacje o certyfikatach atrybutów innych niż zezwalanie na ich wstawianie do plików obrazów. |
sygnatura daty/godziny |
Sygnatura używana do różnych celów w kilku miejscach w pliku PE lub COFF. W większości przypadków format każdej sygnatury jest taki sam jak używany przez funkcje czasu w bibliotece czasu języka C. Aby uzyskać wyjątki, zobacz deskrypcję IMAGE_DEBUG_TYPE_REPRO w Typ debugowania. Jeśli wartość sygnatury wynosi 0 lub 0xFFFFFFFF, nie reprezentuje rzeczywistej ani znaczącej sygnatury daty/godziny. |
wskaźnik pliku |
Lokalizacja elementu w samym pliku przed przetworzeniem przez konsolidator (w przypadku plików obiektów) lub moduł ładujący (w przypadku plików obrazów). Innymi słowy, jest to pozycja w pliku przechowywanym na dysku. |
konsolidator |
Odwołanie do konsolidatora dostarczonego z programem Microsoft Visual Studio. |
plik obiektu |
Plik, który jest podawany jako dane wejściowe konsolidatora. Konsolidator tworzy plik obrazu, który z kolei jest używany jako dane wejściowe przez moduł ładujący. Termin "plik obiektu" nie musi oznaczać żadnego połączenia z programowaniem obiektowym. |
zarezerwowane, musi mieć wartość 0 |
Opis pola, który wskazuje, że wartość pola musi być równa zero dla generatorów, a konsumenci muszą zignorować pole. |
Względny adres wirtualny (RVA) |
W pliku obrazu jest to adres elementu po załadowaniu go do pamięci, z podstawowym adresem pliku obrazu odjętym od niego. RVA elementu prawie zawsze różni się od jego położenia w pliku na dysku (wskaźnik pliku). W pliku obiektu funkcja RVA jest mniej zrozumiała, ponieważ lokalizacje pamięci nie są przypisane. W takim przypadku adres RVA będzie adresem w sekcji (opisanej w dalszej części tej tabeli), do której relokacja zostanie później zastosowana podczas łączenia. Dla uproszczenia kompilator powinien po prostu ustawić pierwszą wartość RVA w każdej sekcji na zero. |
sekcja |
Podstawowa jednostka kodu lub danych w pliku PE lub COFF. Na przykład cały kod w pliku obiektu można połączyć w jednej sekcji lub (w zależności od zachowania kompilatora) każda funkcja może zajmować własną sekcję. W przypadku większej liczby sekcji jest więcej obciążeń związanych z plikami, ale konsolidator jest w stanie łączyć się w kodzie bardziej selektywnie. Sekcja jest podobna do segmentu w architekturze intel 8086. Wszystkie nieprzetworzone dane w sekcji muszą być ładowane w sposób ciągły. Ponadto plik obrazu może zawierać wiele sekcji, takich jak .tls lub .reloc , które mają specjalne cele. |
Adres wirtualny (VA) |
Tak samo jak RVA, z tą różnicą, że podstawowy adres pliku obrazu nie jest odejmowany. Adres jest nazywany va, ponieważ system Windows tworzy odrębną przestrzeń va dla każdego procesu, niezależnie od pamięci fizycznej. W prawie wszystkich celach va należy uznać za tylko adres. Va nie jest tak przewidywalna jak RVA, ponieważ moduł ładujący może nie załadować obrazu w preferowanej lokalizacji. |
Przegląd
Poniższa lista zawiera opis formatu wykonywalnego microsoft PE z bazą nagłówka obrazu u góry. Sekcja z nagłówka exe zgodnego z MS-DOS 2.0 do nieużywanej sekcji tuż przed nagłówka PE jest sekcją MS-DOS 2.0 i jest używana tylko do MS-DOS zgodności.
nagłówek EXE zgodny z MS-DOS 2.0
Nieużywane
Identyfikator producenta OEM
Informacje o OEM
Przesunięcie do nagłówka PE
MS-DOS 2.0, program wycinkowy i tabela relokacji
Nieużywane
Nagłówek PE (wyrównany do granicy 8-bajtowej)
Nagłówki sekcji
Strony obrazów:
importowanie informacji
informacje o eksportowaniu
relokacje podstawowe
informacje o zasobie
Poniższa lista zawiera opis formatu modułu obiektów MICROSOFT COFF:
Nagłówek Microsoft COFF
Nagłówki sekcji
Dane pierwotne:
kod
dane
informacje o debugowaniu
relokacje
Nagłówki plików
- MS-DOS wycinków (tylko obraz)
- Signature (tylko obraz)
-
nagłówka pliku COFF (obiekt i obraz)
- typy maszyn
- właściwości
- opcjonalny nagłówek (tylko obraz)
Nagłówek pliku PE składa się z wycinków microsoft MS-DOS, podpisu PE, nagłówka pliku COFF i opcjonalnego nagłówka. Nagłówek pliku obiektu COFF składa się z nagłówka pliku COFF i opcjonalnego nagłówka. W obu przypadkach nagłówki plików są natychmiast obserwowane przez nagłówki sekcji.
MS-DOS wycinków (tylko obraz)
MS-DOS jest prawidłową aplikacją działającą w obszarze MS-DOS. Znajduje się on na początku obrazu EXE. Konsolidator umieszcza w tym miejscu domyślny wycink, który wyświetla komunikat "Nie można uruchomić tego programu w trybie SYSTEMU DOS", gdy obraz jest uruchamiany w ms-DOS. Użytkownik może określić inny wycinkę za pomocą opcji /STUB konsolidatora.
W lokalizacji 0x3c wycinku plik jest przesunięty do podpisu PE. Te informacje umożliwiają systemowi Windows prawidłowe wykonanie pliku obrazu, mimo że ma MS-DOS wycinków. To przesunięcie pliku jest umieszczane w lokalizacji 0x3c podczas łączenia.
Podpis (tylko obraz)
Po MS-DOS wycinku, podczas przesunięcia pliku określonego w 0x3c przesunięcia, jest podpisem 4-bajtowym, który identyfikuje plik jako plik obrazu w formacie PE. Ten podpis to "PE\0\0" (litery "P" i "E", po których następują dwa bajty o wartości null).
Nagłówek pliku COFF (obiekt i obraz)
Na początku pliku obiektu lub bezpośrednio po podpisie pliku obrazu jest standardowym nagłówkiem pliku COFF w następującym formacie. Należy pamiętać, że moduł ładujący systemu Windows ogranicza liczbę sekcji do 96.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
2 |
Maszyna |
Liczba identyfikująca typ maszyny docelowej. Aby uzyskać więcej informacji, zobacz Typy maszyn. |
2 |
2 |
NumberOfSections |
Liczba sekcji. Wskazuje to rozmiar tabeli sekcji, który jest bezpośrednio zgodny z nagłówkami. |
4 |
4 |
TimeDateStamp |
Niska liczba 32 bitów liczby sekund od 00:00 1 stycznia 1970 r. (wartość czasu wykonywania C time_t), która wskazuje, kiedy plik został utworzony. |
8 |
4 |
PointerToSymbolTable |
Przesunięcie pliku tabeli symboli COFF lub zero, jeśli nie ma tabeli symboli COFF. Ta wartość powinna być równa zero dla obrazu, ponieważ informacje debugowania COFF są przestarzałe. |
12 |
4 |
NumberOfSymbols |
Liczba wpisów w tabeli symboli. Te dane mogą służyć do lokalizowania tabeli ciągów, która natychmiast następuje po tabeli symboli. Ta wartość powinna być równa zero dla obrazu, ponieważ informacje debugowania COFF są przestarzałe. |
16 |
2 |
SizeOfOptionalHeader |
Rozmiar opcjonalnego nagłówka, który jest wymagany dla plików wykonywalnych, ale nie dla plików obiektów. Ta wartość powinna być równa zero dla pliku obiektu. Aby uzyskać opis formatu nagłówka, zobacz Opcjonalny nagłówek (tylko obraz). |
18 |
2 |
Charakterystyka |
Flagi wskazujące atrybuty pliku. Aby uzyskać informacje o określonych wartościach flagi, zobacz Characteristics. |
Typy maszyn
Pole Maszyna ma jedną z następujących wartości, które określają typ procesora CPU. Plik obrazu można uruchomić tylko na określonej maszynie lub w systemie, który emuluje określoną maszynę.
Stały | Wartość | Opis |
---|---|---|
IMAGE_FILE_MACHINE_UNKNOWN |
0x0 |
Zakłada się, że zawartość tego pola ma zastosowanie do dowolnego typu komputera |
IMAGE_FILE_MACHINE_ALPHA |
0x184 |
Alfa AXP, 32-bitowa przestrzeń adresowa |
IMAGE_FILE_MACHINE_ALPHA64 |
0x284 |
Alfa 64, 64-bitowa przestrzeń adresowa |
IMAGE_FILE_MACHINE_AM33 |
0x1d3 |
Matsushita AM33 |
IMAGE_FILE_MACHINE_AMD64 |
0x8664 |
x64 |
IMAGE_FILE_MACHINE_ARM |
0x1c0 |
Mały endian ARM |
IMAGE_FILE_MACHINE_ARM64 |
0xaa64 |
Arm64 little endian |
IMAGE_FILE_MACHINE_ARMNT |
0x1c4 |
Arm Thumb-2 little endian |
IMAGE_FILE_MACHINE_AXP64 |
0x284 |
AXP 64 (taki sam jak Alfa 64) |
IMAGE_FILE_MACHINE_EBC |
0xebc |
Kod bajtowy EFI |
IMAGE_FILE_MACHINE_I386 |
0x14c |
Procesory Intel 386 lub nowsze i zgodne procesory |
IMAGE_FILE_MACHINE_IA64 |
0x200 |
Rodzina procesorów Intel Itanium |
IMAGE_FILE_MACHINE_LOONGARCH32 |
0x6232 |
Rodzina procesorów LoongArch 32-bitowych |
IMAGE_FILE_MACHINE_LOONGARCH64 |
0x6264 |
Rodzina procesorów LoongArch 64-bitowych |
IMAGE_FILE_MACHINE_M32R |
0x9041 |
Mitsubishi M32R mały endian |
IMAGE_FILE_MACHINE_MIPS16 |
0x266 |
MIPS16 |
IMAGE_FILE_MACHINE_MIPSFPU |
0x366 |
MIPS z układem FPU |
IMAGE_FILE_MACHINE_MIPSFPU16 |
0x466 |
MIPS16 z układem FPU |
IMAGE_FILE_MACHINE_POWERPC |
0x1f0 |
Power PC little endian |
IMAGE_FILE_MACHINE_POWERPCFP |
0x1f1 |
Power PC z obsługą zmiennoprzecinkowa |
IMAGE_FILE_MACHINE_R4000 |
0x166 |
MIPS little endian |
IMAGE_FILE_MACHINE_RISCV32 |
0x5032 |
32-bitowa przestrzeń adresowa RISC-V |
IMAGE_FILE_MACHINE_RISCV64 |
0x5064 |
64-bitowa przestrzeń adresowa RISC-V |
IMAGE_FILE_MACHINE_RISCV128 |
0x5128 |
RISC-V 128-bitowej przestrzeni adresowej |
IMAGE_FILE_MACHINE_SH3 |
0x1a2 |
Godz. 3 |
IMAGE_FILE_MACHINE_SH3DSP |
0x1a3 |
Godz. SH3 DSP |
IMAGE_FILE_MACHINE_SH4 |
0x1a6 |
Fuji SH4 |
IMAGE_FILE_MACHINE_SH5 |
0x1a8 |
Godz. 5 |
IMAGE_FILE_MACHINE_THUMB |
0x1c2 |
Kciuk |
IMAGE_FILE_MACHINE_WCEMIPSV2 |
0x169 |
MIPS little-endian WCE v2 |
Charakterystyka
Pole Właściwości zawiera flagi wskazujące atrybuty obiektu lub pliku obrazu. Obecnie zdefiniowane są następujące flagi:
Flaga | Wartość | Opis |
---|---|---|
IMAGE_FILE_RELOCS_STRIPPED |
0x0001 |
Tylko obraz, Windows CE i Microsoft Windows NT i nowsze. Oznacza to, że plik nie zawiera relokacji podstawowych i dlatego musi zostać załadowany pod preferowanym adresem podstawowym. Jeśli adres podstawowy jest niedostępny, moduł ładujący zgłasza błąd. Domyślnym zachowaniem konsolidatora jest usuwanie relokacji podstawowych z plików wykonywalnych (EXE). |
IMAGE_FILE_EXECUTABLE_IMAGE |
0x0002 |
Tylko obraz. Oznacza to, że plik obrazu jest prawidłowy i można go uruchomić. Jeśli ta flaga nie jest ustawiona, wskazuje błąd konsolidatora. |
IMAGE_FILE_LINE_NUMS_STRIPPED |
0x0004 |
Numery wierszy COFF zostały usunięte. Ta flaga jest przestarzała i powinna mieć wartość zero. |
IMAGE_FILE_LOCAL_SYMS_STRIPPED |
0x0008 |
Usunięto wpisy tabeli symboli COFF dla symboli lokalnych. Ta flaga jest przestarzała i powinna mieć wartość zero. |
IMAGE_FILE_AGGRESSIVE_WS_TRIM |
0x0010 |
Przestarzały. Agresywnie przycinanie zestawu roboczego. Ta flaga jest przestarzała dla systemu Windows 2000 lub nowszego i musi być równa zero. |
IMAGE_FILE_LARGE_ADDRESS_ AWARE |
0x0020 |
Aplikacja może obsługiwać > 2 GB adresów. |
0x0040 |
Ta flaga jest zarezerwowana do użytku w przyszłości. |
|
IMAGE_FILE_BYTES_REVERSED_LO |
0x0080 |
Little endian: najmniej znaczący bit (LSB) poprzedza najbardziej znaczący bit (MSB) w pamięci. Ta flaga jest przestarzała i powinna mieć wartość zero. |
IMAGE_FILE_32BIT_MACHINE |
0x0100 |
Maszyna jest oparta na architekturze 32-bitowej wyrazów. |
IMAGE_FILE_DEBUG_STRIPPED |
0x0200 |
Informacje o debugowaniu są usuwane z pliku obrazu. |
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP |
0x0400 |
Jeśli obraz znajduje się na nośniku wymiennym, w pełni go załaduj i skopiuj go do pliku wymiany. |
IMAGE_FILE_NET_RUN_FROM_SWAP |
0x0800 |
Jeśli obraz znajduje się na nośniku sieciowym, w pełni załaduj go i skopiuj go do pliku wymiany. |
IMAGE_FILE_SYSTEM |
0x1000 |
Plik obrazu jest plikiem systemowym, a nie programem użytkownika. |
IMAGE_FILE_DLL |
0x2000 |
Plik obrazu jest biblioteką łącza dynamicznego (DLL). Takie pliki są uznawane za pliki wykonywalne dla niemal wszystkich celów, chociaż nie mogą być uruchamiane bezpośrednio. |
IMAGE_FILE_UP_SYSTEM_ONLY |
0x4000 |
Plik powinien być uruchamiany tylko na komputerze jednoprocesorowym. |
IMAGE_FILE_BYTES_REVERSED_HI |
0x8000 |
Big endian: MSB poprzedza LSB w pamięci. Ta flaga jest przestarzała i powinna mieć wartość zero. |
Opcjonalny nagłówek (tylko obraz)
Każdy plik obrazu ma opcjonalny nagłówek, który dostarcza informacje do modułu ładującego. Ten nagłówek jest opcjonalny w tym sensie, że niektóre pliki (w szczególności pliki obiektów) nie mają go. W przypadku plików obrazów ten nagłówek jest wymagany. Plik obiektu może mieć opcjonalny nagłówek, ale zazwyczaj ten nagłówek nie ma funkcji w pliku obiektu, z wyjątkiem zwiększenia rozmiaru.
Należy pamiętać, że rozmiar opcjonalnego nagłówka nie jest stały. Pole SizeOfOptionalHeader w nagłówku COFF musi służyć do sprawdzania, czy sonda do pliku dla określonego katalogu danych nie wykracza poza SizeOfOptionalHeader. Aby uzyskać więcej informacji, zobacz nagłówek pliku COFF (obiekt i obraz).
Należy również użyć pola NumberOfRvaAndSizes opcjonalnego nagłówka, aby upewnić się, że żadna sonda dla określonego wpisu katalogu danych nie wykracza poza opcjonalny nagłówek. Ponadto ważne jest zweryfikowanie opcjonalnego numeru magicznego nagłówka pod kątem zgodności formatu.
Opcjonalny numer magiczny nagłówka określa, czy obraz jest plikiem wykonywalnym PE32 lub PE32+.
Liczba magiczna | Format PE |
---|---|
0x10b |
PE32 |
0x20b |
PE32+ |
Obrazy PE32+ umożliwiają 64-bitową przestrzeń adresową przy jednoczesnym ograniczeniu rozmiaru obrazu do 2 gigabajtów. Inne modyfikacje PE32+ zostały omówione w odpowiednich sekcjach.
Opcjonalny nagłówek ma trzy główne części.
Przesunięcie (PE32/PE32+) | Rozmiar (PE32/PE32+) | Część nagłówka | Opis |
---|---|---|---|
0 |
28/24 |
Pola standardowe |
Pola zdefiniowane dla wszystkich implementacji COFF, w tym UNIX. |
28/24 |
68/88 |
Pola specyficzne dla systemu Windows |
Dodatkowe pola do obsługi określonych funkcji systemu Windows (na przykład podsystemów). |
96/112 |
Zmienna |
Katalogi danych |
Pary adresów/rozmiaru dla tabel specjalnych, które znajdują się w pliku obrazu i są używane przez system operacyjny (na przykład tabelę importu i tabelę eksportu). |
Opcjonalne pola standardowe nagłówka (tylko obraz)
Pierwsze osiem pól opcjonalnego nagłówka to pola standardowe zdefiniowane dla każdej implementacji coFF. Te pola zawierają ogólne informacje przydatne do ładowania i uruchamiania pliku wykonywalnego. Są one niezmienione dla formatu PE32+.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
2 |
Magia |
Niepodpisane liczby całkowite identyfikujące stan pliku obrazu. Najczęstszą liczbą jest 0x10B, która identyfikuje go jako normalny plik wykonywalny. 0x107 identyfikuje go jako obraz ROM, a 0x20B identyfikuje go jako plik wykonywalny PE32+. |
2 |
1 |
MajorLinkerVersion |
Numer wersji głównej konsolidatora. |
3 |
1 |
MinorLinkerVersion |
Numer wersji pomocniczej konsolidatora. |
4 |
4 |
SizeOfCode |
Rozmiar sekcji kodu (tekst) lub suma wszystkich sekcji kodu, jeśli istnieje wiele sekcji. |
8 |
4 |
SizeOfInitializedData |
Rozmiar zainicjowanej sekcji danych lub suma wszystkich takich sekcji, jeśli istnieje wiele sekcji danych. |
12 |
4 |
SizeOfUninitializedData |
Rozmiar niezainicjowanej sekcji danych (BSS) lub suma wszystkich takich sekcji, jeśli istnieje wiele sekcji BSS. |
16 |
4 |
AddressOfEntryPoint |
Adres punktu wejścia względem bazy obrazów, gdy plik wykonywalny jest ładowany do pamięci. W przypadku obrazów programów jest to adres początkowy. W przypadku sterowników urządzeń jest to adres funkcji inicjowania. Punkt wejścia jest opcjonalny dla bibliotek DLL. Jeśli nie ma punktu wejścia, to pole musi mieć wartość zero. |
20 |
4 |
BaseOfCode |
Adres, który jest powiązany z bazą obrazu sekcji początek kodu, gdy jest ładowany do pamięci. |
PE32 zawiera to dodatkowe pole, które jest nieobecne w pe32+, zgodnie z BaseOfCode.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
24 |
4 |
BaseOfData |
Adres, który jest powiązany z bazą obrazu sekcji początek danych, gdy jest ładowany do pamięci. |
Opcjonalne pola Windows-Specific nagłówka (tylko obraz)
Następne 21 pól to rozszerzenie opcjonalnego formatu nagłówka COFF. Zawierają dodatkowe informacje wymagane przez konsolidator i moduł ładujący w systemie Windows.
Przesunięcie (PE32/ PE32+) | Rozmiar (PE32/ PE32+) | Pole | Opis |
---|---|---|---|
28/24 |
4/8 |
ImageBase |
Preferowany adres pierwszego bajtu obrazu podczas ładowania do pamięci; musi mieć wielokrotność 64 K. Domyślną wartością bibliotek DLL jest 0x10000000. Wartością domyślną dla wersji EXE systemu Windows CE jest 0x00010000. Wartość domyślna systemu Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 i Windows Me jest 0x00400000. |
32/32 |
4 |
Podział sekcji |
Wyrównanie (w bajtach) sekcji podczas ich ładowania do pamięci. Musi być większy lub równy wartości FileAlignment. Wartość domyślna to rozmiar strony dla architektury. |
36/36 |
4 |
FileAlignment |
Współczynnik wyrównania (w bajtach), który jest używany do wyrównywania nieprzetworzonych danych sekcji w pliku obrazu. Wartość powinna być mocą 2 z zakresu od 512 do 64 K włącznie. Wartość domyślna to 512. Jeśli parametr SectionAlignment jest mniejszy niż rozmiar strony architektury, parametr FileAlignment musi być zgodny z sekcjąAlignment. |
40/40 |
2 |
MajorOperatingSystemVersion |
Numer wersji głównej wymaganego systemu operacyjnego. |
42/42 |
2 |
MinorOperatingSystemVersion |
Numer wersji pomocniczej wymaganego systemu operacyjnego. |
44/44 |
2 |
MajorImageVersion |
Numer wersji głównej obrazu. |
46/46 |
2 |
MinorImageVersion |
Numer wersji pomocniczej obrazu. |
48/48 |
2 |
MajorSubsystemVersion |
Numer wersji głównej podsystemu. |
50/50 |
2 |
MinorSubsystemVersion |
Numer wersji pomocniczej podsystemu. |
52/52 |
4 |
Win32VersionValue |
Zarezerwowane, musi mieć wartość zero. |
56/56 |
4 |
SizeOfImage |
Rozmiar (w bajtach) obrazu, w tym wszystkie nagłówki, ponieważ obraz jest ładowany w pamięci. Musi to być wielokrotność sekcjiAlignment. |
60/60 |
4 |
SizeOfHeaders |
Łączny rozmiar wycinków MS-DOS, nagłówków PE i nagłówków sekcji zaokrąglonych do wielu elementów FileAlignment. |
64/64 |
4 |
Suma kontrolna |
Suma kontrolna pliku obrazu. Algorytm obliczania sumy kontrolnej jest uwzględniany w IMAGHELP.DLL. Następujące elementy są sprawdzane pod kątem walidacji w czasie ładowania: wszystkie sterowniki, wszystkie biblioteki DLL ładowane w czasie rozruchu i wszystkie biblioteki DLL ładowane do krytycznego procesu systemu Windows. |
68/68 |
2 |
Podsystemu |
Podsystem wymagany do uruchomienia tego obrazu. Aby uzyskać więcej informacji, zobacz Podsystem Windows. |
70/70 |
2 |
DllCharacteristics |
Aby uzyskać więcej informacji, zobacz Charakterystyki bibliotek DLL w dalszej części tej specyfikacji. |
72/72 |
4/8 |
SizeOfStackReserve |
Rozmiar stosu do zarezerwowania. Zatwierdzony jest tylko element SizeOfStackCommit; pozostałe strony są udostępniane pojedynczo do momentu osiągnięcia rozmiaru rezerwy. |
76/80 |
4/8 |
SizeOfStackCommit |
Rozmiar stosu do zatwierdzenia. |
80/88 |
4/8 |
SizeOfHeapReserve |
Rozmiar lokalnego miejsca sterty do zarezerwowania. Zatwierdzony jest tylko element SizeOfHeapCommit; pozostałe strony są udostępniane pojedynczo do momentu osiągnięcia rozmiaru rezerwy. |
84/96 |
4/8 |
SizeOfHeapCommit |
Rozmiar lokalnego miejsca sterty do zatwierdzenia. |
88/104 |
4 |
LoaderFlags |
Zarezerwowane, musi mieć wartość zero. |
92/108 |
4 |
NumberOfRvaAndSizes |
Liczba wpisów katalogu danych w pozostałej części opcjonalnego nagłówka. Każdy z nich opisuje lokalizację i rozmiar. |
Podsystem Windows
Następujące wartości zdefiniowane dla pola Podsystem opcjonalnego nagłówka określają, który podsystem Windows (jeśli istnieje) jest wymagany do uruchomienia obrazu.
Stały | Wartość | Opis |
---|---|---|
IMAGE_SUBSYSTEM_UNKNOWN |
0 |
Nieznany podsystem |
IMAGE_SUBSYSTEM_NATIVE |
1 |
Sterowniki urządzeń i natywne procesy systemu Windows |
IMAGE_SUBSYSTEM_WINDOWS_GUI |
2 |
Podsystem graficznego interfejsu użytkownika systemu Windows (GUI) |
IMAGE_SUBSYSTEM_WINDOWS_CUI |
3 |
Podsystem znaków systemu Windows |
IMAGE_SUBSYSTEM_OS2_CUI |
5 |
Podsystem znaków systemu operacyjnego/2 |
IMAGE_SUBSYSTEM_POSIX_CUI |
7 |
Podsystem znaków Posix |
IMAGE_SUBSYSTEM_NATIVE_WINDOWS |
8 |
Natywny sterownik Win9x |
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI |
9 |
Windows CE |
IMAGE_SUBSYSTEM_EFI_APPLICATION |
10 |
Aplikacja EFI (Extensible Firmware Interface) |
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER |
11 |
Sterownik EFI z usługami rozruchowymi |
sterownik IMAGE_SUBSYSTEM_EFI_RUNTIME_ |
12 |
Sterownik EFI z usługami czasu wykonywania |
IMAGE_SUBSYSTEM_EFI_ROM |
13 |
Obraz EFI ROM |
IMAGE_SUBSYSTEM_XBOX |
14 |
XBOX |
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION |
16 |
Aplikacja rozruchowa systemu Windows. |
Charakterystyka bibliotek DLL
Następujące wartości są definiowane dla pola DllCharacteristics opcjonalnego nagłówka.
Stały | Wartość | Opis |
---|---|---|
0x0001 |
Zarezerwowane, musi mieć wartość zero. |
|
0x0002 |
Zarezerwowane, musi mieć wartość zero. |
|
0x0004 |
Zarezerwowane, musi mieć wartość zero. |
|
0x0008 |
Zarezerwowane, musi mieć wartość zero. |
|
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA |
0x0020 |
Obraz może obsługiwać 64-bitową wirtualną przestrzeń adresową o wysokiej entropii. |
IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE |
0x0040 |
Biblioteka DLL może zostać przeniesiona w czasie ładowania. |
IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY |
0x0080 |
Sprawdzanie integralności kodu jest wymuszane. |
IMAGE_DLLCHARACTERISTICS_ NX_COMPAT |
0x0100 |
Obraz jest zgodny z serwerem NX. |
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION |
0x0200 |
Rozpoznawanie izolacji, ale nie izoluj obrazu. |
IMAGE_DLLCHARACTERISTICS_ NO_SEH |
0x0400 |
Nie używa obsługi wyjątku strukturalnego (SE). W tym obrazie nie można wywołać procedury obsługi SE. |
IMAGE_DLLCHARACTERISTICS_ NO_BIND |
0x0800 |
Nie powiąż obrazu. |
IMAGE_DLLCHARACTERISTICS_APPCONTAINER |
0x1000 |
Obraz musi zostać wykonany w aplikacji AppContainer. |
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER |
0x2000 |
Sterownik WDM. |
IMAGE_DLLCHARACTERISTICS_GUARD_CF |
0x4000 |
Obraz obsługuje funkcję Control Flow Guard. |
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE |
0x8000 |
Rozpoznawanie serwera terminali. |
Opcjonalne katalogi danych nagłówka (tylko obraz)
Każdy katalog danych zawiera adres i rozmiar tabeli lub ciągu używanego przez system Windows. Wszystkie te wpisy katalogu danych są ładowane do pamięci, aby system mógł ich używać w czasie wykonywania. Katalog danych jest polem 8-bajtowym, które ma następującą deklarację:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Pierwsze pole VirtualAddress jest w rzeczywistości RVA tabeli. RVA to adres tabeli względem podstawowego adresu obrazu podczas ładowania tabeli. Drugie pole daje rozmiar w bajtach. Katalogi danych, które stanowią ostatnią część opcjonalnego nagłówka, są wymienione w poniższej tabeli.
Należy pamiętać, że liczba katalogów nie jest stała. Przed wyszukaniem określonego katalogu sprawdź pole NumberOfRvaAndSizes w opcjonalnym nagłówku.
Ponadto nie należy zakładać, że obiekty RVA w tej tabeli wskazują początek sekcji lub że sekcje zawierające określone tabele mają określone nazwy.
Przesunięcie (PE/PE32+) | Rozmiar | Pole | Opis |
---|---|---|---|
96/112 |
8 |
Eksportowanie tabeli |
Adres i rozmiar tabeli eksportu. Aby uzyskać więcej informacji, zobacz sekcję .edata (tylko obraz). |
104/120 |
8 |
Importowanie tabeli |
Adres i rozmiar tabeli importu. Aby uzyskać więcej informacji, zobacz sekcja .idata. |
112/128 |
8 |
Tabela zasobów |
Adres i rozmiar tabeli zasobów. Aby uzyskać więcej informacji, zobacz sekcję .rsrc. |
120/136 |
8 |
Tabela wyjątków |
Adres i rozmiar tabeli wyjątków. Aby uzyskać więcej informacji, zobacz sekcja pdata. |
128/144 |
8 |
Tabela certyfikatów |
Adres i rozmiar tabeli certyfikatów atrybutów. Aby uzyskać więcej informacji, zobacz tabela certyfikatów atrybutów (tylko obraz). |
136/152 |
8 |
Tabela relokacji podstawowej |
Podstawowy adres i rozmiar tabeli relokacji. Aby uzyskać więcej informacji, zobacz sekcja .reloc (tylko obraz). |
144/160 |
8 |
Debugować |
Początkowy adres i rozmiar danych debugowania. Aby uzyskać więcej informacji, zobacz sekcję debugowania. |
152/168 |
8 |
Architektura |
Zarezerwowane, musi mieć wartość 0 |
160/176 |
8 |
Globalne ptr |
RVA wartości, która ma być przechowywana w globalnym rejestrze wskaźników. Składowa rozmiaru tej struktury musi być ustawiona na zero. |
168/184 |
8 |
Tabela TLS |
Adres i rozmiar tabeli magazynu lokalnego wątku (TLS). Aby uzyskać więcej informacji, zobacz sekcję tls. |
176/192 |
8 |
Ładowanie tabeli konfiguracji |
Adres i rozmiar tabeli konfiguracji obciążenia. Aby uzyskać więcej informacji, zobacz Struktura konfiguracji obciążenia (tylko obraz). |
184/200 |
8 |
Powiązany import |
Powiązany adres i rozmiar tabeli importu. |
192/208 |
8 |
IAT |
Import address table address and size (Rozmiar i adres importowania). Aby uzyskać więcej informacji, zobacz Import Address Table. |
200/216 |
8 |
Opóźnij deskryptor importu |
Opóźnienie importowania adresu i rozmiaru deskryptora. Aby uzyskać więcej informacji, zobacz Delay-Load Import Tables (Tylko obraz). |
208/224 |
8 |
Nagłówek środowiska uruchomieniowego ŚRODOWISKA CLR |
Adres i rozmiar nagłówka środowiska uruchomieniowego CLR. Aby uzyskać więcej informacji, zobacz sekcję .cormeta (tylko obiekt). |
216/232 |
8 |
Zarezerwowane, musi mieć wartość zero |
Wpis tabeli certyfikatów wskazuje tabelę certyfikatów atrybutów. Te certyfikaty nie są ładowane do pamięci w ramach obrazu. W związku z tym pierwsze pole tego wpisu, które jest zwykle RVA, jest wskaźnikiem pliku.
Tabela sekcji (nagłówki sekcji)
Każdy wiersz tabeli sekcji jest w efekcie nagłówkiem sekcji. Ta tabela natychmiast następuje po opcjonalnym nagłówku, jeśli istnieje. To pozycjonowanie jest wymagane, ponieważ nagłówek pliku nie zawiera bezpośredniego wskaźnika do tabeli sekcji. Zamiast tego lokalizacja tabeli sekcji jest określana przez obliczenie lokalizacji pierwszego bajtu po nagłówkach. Pamiętaj, aby użyć rozmiaru opcjonalnego nagłówka określonego w nagłówku pliku.
Liczba wpisów w tabeli sekcji jest podawana przez pole NumberOfSections w nagłówku pliku. Wpisy w tabeli sekcji są numerowane od jednego (1). Wpisy sekcji kodu i pamięci danych są w kolejności wybranej przez konsolidator.
W pliku obrazu maszyny wirtualne dla sekcji muszą być przypisane przez konsolidator, aby były w kolejności rosnącej i sąsiadującej, i muszą być wielokrotną wartością SectionAlignment w opcjonalnym nagłówku.
Każdy nagłówek sekcji (wpis tabeli sekcji) ma następujący format dla łącznie 40 bajtów na wpis.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
8 |
Nazwa |
Ciąg zakodowany w formacie UTF-8 o wartości 8 bajtów. Jeśli ciąg ma dokładnie 8 znaków, nie ma wartości null zakończenia. W przypadku dłuższych nazw to pole zawiera ukośnik (/), po którym następuje reprezentacja ASCII liczby dziesiętnej, która jest przesunięciem do tabeli ciągów. Obrazy wykonywalne nie używają tabeli ciągów i nie obsługują nazw sekcji dłuższych niż 8 znaków. Długie nazwy w plikach obiektów są obcinane, jeśli są emitowane do pliku wykonywalnego. |
8 |
4 |
VirtualSize |
Całkowity rozmiar sekcji podczas ładowania do pamięci. Jeśli ta wartość jest większa niż SizeOfRawData, sekcja ma wartość zero-padded. To pole jest prawidłowe tylko dla obrazów wykonywalnych i powinno być ustawione na zero dla plików obiektów. |
12 |
4 |
VirtualAddress |
W przypadku obrazów wykonywalnych adres pierwszego bajtu sekcji względem bazy obrazów podczas ładowania sekcji do pamięci. W przypadku plików obiektów to pole jest adresem pierwszego bajtu przed zastosowaniem relokacji; dla uproszczenia kompilatory powinny ustawić tę wartość na zero. W przeciwnym razie jest to dowolna wartość, która jest odejmowana od przesunięć podczas relokacji. |
16 |
4 |
SizeOfRawData |
Rozmiar sekcji (dla plików obiektów) lub rozmiar zainicjowanych danych na dysku (dla plików obrazów). W przypadku obrazów wykonywalnych musi to być wielokrotność elementu FileAlignment z opcjonalnego nagłówka. Jeśli jest to wartość mniejsza niż VirtualSize, pozostała część sekcji jest wypełniona zero. Ponieważ pole SizeOfRawData jest zaokrąglane, ale pole VirtualSize nie jest możliwe, aby parametr SizeOfRawData był również większy niż VirtualSize. Jeśli sekcja zawiera tylko niezainicjowane dane, to pole powinno mieć wartość zero. |
20 |
4 |
WskaźnikToRawData |
Wskaźnik pliku do pierwszej strony sekcji w pliku COFF. W przypadku obrazów wykonywalnych musi to być wielokrotność elementu FileAlignment z opcjonalnego nagłówka. W przypadku plików obiektów wartość powinna być wyrównana do granicy 4-bajtowej w celu uzyskania najlepszej wydajności. Jeśli sekcja zawiera tylko niezainicjowane dane, to pole powinno mieć wartość zero. |
24 |
4 |
WskaźnikToRelocations |
Wskaźnik pliku na początek wpisów relokacji dla sekcji. Jest ona ustawiona na zero dla obrazów wykonywalnych lub jeśli nie ma relokacji. |
28 |
4 |
Wskaźnik Do numerów linii |
Wskaźnik pliku na początek wpisów numeru wiersza dla sekcji. Ta wartość jest ustawiona na zero, jeśli nie ma numerów wierszy COFF. Ta wartość powinna być równa zero dla obrazu, ponieważ informacje debugowania COFF są przestarzałe. |
32 |
2 |
NumberOfRelocations |
Liczba wpisów relokacji dla sekcji. Jest to wartość zero dla obrazów wykonywalnych. |
34 |
2 |
NumberOfLinenumbers |
Liczba wpisów numeru wiersza dla sekcji. Ta wartość powinna być równa zero dla obrazu, ponieważ informacje debugowania COFF są przestarzałe. |
36 |
4 |
Charakterystyka |
Flagi opisujące cechy sekcji. Aby uzyskać więcej informacji, zobacz Sekcje Flagi. |
Flagi sekcji
Flagi sekcji w polu Charakterystyki nagłówka sekcji wskazują cechy sekcji.
Flaga | Wartość | Opis |
---|---|---|
0x00000000 |
Zarezerwowane do użytku w przyszłości. |
|
0x00000001 |
Zarezerwowane do użytku w przyszłości. |
|
0x00000002 |
Zarezerwowane do użytku w przyszłości. |
|
0x00000004 |
Zarezerwowane do użytku w przyszłości. |
|
IMAGE_SCN_TYPE_NO_PAD |
0x00000008 |
Sekcja nie powinna być dopełniona do następnej granicy. Ta flaga jest przestarzała i jest zastępowana przez IMAGE_SCN_ALIGN_1BYTES. Jest to prawidłowe tylko dla plików obiektów. |
0x00000010 |
Zarezerwowane do użytku w przyszłości. |
|
IMAGE_SCN_CNT_CODE |
0x00000020 |
Sekcja zawiera kod wykonywalny. |
IMAGE_SCN_CNT_INITIALIZED_DATA |
0x00000040 |
Sekcja zawiera zainicjowane dane. |
IMAGE_SCN_CNT_UNINITIALIZED_ DANYCH |
0x00000080 |
Sekcja zawiera niezainicjowane dane. |
IMAGE_SCN_LNK_OTHER |
0x00000100 |
Zarezerwowane do użytku w przyszłości. |
IMAGE_SCN_LNK_INFO |
0x00000200 |
Sekcja zawiera komentarze lub inne informacje. Sekcja .drectve ma ten typ. Jest to prawidłowe tylko w przypadku plików obiektów. |
0x00000400 |
Zarezerwowane do użytku w przyszłości. |
|
IMAGE_SCN_LNK_REMOVE |
0x00000800 |
Sekcja nie stanie się częścią obrazu. Jest to prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_LNK_COMDAT |
0x00001000 |
Sekcja zawiera dane COMDAT. Aby uzyskać więcej informacji, zobacz sekcje COMDAT (tylko obiekt). Jest to prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_GPREL |
0x00008000 |
Sekcja zawiera dane, do których odwołuje się wskaźnik globalny (GP). |
IMAGE_SCN_MEM_PURGEABLE |
0x00020000 |
Zarezerwowane do użytku w przyszłości. |
IMAGE_SCN_MEM_16BIT |
0x00020000 |
Zarezerwowane do użytku w przyszłości. |
IMAGE_SCN_MEM_LOCKED |
0x00040000 |
Zarezerwowane do użytku w przyszłości. |
IMAGE_SCN_MEM_PRELOAD |
0x00080000 |
Zarezerwowane do użytku w przyszłości. |
IMAGE_SCN_ALIGN_1BYTES |
0x00100000 |
Wyrównywanie danych na granicy 1-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_2BYTES |
0x00200000 |
Wyrównywanie danych na granicy 2-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_4BYTES |
0x00300000 |
Wyrównywanie danych na granicy 4-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_8BYTES |
0x00400000 |
Wyrównywanie danych na granicy 8-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_16BYTES |
0x00500000 |
Wyrównywanie danych na granicy 16 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_32BYTES |
0x00600000 |
Wyrównywanie danych na granicy 32-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_64BYTES |
0x00700000 |
Wyrównywanie danych na granicy 64-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_128BYTES |
0x00800000 |
Wyrównaj dane do granicy 128 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_256BYTES |
0x00900000 |
Wyrównaj dane do granicy 256 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_512BYTES |
0x00A00000 |
Wyrównaj dane do granicy 512 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_1024BYTES |
0x00B00000 |
Wyrównaj dane do granicy 1024-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_2048BYTES |
0x00C00000 |
Wyrównaj dane do granicy 2048 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_4096BYTES |
0x00D00000 |
Wyrównywanie danych na granicy 4096 bajtów. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_ALIGN_8192BYTES |
0x00E00000 |
Wyrównywanie danych na granicy 8192-bajtowej. Prawidłowe tylko dla plików obiektów. |
IMAGE_SCN_LNK_NRELOC_OVFL |
0x01000000 |
Sekcja zawiera rozszerzone relokacje. |
IMAGE_SCN_MEM_DISCARDABLE |
0x02000000 |
Sekcja może zostać odrzucona w razie potrzeby. |
IMAGE_SCN_MEM_NOT_CACHED |
0x04000000 |
Nie można buforować sekcji. |
IMAGE_SCN_MEM_NOT_PAGED |
0x08000000 |
Sekcja nie jest stronicowalna. |
IMAGE_SCN_MEM_SHARED |
0x10000000 |
Sekcja może być współdzielona w pamięci. |
IMAGE_SCN_MEM_EXECUTE |
0x20000000 |
Sekcję można wykonać jako kod. |
IMAGE_SCN_MEM_READ |
0x40000000 |
Sekcję można odczytać. |
IMAGE_SCN_MEM_WRITE |
0x80000000 |
Sekcję można zapisać. |
IMAGE_SCN_LNK_NRELOC_OVFL wskazuje, że liczba relokacji dla sekcji przekracza 16 bitów zarezerwowanych dla niej w nagłówku sekcji. Jeśli bit jest ustawiony, a pole NumberOfRelocations w nagłówku sekcji jest 0xffff, rzeczywista liczba relokacji jest przechowywana w 32-bitowym polu VirtualAddress pierwszej relokacji. Jest to błąd, jeśli IMAGE_SCN_LNK_NRELOC_OVFL jest ustawiona i w sekcji występuje mniej niż 0xffff relokacji.
Pogrupowane sekcje (tylko obiekty)
Znak "$" (znak dolara) ma specjalną interpretację w nazwach sekcji w plikach obiektów.
Podczas określania sekcji obrazu, która będzie zawierać zawartość sekcji obiektu, konsolidator odrzuca znaki "$" i wszystkie zgodne z nim znaki. W związku z tym sekcja obiektu o nazwie .text$X rzeczywiście przyczynia się do sekcji .text na obrazie.
Jednak znaki następujące po "$" określają kolejność składek w sekcji obrazu. Wszystkie współtworzenie tej samej nazwy sekcji obiektów są przydzielane w sposób ciągły na obrazie, a bloki współtworzenia są sortowane w kolejności leksykalnej według nazwy sekcji obiektów. W związku z tym wszystkie elementy w plikach obiektów o nazwie sekcji .text$X kończą się razem, po .text$W kontrybucji i przed .text$Y kontrybucji.
Nazwa sekcji w pliku obrazu nigdy nie zawiera znaku "$".
Inna zawartość pliku
- danych sekcji
- relokacje COFF (tylko obiekt)
- numery wierszy COFF (przestarzałe)
- tabeli symboli COFF
-
pomocniczych rekordów symboli
- format pomocniczy 1: definicje funkcji
- Format pomocniczy 2: symbole bf i ef
- format pomocniczy 3: słabe zewnętrzne
- format pomocniczy 4: pliki
- format pomocniczy 5: definicje sekcji
- sekcji COMDAT (tylko obiekt)
- definicji tokenu ŚRODOWISKA CLR (tylko obiekt)
- tabeli ciągów COFF
- tabeli certyfikatów atrybutów (tylko obraz)
-
Delay-Load importowania tabel (tylko obraz)
- tabeli katalogów Delay-Load
- atrybutów
- nazwa
- Dojście modułu
- opóźnij tabelę adresów importu
- opóźnij tabelę nazw importu
- opóźnij tabelę adresów importu i sygnaturę czasową
- opóźnianie zwalniania tabeli adresów importu
Struktury danych, które zostały opisane do tej pory, do i włącznie z opcjonalnym nagłówkiem, znajdują się na stałym przesunięcie od początku pliku (lub z nagłówka PE, jeśli plik jest obrazem zawierającym MS-DOS wycinku).
Pozostała część obiektu lub pliku obrazu COFF zawiera bloki danych, które nie muszą mieć żadnego określonego przesunięcia pliku. Zamiast tego lokalizacje są definiowane przez wskaźniki w opcjonalnym nagłówku lub nagłówku sekcji.
Wyjątek dotyczy obrazów z wartością SectionAlignment mniejszą niż rozmiar strony architektury (4 K dla intel x86 i MIPS oraz 8 K dla Itanium). Aby zapoznać się z opisem sekcjiAlignment, zobacz Opcjonalny nagłówek (tylko obraz). W tym przypadku istnieją ograniczenia dotyczące przesunięcia pliku danych sekcji, zgodnie z opisem w sekcji 5.1, "Dane sekcji". Innym wyjątkiem jest to, że certyfikat atrybutu i informacje debugowania muszą być umieszczone na samym końcu pliku obrazu, z tabelą certyfikatów atrybutów bezpośrednio poprzedzających sekcję debugowania, ponieważ moduł ładujący nie mapuje ich na pamięć. Reguła dotycząca certyfikatu atrybutu i informacji debugowania nie ma jednak zastosowania do plików obiektów.
Dane sekcji
Zainicjowane dane dla sekcji składają się z prostych bloków bajtów. Jednak w przypadku sekcji zawierających wszystkie zera nie trzeba uwzględniać danych sekcji.
Dane dla każdej sekcji znajdują się w przesunięcie pliku, które zostało podane przez pole PointerToRawData w nagłówku sekcji. Rozmiar tych danych w pliku jest wskazywany przez pole SizeOfRawData. Jeśli parametr SizeOfRawData jest mniejszy niż VirtualSize, reszta jest dopełniona zerami.
W pliku obrazu dane sekcji muszą być wyrównane do granicy określonej przez pole FileAlignment w opcjonalnym nagłówku. Dane sekcji muszą być wyświetlane w kolejności wartości RVA dla odpowiednich sekcji (jak poszczególne nagłówki sekcji w tabeli sekcji).
Istnieją dodatkowe ograniczenia dotyczące plików obrazów, jeśli wartość SectionAlignment w opcjonalnym nagłówku jest mniejsza niż rozmiar strony architektury. W przypadku takich plików lokalizacja danych sekcji w pliku musi być zgodna z jego lokalizacją w pamięci podczas ładowania obrazu, dzięki czemu fizyczne przesunięcie danych sekcji jest takie samo jak RVA.
Relokacje COFF (tylko obiekt)
Pliki obiektów zawierają relokacje COFF, które określają sposób modyfikowania danych sekcji podczas umieszczania w pliku obrazu, a następnie ładowanych do pamięci.
Pliki obrazów nie zawierają relokacji COFF, ponieważ wszystkie przywołyane symbole zostały już przypisane w płaskiej przestrzeni adresowej. Obraz zawiera informacje o relokacji w postaci relokacji podstawowych w sekcji .reloc (chyba że obraz ma atrybut IMAGE_FILE_RELOCS_STRIPPED). Aby uzyskać więcej informacji, zobacz sekcja .reloc (tylko obraz).
Dla każdej sekcji w pliku obiektu tablica rekordów o stałej długości zawiera relokacje COFF sekcji. Pozycja i długość tablicy są określone w nagłówku sekcji. Każdy element tablicy ma następujący format.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
VirtualAddress |
Adres elementu, do którego jest stosowana relokacja. Jest to przesunięcie od początku sekcji oraz wartość pola RVA/Offset sekcji. Zobacz tabelę sekcji (nagłówki sekcji). Jeśli na przykład pierwszy bajt sekcji ma adres 0x10, trzeci bajt ma adres 0x12. |
4 |
4 |
SymbolTableIndex |
Indeks oparty na zera w tabeli symboli. Ten symbol zawiera adres, który ma być używany do relokacji. Jeśli określony symbol ma klasę magazynu sekcji, adres symbolu jest adresem z pierwszą sekcją o tej samej nazwie. |
8 |
2 |
Typ |
Wartość wskazująca rodzaj relokacji, który należy wykonać. Prawidłowe typy relokacji zależą od typu maszyny. Zobacz wskaźniki typów . |
Jeśli symbol, do którym odwołuje się pole SymbolTableIndex, ma klasę magazynu IMAGE_SYM_CLASS_SECTION, adres symbolu jest początkiem sekcji. Sekcja jest zwykle w tym samym pliku, z wyjątkiem sytuacji, gdy plik obiektu jest częścią archiwum (biblioteki). W takim przypadku sekcję można znaleźć w dowolnym innym pliku obiektu w archiwum, który ma taką samą nazwę elementu członkowskiego archiwum, jak bieżący plik obiektu. (Relacja z nazwą elementu członkowskiego archiwum jest używana w łączeniu tabel importu, czyli sekcji idata).
Wskaźniki typów
Pole Typ rekordu relokacji wskazuje, jakiego rodzaju relokację należy wykonać. Różne typy relokacji są definiowane dla każdego typu maszyny.
Procesory x64
Następujące wskaźniki typów relokacji są zdefiniowane dla procesorów x64 i zgodnych.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_AMD64_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_AMD64_ADDR64 |
0x0001 |
64-bitowa va celu relokacji. |
IMAGE_REL_AMD64_ADDR32 |
0x0002 |
32-bitowa va celu relokacji. |
IMAGE_REL_AMD64_ADDR32NB |
0x0003 |
Adres 32-bitowy bez bazy obrazu (RVA). |
IMAGE_REL_AMD64_REL32 |
0x0004 |
32-bitowy adres względny z bajtu po przeniesieniu. |
IMAGE_REL_AMD64_REL32_1 |
0x0005 |
Adres 32-bitowy względem odległości bajtu 1 od relokacji. |
IMAGE_REL_AMD64_REL32_2 |
0x0006 |
Adres 32-bitowy względem odległości bajtu 2 z relokacji. |
IMAGE_REL_AMD64_REL32_3 |
0x0007 |
Adres 32-bitowy względem odległości bajtów 3 z relokacji. |
IMAGE_REL_AMD64_REL32_4 |
0x0008 |
Adres 32-bitowy względem odległości bajtu 4 od relokacji. |
IMAGE_REL_AMD64_REL32_5 |
0x0009 |
Adres 32-bitowy względem odległości bajtów 5 od relokacji. |
IMAGE_REL_AMD64_SECTION |
0x000A |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_AMD64_SECREL |
0x000B |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_AMD64_SECREL7 |
0x000C |
7-bitowe przesunięcie bez znaku z podstawy sekcji zawierającej element docelowy. |
IMAGE_REL_AMD64_TOKEN |
0x000D |
Tokeny CLR. |
IMAGE_REL_AMD64_SREL32 |
0x000E |
32-bitowa wartość zależna od zakresu emitowana do obiektu. |
IMAGE_REL_AMD64_PAIR |
0x000F |
Para, która musi natychmiast podążać za każdą wartością zależną od zakresu. |
IMAGE_REL_AMD64_SSPAN32 |
0x0010 |
32-bitowa wartość zależna od zakresu, która jest stosowana w czasie połączenia. |
Procesory ARM
Następujące wskaźniki typów relokacji są definiowane dla procesorów ARM.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_ARM_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_ARM_ADDR32 |
0x0001 |
32-bitowa va obiektu docelowego. |
IMAGE_REL_ARM_ADDR32NB |
0x0002 |
32-bitowy RVA obiektu docelowego. |
IMAGE_REL_ARM_BRANCH24 |
0x0003 |
24-bitowe względne przemieszczenie do celu. |
IMAGE_REL_ARM_BRANCH11 |
0x0004 |
Odwołanie do wywołania podrzędnego. Odwołanie składa się z dwóch 16-bitowych instrukcji z 11-bitowymi przesunięciami. |
IMAGE_REL_ARM_REL32 |
0x000A |
32-bitowy adres względny z bajtu po przeniesieniu. |
IMAGE_REL_ARM_SECTION |
0x000E |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_ARM_SECREL |
0x000F |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_ARM_MOV32 |
0x0010 |
32-bitowa va obiektu docelowego. Ta relokacja jest stosowana przy użyciu instrukcji MOVW dla małych 16 bitów, a następnie MOVT dla wysokich 16 bitów. |
IMAGE_REL_THUMB_MOV32 |
0x0011 |
32-bitowa va obiektu docelowego. Ta relokacja jest stosowana przy użyciu instrukcji MOVW dla małych 16 bitów, a następnie MOVT dla wysokich 16 bitów. |
IMAGE_REL_THUMB_BRANCH20 |
0x0012 |
Instrukcja została naprawiona z 21-bitowym przesiedleniem względnym do 2-bajtowego wyrównanego celu. Najmniej znaczący fragment przemieszczenia jest zawsze zerowy i nie jest przechowywany. Ta relokacja odpowiada instrukcji warunkowej B Thumb-2 32-bitowej. |
Nieużywane |
0x0013 |
|
IMAGE_REL_THUMB_BRANCH24 |
0x0014 |
Instrukcja została naprawiona z 25-bitowym przesiedleniem względnym do 2-bajtowego obiektu docelowego wyrównanego. Najmniej znaczący bit przemieszczenia wynosi zero i nie jest przechowywany. Ta relokacja odpowiada instrukcji Thumb-2 B. |
IMAGE_REL_THUMB_BLX23 |
0x0015 |
Instrukcja została naprawiona z 25-bitowym przesiedleniem względnym do 4-bajtowego obiektu docelowego wyrównanego. Małe 2 bity przemieszczenia są zerowe i nie są przechowywane. Ta relokacja odpowiada instrukcji Thumb-2 BLX. |
IMAGE_REL_ARM_PAIR |
0x0016 |
Relokacja jest prawidłowa tylko wtedy, gdy następuje natychmiast po ARM_REFHI lub THUMB_REFHI. Obiekt SymbolTableIndex zawiera przemieszczenie, a nie indeks do tabeli symboli. |
Procesory ARM64
Następujące wskaźniki typów relokacji są zdefiniowane dla procesorów ARM64.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_ARM64_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_ARM64_ADDR32 |
0x0001 |
32-bitowa va obiektu docelowego. |
IMAGE_REL_ARM64_ADDR32NB |
0x0002 |
32-bitowy RVA obiektu docelowego. |
IMAGE_REL_ARM64_BRANCH26 |
0x0003 |
26-bitowe względne przemieszczenie do obiektu docelowego dla instrukcji B i BL. |
IMAGE_REL_ARM64_PAGEBASE_REL21 |
0x0004 |
Podstawa strony docelowej dla instrukcji ADRP. |
IMAGE_REL_ARM64_REL21 |
0x0005 |
12-bitowe względne przemieszczenie do celu dla instrukcji ADR |
IMAGE_REL_ARM64_PAGEOFFSET_12A |
0x0006 |
Przesunięcie strony 12-bitowej obiektu docelowego w celu uzyskania instrukcji ADD/ADDS (natychmiastowe) z zerowym przesunięciem. |
IMAGE_REL_ARM64_PAGEOFFSET_12L |
0x0007 |
12-bitowe przesunięcie strony docelowej dla instrukcji LDR (indeksowane, niepodpisane natychmiastowe). |
IMAGE_REL_ARM64_SECREL |
0x0008 |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_ARM64_SECREL_LOW12A |
0x0009 |
Bit 0:11 przesunięcia sekcji obiektu docelowego, aby uzyskać instrukcje ADD/ADDS (natychmiastowe) z zerowym przesunięciem. |
IMAGE_REL_ARM64_SECREL_HIGH12A |
0x000A |
Bit 12:23 przesunięcia sekcji obiektu docelowego, aby uzyskać instrukcje ADD/ADDS (natychmiastowe) z zerowym przesunięciem. |
IMAGE_REL_ARM64_SECREL_LOW12L |
0x000B |
Bit 0:11 przesunięcia sekcji obiektu docelowego dla instrukcji LDR (indeksowane, niepodpisane natychmiastowe). |
IMAGE_REL_ARM64_TOKEN |
0x000C |
Token CLR. |
IMAGE_REL_ARM64_SECTION |
0x000D |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_ARM64_ADDR64 |
0x000E |
64-bitowa va celu relokacji. |
IMAGE_REL_ARM64_BRANCH19 |
0x000F |
Przesunięcie 19-bitowe na cel relokacji dla instrukcji warunkowej B. |
IMAGE_REL_ARM64_BRANCH14 |
0x0010 |
14-bitowe przesunięcie do celu relokacji, w celu uzyskania instrukcji TBZ i TBNZ. |
IMAGE_REL_ARM64_REL32 |
0x0011 |
32-bitowy adres względny z bajtu po przeniesieniu. |
Procesory SuperH Firmy Amd
Następujące wskaźniki typów relokacji są zdefiniowane dla procesorów SH3 i SH4. Relokacje specyficzne dla sh5 są oznaczone jako SHM (SH Media).
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_SH3_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_SH3_DIRECT16 |
0x0001 |
Odwołanie do lokalizacji 16-bitowej zawierającej va symbolu docelowego. |
IMAGE_REL_SH3_DIRECT32 |
0x0002 |
32-bitowa aktywacja zbiorcza symbolu docelowego. |
IMAGE_REL_SH3_DIRECT8 |
0x0003 |
Odwołanie do lokalizacji 8-bitowej zawierającej va symbolu docelowego. |
IMAGE_REL_SH3_DIRECT8_WORD |
0x0004 |
Odwołanie do 8-bitowej instrukcji zawierającej efektywną 16-bitową va symbolu docelowego. |
IMAGE_REL_SH3_DIRECT8_LONG |
0x0005 |
Odwołanie do 8-bitowej instrukcji zawierającej efektywną 32-bitową va symbolu docelowego. |
IMAGE_REL_SH3_DIRECT4 |
0x0006 |
Odwołanie do lokalizacji 8-bitowej, której małe 4 bity zawierają va symbolu docelowego. |
IMAGE_REL_SH3_DIRECT4_WORD |
0x0007 |
Odwołanie do instrukcji 8-bitowej, której małe 4 bity zawierają efektywną 16-bitową lukę w zabezpieczeniach symbolu docelowego. |
IMAGE_REL_SH3_DIRECT4_LONG |
0x0008 |
Odwołanie do instrukcji 8-bitowej, której niskie 4 bity zawierają efektywną 32-bitową lukę w zabezpieczeniach symbolu docelowego. |
IMAGE_REL_SH3_PCREL8_WORD |
0x0009 |
Odwołanie do instrukcji 8-bitowej zawierającej efektywne 16-bitowe przesunięcie względne symbolu docelowego. |
IMAGE_REL_SH3_PCREL8_LONG |
0x000A |
Odwołanie do instrukcji 8-bitowej zawierającej efektywne 32-bitowe przesunięcie względne symbolu docelowego. |
IMAGE_REL_SH3_PCREL12_WORD |
0x000B |
Odwołanie do instrukcji 16-bitowej, której niskie 12 bitów zawiera efektywne 16-bitowe przesunięcie względne symbolu docelowego. |
IMAGE_REL_SH3_STARTOF_SECTION |
0x000C |
Odwołanie do lokalizacji 32-bitowej, która jest va sekcji zawierającej symbol docelowy. |
IMAGE_REL_SH3_SIZEOF_SECTION |
0x000D |
Odwołanie do lokalizacji 32-bitowej, która jest rozmiarem sekcji zawierającej symbol docelowy. |
IMAGE_REL_SH3_SECTION |
0x000E |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_SH3_SECREL |
0x000F |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_SH3_DIRECT32_NB |
0x0010 |
32-bitowa wartość RVA symbolu docelowego. |
IMAGE_REL_SH3_GPREL4_LONG |
0x0011 |
Względny GP. |
IMAGE_REL_SH3_TOKEN |
0x0012 |
Token CLR. |
IMAGE_REL_SHM_PCRELPT |
0x0013 |
Przesunięcie z bieżącej instrukcji w longwords. Jeśli bit NOMODE nie jest ustawiony, wstaw odwrotność bitu niskiego w bitzie 32, aby wybrać PTA lub PTB. |
IMAGE_REL_SHM_REFLO |
0x0014 |
Niski 16 bitów adresu 32-bitowego. |
IMAGE_REL_SHM_REFHALF |
0x0015 |
Wysokie 16 bitów adresu 32-bitowego. |
IMAGE_REL_SHM_RELLO |
0x0016 |
Niski 16 bitów adresu względnego. |
IMAGE_REL_SHM_RELHALF |
0x0017 |
Wysokie 16 bitów adresu względnego. |
IMAGE_REL_SHM_PAIR |
0x0018 |
Relokacja jest prawidłowa tylko wtedy, gdy natychmiast następuje relokacja REFHALF, RELHALF lub RELLO. Pole SymbolTableIndex relokacji zawiera przemieszczenie, a nie indeks do tabeli symboli. |
IMAGE_REL_SHM_NOMODE |
0x8000 |
Relokacja ignoruje tryb sekcji. |
Procesory IBM PowerPC
Następujące wskaźniki typów relokacji są zdefiniowane dla procesorów PowerPC.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_PPC_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_PPC_ADDR64 |
0x0001 |
64-bitowa va obiektu docelowego. |
IMAGE_REL_PPC_ADDR32 |
0x0002 |
32-bitowa va obiektu docelowego. |
IMAGE_REL_PPC_ADDR24 |
0x0003 |
Niskie 24 bity va obiektu docelowego. Jest to prawidłowe tylko wtedy, gdy symbol docelowy jest bezwzględny i może zostać przedłużony do oryginalnej wartości. |
IMAGE_REL_PPC_ADDR16 |
0x0004 |
Niskie 16 bitów oceny luk w zabezpieczeniach celu. |
IMAGE_REL_PPC_ADDR14 |
0x0005 |
Niskie 14 bitów oceny luk w zabezpieczeniach celu. Jest to prawidłowe tylko wtedy, gdy symbol docelowy jest bezwzględny i może zostać przedłużony do oryginalnej wartości. |
IMAGE_REL_PPC_REL24 |
0x0006 |
24-bitowe przesunięcie względne komputera do lokalizacji symbolu. |
IMAGE_REL_PPC_REL14 |
0x0007 |
14-bitowe przesunięcie względem komputera do lokalizacji symbolu. |
IMAGE_REL_PPC_ADDR32NB |
0x000A |
32-bitowy RVA obiektu docelowego. |
IMAGE_REL_PPC_SECREL |
0x000B |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_PPC_SECTION |
0x000C |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_PPC_SECREL16 |
0x000F |
16-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_PPC_REFHI |
0x0010 |
Wysokie 16 bitów 32-bitowej va celu. Jest to używane w pierwszej instrukcji w sekwencji dwóch instrukcji, która ładuje pełny adres. Po tej relokacji należy natychmiast wykonać relokację PAIR, której właściwość SymbolTableIndex zawiera podpisane 16-bitowe przemieszczenie, które jest dodawane do 16-bitowych górnej liczby bitów pobranych z lokalizacji, która jest przenoszona. |
IMAGE_REL_PPC_REFLO |
0x0011 |
Niskie 16 bitów oceny luk w zabezpieczeniach celu. |
IMAGE_REL_PPC_PAIR |
0x0012 |
Relokacja, która jest prawidłowa tylko wtedy, gdy następuje natychmiast po relokacji REFHI lub SECRELHI. Obiekt SymbolTableIndex zawiera przemieszczenie, a nie indeks do tabeli symboli. |
IMAGE_REL_PPC_SECRELLO |
0x0013 |
Niskie 16 bitów 32-bitowego przesunięcia celu od początku jego sekcji. |
IMAGE_REL_PPC_GPREL |
0x0015 |
16-bitowe przemieszczenie obiektu docelowego względem rejestru GP. |
IMAGE_REL_PPC_TOKEN |
0x0016 |
Token CLR. |
Procesory Intel 386
Następujące wskaźniki typów relokacji są zdefiniowane dla procesorów Intel 386 i zgodnych.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_I386_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_I386_DIR16 |
0x0001 |
Nieobsługiwane. |
IMAGE_REL_I386_REL16 |
0x0002 |
Nieobsługiwane. |
IMAGE_REL_I386_DIR32 |
0x0006 |
32-bitowa va elementu docelowego. |
IMAGE_REL_I386_DIR32NB |
0x0007 |
Docelowy 32-bitowy RVA. |
IMAGE_REL_I386_SEG12 |
0x0009 |
Nieobsługiwane. |
IMAGE_REL_I386_SECTION |
0x000A |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_I386_SECREL |
0x000B |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_I386_TOKEN |
0x000C |
Token CLR. |
IMAGE_REL_I386_SECREL7 |
0x000D |
Przesunięcie 7-bitowe z podstawy sekcji zawierającej element docelowy. |
IMAGE_REL_I386_REL32 |
0x0014 |
32-bitowe względne przemieszczenie do celu. Obsługuje to gałąź względną x86 i instrukcje wywołania. |
Rodzina procesorów Intel Itanium (IPF)
Następujące wskaźniki typów relokacji są zdefiniowane dla rodziny procesorów Intel Itanium i zgodnych procesorów. Należy pamiętać, że relokacje instrukcji używają przesunięcia pakietu i numeru miejsca dla przesunięcia relokacji.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_IA64_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_IA64_IMM14 |
0x0001 |
Po relokacji instrukcji można przeprowadzić relokację ADDEND, której wartość jest dodawana do adresu docelowego, zanim zostanie wstawiona do określonego miejsca w pakiecie IMM14. Obiekt docelowy relokacji musi być bezwzględny lub obraz musi zostać naprawiony. |
IMAGE_REL_IA64_IMM22 |
0x0002 |
Po relokacji instrukcji można wykonać relokację ADDEND, której wartość jest dodawana do adresu docelowego, zanim zostanie wstawiona do określonego miejsca w pakiecie IMM22. Obiekt docelowy relokacji musi być bezwzględny lub obraz musi zostać naprawiony. |
IMAGE_REL_IA64_IMM64 |
0x0003 |
Liczba miejsc relokacji musi być jedną (1). Po relokacji można przeprowadzić relokację ADDEND, której wartość jest dodawana do adresu docelowego przed zapisaniem we wszystkich trzech miejscach pakietu IMM64. |
IMAGE_REL_IA64_DIR32 |
0x0004 |
32-bitowa va elementu docelowego. Jest to obsługiwane tylko w przypadku /LARGEADDRESSAWARE:NO images. |
IMAGE_REL_IA64_DIR64 |
0x0005 |
64-bitowa va elementu docelowego. |
IMAGE_REL_IA64_PCREL21B |
0x0006 |
Instrukcja została naprawiona z 25-bitowym przesunięciem względnym do 16-bitowego obiektu docelowego wyrównanego. Małe 4 bity przemieszczenia są zerowe i nie są przechowywane. |
IMAGE_REL_IA64_PCREL21M |
0x0007 |
Instrukcja została naprawiona z 25-bitowym przesunięciem względnym do 16-bitowego obiektu docelowego wyrównanego. Małe 4 bity przemieszczenia, które są zerowe, nie są przechowywane. |
IMAGE_REL_IA64_PCREL21F |
0x0008 |
LSB przesunięcia tej relokacji musi zawierać numer miejsca, podczas gdy reszta jest adresem pakietu. Pakiet został naprawiony z 25-bitowym przesiedleniem względnym do 16-bitowego obiektu docelowego wyrównanego. Małe 4 bity przemieszczenia są zerowe i nie są przechowywane. |
IMAGE_REL_IA64_GPREL22 |
0x0009 |
Po relokacji instrukcji można wykonać relokację ADDEND, której wartość jest dodawana do adresu docelowego, a następnie 22-bitowe przesunięcie względne GP, które jest obliczane i stosowane do pakietu GPREL22. |
IMAGE_REL_IA64_LTOFF22 |
0x000A |
Instrukcja została naprawiona z 22-bitowym przesunięciem względnym gp do wpisu tabeli literału symbolu docelowego. Konsolidator tworzy ten wpis tabeli literału na podstawie tej relokacji i relokacji ADDEND, które mogą być obserwowane. |
IMAGE_REL_IA64_SECTION |
0x000B |
16-bitowy indeks sekcji sekcji zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_IA64_SECREL22 |
0x000C |
Instrukcja została naprawiona z 22-bitowym przesunięciem obiektu docelowego od początku jego sekcji. Po tej relokacji można natychmiast wykonać relokację ADDEND, której pole Value zawiera 32-bitowe niepodpisane przesunięcie wartości docelowej od początku sekcji. |
IMAGE_REL_IA64_SECREL64I |
0x000D |
Numer miejsca dla tej relokacji musi być jeden (1). Instrukcja została naprawiona z 64-bitowym przesunięciem obiektu docelowego od początku jego sekcji. Po tej relokacji można natychmiast wykonać relokację ADDEND, której pole Value zawiera 32-bitowe niepodpisane przesunięcie wartości docelowej od początku sekcji. |
IMAGE_REL_IA64_SECREL32 |
0x000E |
Adres danych, które mają być naprawione z 32-bitowym przesunięciem obiektu docelowego od początku jego sekcji. |
IMAGE_REL_IA64_DIR32NB |
0x0010 |
Docelowy 32-bitowy RVA. |
IMAGE_REL_IA64_SREL14 |
0x0011 |
Jest to stosowane do podpisanego 14-bitowego natychmiastowego, który zawiera różnicę między dwoma obiektami docelowymi, które można przenieść. Jest to pole deklaratywne konsolidatora, które wskazuje, że kompilator już emitował tę wartość. |
IMAGE_REL_IA64_SREL22 |
0x0012 |
Jest to stosowane do podpisanej 22-bitowej bezpośredniej, która zawiera różnicę między dwoma obiektami docelowymi, które można przenieść. Jest to pole deklaratywne konsolidatora, które wskazuje, że kompilator już emitował tę wartość. |
IMAGE_REL_IA64_SREL32 |
0x0013 |
Jest to stosowane do podpisanej 32-bitowej bezpośredniej, która zawiera różnicę między dwiema wartościami, które można przenieść. Jest to pole deklaratywne konsolidatora, które wskazuje, że kompilator już emitował tę wartość. |
IMAGE_REL_IA64_UREL32 |
0x0014 |
Jest to stosowane do niepodpisanego 32-bitowego natychmiastowego, który zawiera różnicę między dwiema wartościami, które można przenieść. Jest to pole deklaratywne konsolidatora, które wskazuje, że kompilator już emitował tę wartość. |
IMAGE_REL_IA64_PCREL60X |
0x0015 |
60-bitowa poprawka względna komputera, która zawsze pozostaje instrukcją BRL pakietu MLX. |
IMAGE_REL_IA64_PCREL60B |
0x0016 |
60-bitowa poprawka względna komputera. Jeśli przemieszczenie docelowe mieści się w podpisanym polu 25-bitowym, przekonwertuj cały pakiet na pakiet MBB z NOP. B w gniazdach 1 i 25-bitowej instrukcji BR (z 4 najniższymi bitami wszystkie zero i porzucone) w miejscu 2. |
IMAGE_REL_IA64_PCREL60F |
0x0017 |
60-bitowa poprawka względna komputera. Jeśli przemieszczenie docelowe mieści się w podpisanym polu 25-bitowym, przekonwertuj cały pakiet na pakiet MFB z NOP. F w gniazdach 1 i 25-bitowych (4 najniższe bity wszystkie zero i porzucone) instrukcji BR w miejscu 2. |
IMAGE_REL_IA64_PCREL60I |
0x0018 |
60-bitowa poprawka względna komputera. Jeśli przemieszczenie docelowe mieści się w podpisanym polu 25-bitowym, przekonwertuj cały pakiet na pakiet MIB z NOP. I w slot 1 i 25-bitowy (4 najniższe bity wszystkie zero i porzucone) instrukcji BR w miejscu 2. |
IMAGE_REL_IA64_PCREL60M |
0x0019 |
60-bitowa poprawka względna komputera. Jeśli przemieszczenie docelowe mieści się w podpisanym polu 25-bitowym, przekonwertuj cały pakiet na pakiet MMB z NOP. M w gniazdach 1 i 25-bitowych (4 najniższe bity wszystkie zero i porzucone) instrukcji BR w miejscu 2. |
IMAGE_REL_IA64_IMMGPREL64 |
0x001a |
64-bitowa poprawka względna gp. |
IMAGE_REL_IA64_TOKEN |
0x001b |
Token CLR. |
IMAGE_REL_IA64_GPREL32 |
0x001c |
32-bitowa poprawka względna gp. |
IMAGE_REL_IA64_ADDEND |
0x001F |
Relokacja jest prawidłowa tylko wtedy, gdy natychmiast następuje jedna z następujących relokacji: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I lub SECREL32. Jego wartość zawiera dodatek do zastosowania do instrukcji w pakiecie, a nie dla danych. |
Procesory MIPS
Następujące wskaźniki typów relokacji są definiowane dla procesorów MIPS.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_MIPS_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_MIPS_REFHALF |
0x0001 |
Wysokie 16 bitów 32-bitowej va celu. |
IMAGE_REL_MIPS_REFWORD |
0x0002 |
32-bitowa va elementu docelowego. |
IMAGE_REL_MIPS_JMPADDR |
0x0003 |
Niskie 26 bitów oceny luk w zabezpieczeniach celu. Obsługuje to instrukcje MIPS J i JAL. |
IMAGE_REL_MIPS_REFHI |
0x0004 |
Wysokie 16 bitów 32-bitowej va celu. Jest to używane w pierwszej instrukcji w sekwencji dwóch instrukcji, która ładuje pełny adres. Po tej relokacji należy natychmiast wykonać relokację PAIR, której właściwość SymbolTableIndex zawiera podpisane 16-bitowe przemieszczenie, które jest dodawane do górnych 16 bitów pobranych z lokalizacji, która jest przenoszona. |
IMAGE_REL_MIPS_REFLO |
0x0005 |
Niskie 16 bitów oceny luk w zabezpieczeniach celu. |
IMAGE_REL_MIPS_GPREL |
0x0006 |
16-bitowe przemieszczenie obiektu docelowego względem rejestru GP. |
IMAGE_REL_MIPS_LITERAL |
0x0007 |
Tak samo jak IMAGE_REL_MIPS_GPREL. |
IMAGE_REL_MIPS_SECTION |
0x000A |
16-bitowy indeks sekcji sekcji zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_MIPS_SECREL |
0x000B |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_MIPS_SECRELLO |
0x000C |
Niskie 16 bitów 32-bitowego przesunięcia celu od początku jego sekcji. |
IMAGE_REL_MIPS_SECRELHI |
0x000D |
Wysokie 16 bitów 32-bitowego przesunięcia celu od początku jego sekcji. Relokacja IMAGE_REL_MIPS_PAIR musi natychmiast postępować zgodnie z tym. SymbolTableIndex relokacji PAIR zawiera podpisane 16-bitowe przemieszczenie, które jest dodawane do górnych 16 bitów pobranych z lokalizacji, która jest przenoszona. |
IMAGE_REL_MIPS_JMPADDR16 |
0x0010 |
Niskie 26 bitów oceny luk w zabezpieczeniach celu. Obsługuje to instrukcje MIPS16 JAL. |
IMAGE_REL_MIPS_REFWORDNB |
0x0022 |
Docelowy 32-bitowy RVA. |
IMAGE_REL_MIPS_PAIR |
0x0025 |
Relokacja jest ważna tylko wtedy, gdy natychmiast następuje relokacja REFHI lub SECRELHI. Obiekt SymbolTableIndex zawiera przemieszczenie, a nie indeks do tabeli symboli. |
Mitsubishi M32R
Następujące wskaźniki typu relokacji są zdefiniowane dla procesorów Mitsubishi M32R.
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_M32R_ABSOLUTE |
0x0000 |
Relokacja jest ignorowana. |
IMAGE_REL_M32R_ADDR32 |
0x0001 |
32-bitowa va elementu docelowego. |
IMAGE_REL_M32R_ADDR32NB |
0x0002 |
Docelowy 32-bitowy RVA. |
IMAGE_REL_M32R_ADDR24 |
0x0003 |
24-bitowa va obiektu docelowego. |
IMAGE_REL_M32R_GPREL16 |
0x0004 |
16-bitowe przesunięcie celu z rejestru GP. |
IMAGE_REL_M32R_PCREL24 |
0x0005 |
Przesunięcie 24-bitowe obiektu docelowego z licznika programu (PC), przesunięte w lewo o 2 bity i rozszerzone znaki |
IMAGE_REL_M32R_PCREL16 |
0x0006 |
16-bitowe przesunięcie obiektu docelowego z komputera, przesunięte w lewo o 2 bity i rozszerzone znaki |
IMAGE_REL_M32R_PCREL8 |
0x0007 |
Przesunięcie 8-bitowe obiektu docelowego z komputera, przesunięte w lewo o 2 bity i rozszerzone znaki |
IMAGE_REL_M32R_REFHALF |
0x0008 |
16 MSB docelowego va. |
IMAGE_REL_M32R_REFHI |
0x0009 |
16 MSB docelowego va, dostosowane do rozszerzenia podpisywania LSB. Jest to używane na potrzeby pierwszej instrukcji w dwuastruktowej sekwencji, która ładuje pełny adres 32-bitowy. Po tej relokacji należy natychmiast wykonać relokację PAIR, której właściwość SymbolTableIndex zawiera podpisane 16-bitowe przemieszczenie, które jest dodawane do górnych 16 bitów pobranych z lokalizacji, która jest przenoszona. |
IMAGE_REL_M32R_REFLO |
0x000A |
16 LSB docelowej va. |
IMAGE_REL_M32R_PAIR |
0x000B |
Relokacja musi być zgodna z relokacją REFHI. Obiekt SymbolTableIndex zawiera przemieszczenie, a nie indeks do tabeli symboli. |
IMAGE_REL_M32R_SECTION |
0x000C |
Indeks sekcji 16-bitowej sekcji, który zawiera element docelowy. Służy do obsługi informacji debugowania. |
IMAGE_REL_M32R_SECREL |
0x000D |
32-bitowe przesunięcie celu od początku jego sekcji. Służy to do obsługi informacji debugowania i magazynu lokalnego wątku statycznego. |
IMAGE_REL_M32R_TOKEN |
0x000E |
Token CLR. |
Numery wierszy COFF (przestarzałe)
Numery wierszy COFF nie są już produkowane i w przyszłości nie zostaną zużyte.
Numery wierszy COFF wskazują relację między numerami kodu i wierszy w plikach źródłowych. Format firmy Microsoft dla numerów wierszy COFF jest podobny do standardowego COFF, ale został rozszerzony, aby umożliwić jednej sekcji powiązanie z numerami wierszy w wielu plikach źródłowych.
Numery wierszy COFF składają się z tablicy rekordów o stałej długości. Lokalizacja (przesunięcie pliku) i rozmiar tablicy są określone w nagłówku sekcji. Każdy rekord liczby wierszy ma następujący format.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Typ (*) |
Jest to związek dwóch pól: SymbolTableIndex i VirtualAddress. Niezależnie od tego, czy jest używana właściwość SymbolTableIndex czy RVA, zależy od wartości lnumber. |
4 |
2 |
Linenumber |
Jeśli to pole nie jestzerowe, określa jeden oparty na wierszu numer. Gdy zero, pole Typ jest interpretowane jako indeks tabeli symboli dla funkcji. |
Pole Typ jest połączeniem dwóch pól 4-bajtowych: SymbolTableIndex i VirtualAddress.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
SymbolTableIndex |
Używany, gdy element Linenumber ma wartość zero: indeks do symboli wpisu tabeli dla funkcji. Ten format służy do wskazywania funkcji, do której odwołuje się grupa rekordów numerów wiersza. |
0 |
4 |
VirtualAddress |
Używany, gdy element Linenumber jest inny niż zero: RVA kodu wykonywalnego, który odpowiada wskazanej linii źródłowej. W pliku obiektu zawiera va w sekcji . |
Rekord liczby wierszy może ustawić pole Linenumber na zero i wskazać definicję funkcji w tabeli symboli lub może działać jako standardowy wpis numeru wiersza, dając dodatnią liczbę całkowitą (numer wiersza) i odpowiadający adres w kodzie obiektu.
Grupa wpisów z liczbą wierszy zawsze zaczyna się od pierwszego formatu: indeks symbolu funkcji. Jeśli jest to pierwszy rekord numeru wiersza w sekcji, jest to również nazwa symbolu COMDAT dla funkcji, jeśli flaga COMDAT sekcji jest ustawiona. Zobacz sekcje COMDAT (tylko obiekt). Pomocniczy rekord funkcji w tabeli symboli ma wskaźnik do pola Linenumber, które wskazuje ten sam rekord liczby wierszy.
Po rekordzie identyfikującym funkcję następuje dowolna liczba wpisów z liczbą wierszy, które dają rzeczywiste informacje o numerze wiersza (czyli wpisy z elementem Lnianym większym niż zero). Te wpisy są oparte na jednym względem początku funkcji i reprezentują każdy wiersz źródłowy w funkcji z wyjątkiem pierwszego wiersza.
Na przykład pierwszy rekord liczby wierszy dla poniższego przykładu określa funkcję ReverseSign (SymbolTableIndex elementu ReverseSign i Linenumber ustawioną na zero). Następnie rekordy z wartościami 1, 2 i 3 będą zgodne z wierszami źródłowymi, jak pokazano poniżej:
// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2: return -1 * i;
3: }
Tabela symboli COFF
Tabela symboli w tej sekcji jest dziedziczona z tradycyjnego formatu COFF. Różni się on od informacji debugowania programu Microsoft Visual C++. Plik może zawierać zarówno tabelę symboli COFF, jak i informacje debugowania języka Visual C++, a dwa są przechowywane oddzielnie. Niektóre narzędzia firmy Microsoft używają tabeli symboli do ograniczonych, ale ważnych celów, takich jak przekazywanie informacji COMDAT do konsolidatora. Nazwy sekcji i nazwy plików, a także symbole kodu i danych, są wymienione w tabeli symboli.
Lokalizacja tabeli symboli jest wskazana w nagłówku COFF.
Tabela symboli jest tablicą rekordów o długości 18 bajtów. Każdy rekord jest standardowym lub pomocniczym rekordem tabeli symboli. Rekord standardowy definiuje symbol lub nazwę i ma następujący format.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
8 |
Nazwa (*) |
Nazwa symbolu reprezentowana przez unię trzech struktur. Tablica 8 bajtów jest używana, jeśli nazwa nie jest dłuższa niż 8 bajtów. Aby uzyskać więcej informacji, zobacz Reprezentacja nazwy symboli. |
8 |
4 |
Wartość |
Wartość skojarzona z symbolem. Interpretacja tego pola zależy od sekcjiNumber i StorageClass. Typowym znaczeniem jest adres, który można przenieść. |
12 |
2 |
Numer sekcji |
Podpisana liczba całkowita identyfikująca sekcję przy użyciu indeksu jedno opartego na tabeli sekcji. Niektóre wartości mają specjalne znaczenie, zgodnie z definicją w sekcji 5.4.2 "Wartości liczb sekcji". |
14 |
2 |
Typ |
Liczba reprezentująca typ. Narzędzia firmy Microsoft ustawiają to pole na 0x20 (funkcja) lub 0x0 (a nie funkcję). Aby uzyskać więcej informacji, zobacz Type Representation. |
16 |
1 |
StorageClass |
Wyliczona wartość reprezentująca klasę magazynu. Aby uzyskać więcej informacji, zobacz Storage Class. |
17 |
1 |
NumberOfAuxSymbols |
Liczba wpisów tabeli symboli pomocniczych, które są zgodne z tym rekordem. |
Zero lub więcej pomocniczych rekordów tabeli symboli natychmiast podąża za każdym standardowym rekordem tabeli symboli. Jednak zwykle nie więcej niż jeden pomocniczy rekord tabeli symboli jest zgodny ze standardowym rekordem tabeli symboli (z wyjątkiem rekordów plików z długimi nazwami plików). Każdy rekord pomocniczy ma taki sam rozmiar jak standardowy rekord tabeli symboli (18 bajtów), ale zamiast definiować nowy symbol, rekord pomocniczy udostępnia dodatkowe informacje na temat ostatniego zdefiniowanego symbolu. Wybór kilku formatów do użycia zależy od pola StorageClass. Obecnie zdefiniowane formaty dla pomocniczych rekordów tabeli symboli są wyświetlane w sekcji 5.5 "Pomocnicze rekordy symboli".
Narzędzia odczytujące tabele symboli COFF muszą ignorować pomocnicze rekordy symboli, których interpretacja jest nieznana. Umożliwia to rozszerzenie formatu tabeli symboli w celu dodania nowych rekordów pomocniczych bez przerywania istniejących narzędzi.
Reprezentacja nazwy symboli
Pole ShortName w tabeli symboli składa się z 8 bajtów, które zawierają samą nazwę, jeśli nie jest więcej niż 8 bajtów, lub pole ShortName daje przesunięcie do tabeli ciągów. Aby określić, czy podano samą nazwę, czy przesunięcie, przetestuj pierwsze 4 bajty pod kątem równości do zera.
Zgodnie z konwencją nazwy są traktowane jako ciągi kodowane zero-terminated UTF-8.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
8 |
ShortName |
Tablica z 8 bajtami. Ta tablica jest dopełniona wartościami null po prawej stronie, jeśli nazwa jest mniejsza niż 8 bajtów. |
0 |
4 |
Zera |
Pole ustawione na wszystkie zera, jeśli nazwa jest dłuższa niż 8 bajtów. |
4 |
4 |
Przesunięcie |
Przesunięcie do tabeli ciągów. |
Wartości liczb sekcji
Zwykle pole Wartość sekcji we wpisie tabeli symboli jest indeksem opartym na jednej tabeli sekcji. Jednak to pole jest podpisaną liczbą całkowitą i może przyjmować wartości ujemne. Następujące wartości, mniejsze niż jeden, mają specjalne znaczenie.
Stały | Wartość | Opis |
---|---|---|
IMAGE_SYM_UNDEFINED |
0 |
Rekord symbolu nie jest jeszcze przypisany do sekcji. Wartość zero wskazuje, że odwołanie do symbolu zewnętrznego jest definiowane gdzie indziej. Wartość niezerowa jest typowym symbolem o rozmiarze określonym przez wartość. |
IMAGE_SYM_ABSOLUTE |
-1 |
Symbol ma wartość bezwzględną (nieprzydzielaną) i nie jest adresem. |
IMAGE_SYM_DEBUG |
-2 |
Symbol zawiera ogólne informacje o typie lub debugowaniu, ale nie odpowiada sekcji. Narzędzia firmy Microsoft używają tego ustawienia wraz z rekordami plików (file class FILE). |
Reprezentacja typu
Pole Typ wpisu tabeli symboli zawiera 2 bajty, gdzie każdy bajt reprezentuje informacje o typie. LSB reprezentuje prosty (podstawowy) typ danych, a MSB reprezentuje typ złożony, jeśli istnieje:
MSB | LSB |
---|---|
Typ złożony: brak, wskaźnik, funkcja, tablica. |
Typ podstawowy: liczba całkowita, zmiennoprzecinkowa itd. |
Następujące wartości są definiowane dla typu podstawowego, chociaż narzędzia firmy Microsoft zazwyczaj nie używają tego pola i ustawiają LSB na 0. Zamiast tego informacje debugowania języka Visual C++ są używane do wskazywania typów. Jednak możliwe wartości COFF są wymienione tutaj pod kątem kompletności.
Stały | Wartość | Opis |
---|---|---|
IMAGE_SYM_TYPE_NULL |
0 |
Brak informacji o typie ani nieznanym typie podstawowym. Narzędzia firmy Microsoft używają tego ustawienia |
IMAGE_SYM_TYPE_VOID |
1 |
Brak prawidłowego typu; używane z wskaźnikami i funkcjami void |
IMAGE_SYM_TYPE_CHAR |
2 |
Znak (podpisany bajt) |
IMAGE_SYM_TYPE_SHORT |
3 |
Liczba całkowita ze znakiem 2 bajtów |
IMAGE_SYM_TYPE_INT |
4 |
Naturalny typ liczb całkowitych (zwykle 4 bajty w systemie Windows) |
IMAGE_SYM_TYPE_LONG |
5 |
Liczba całkowita ze znakiem 4 bajtów |
IMAGE_SYM_TYPE_FLOAT |
6 |
Liczba zmiennoprzecinkowa 4-bajtowa |
IMAGE_SYM_TYPE_DOUBLE |
7 |
Liczba zmiennoprzecinkowa 8-bajtowa |
IMAGE_SYM_TYPE_STRUCT |
8 |
Struktura |
IMAGE_SYM_TYPE_UNION |
9 |
Związek |
IMAGE_SYM_TYPE_ENUM |
10 |
Typ wyliczony |
IMAGE_SYM_TYPE_MOE |
11 |
Element członkowski wyliczenia (określona wartość) |
IMAGE_SYM_TYPE_BYTE |
12 |
Bajt; bez znaku 1-bajtowa liczba całkowita |
IMAGE_SYM_TYPE_WORD |
13 |
Wyraz; liczba całkowita bez znaku 2-bajtowego |
IMAGE_SYM_TYPE_UINT |
14 |
Niepodpisane liczby całkowite o rozmiarze naturalnym (zwykle, 4 bajty) |
IMAGE_SYM_TYPE_DWORD |
15 |
Liczba całkowita bez znaku 4-bajtowego |
Najbardziej znaczący bajt określa, czy symbol jest wskaźnikiem, funkcją zwracaną lub tablicą typu podstawowego określonego w LSB. Narzędzia firmy Microsoft używają tego pola tylko do wskazania, czy symbol jest funkcją, tak aby jedyne dwie wynikowe wartości 0x0 i 0x20 dla pola Typ. Jednak inne narzędzia mogą używać tego pola do przekazywania dodatkowych informacji.
Bardzo ważne jest prawidłowe określenie atrybutu funkcji. Te informacje są wymagane do poprawnego łączenia przyrostowego. W przypadku niektórych architektur informacje mogą być wymagane w innych celach.
Stały | Wartość | Opis |
---|---|---|
IMAGE_SYM_DTYPE_NULL |
0 |
Brak typu pochodnego; symbol jest prostą zmienną skalarną. |
IMAGE_SYM_DTYPE_POINTER |
1 |
Symbol jest wskaźnikiem do typu podstawowego. |
IMAGE_SYM_DTYPE_FUNCTION |
2 |
Symbol jest funkcją zwracającą typ podstawowy. |
IMAGE_SYM_DTYPE_ARRAY |
3 |
Symbol jest tablicą typu podstawowego. |
Klasa magazynu
Pole StorageClass tabeli symboli wskazuje, jaki rodzaj definicji reprezentuje symbol. W poniższej tabeli przedstawiono możliwe wartości. Pamiętaj, że pole StorageClass jest niepodpisaną 1-bajtową liczbą całkowitą. W związku z tym należy przyjąć wartość specjalną -1 oznaczać jego niepodpisany odpowiednik, 0xFF.
Chociaż tradycyjny format COFF używa wielu wartości klasy magazynu, narzędzia firmy Microsoft korzystają z formatu debugowania Visual C++ dla większości informacji symbolicznych i zwykle używają tylko czterech wartości klasy magazynu: EXTERNAL (2), STATIC (3), FUNCTION (101) i FILE (103). Z wyjątkiem drugiego nagłówka kolumny poniżej należy podjąć "Wartość", aby oznaczać pole Value rekordu symbolu (którego interpretacja zależy od liczby znalezionej jako klasa magazynu).
Stały | Wartość | Opis/interpretacja pola Wartość |
---|---|---|
IMAGE_SYM_CLASS_END_OF_FUNCTION |
-1 (0xFF) |
Specjalny symbol reprezentujący koniec funkcji na potrzeby debugowania. |
IMAGE_SYM_CLASS_NULL |
0 |
Brak przypisanej klasy magazynu. |
IMAGE_SYM_CLASS_AUTOMATIC |
1 |
Zmienna automatyczna (stosu). Pole Wartość określa przesunięcie ramki stosu. |
IMAGE_SYM_CLASS_EXTERNAL |
2 |
Wartość używana przez narzędzia firmy Microsoft dla symboli zewnętrznych. Pole Wartość wskazuje rozmiar, jeśli numer sekcji jest IMAGE_SYM_UNDEFINED (0). Jeśli numer sekcji nie ma wartości zero, pole Wartość określa przesunięcie w sekcji. |
IMAGE_SYM_CLASS_STATIC |
3 |
Przesunięcie symbolu w sekcji. Jeśli pole Wartość ma wartość zero, symbol reprezentuje nazwę sekcji. |
IMAGE_SYM_CLASS_REGISTER |
4 |
Zmienna rejestru. Pole Wartość określa numer rejestru. |
IMAGE_SYM_CLASS_EXTERNAL_DEF |
5 |
Symbol zdefiniowany zewnętrznie. |
IMAGE_SYM_CLASS_LABEL |
6 |
Etykieta kodu zdefiniowana w module. Pole Wartość określa przesunięcie symbolu w sekcji. |
IMAGE_SYM_CLASS_UNDEFINED_LABEL |
7 |
Odwołanie do etykiety kodu, która nie jest zdefiniowana. |
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT |
8 |
Składowa struktury. Pole Wartość określa n elementu członkowskiego. |
IMAGE_SYM_CLASS_ARGUMENT |
9 |
Formalny argument (parametr) funkcji. Pole Wartość określa n argumentu. |
IMAGE_SYM_CLASS_STRUCT_TAG |
10 |
Wpis tag-nazwa struktury. |
IMAGE_SYM_CLASS_MEMBER_OF_UNION |
11 |
Członek unii. Pole Wartość określa n elementu członkowskiego. |
IMAGE_SYM_CLASS_UNION_TAG |
12 |
Wpis Union tag-name. |
IMAGE_SYM_CLASS_TYPE_DEFINITION |
13 |
Wpis Typedef. |
IMAGE_SYM_CLASS_UNDEFINED_STATIC |
14 |
Deklaracja danych statycznych. |
IMAGE_SYM_CLASS_ENUM_TAG |
15 |
Wyliczony wpis nazwy tagu typu. |
IMAGE_SYM_CLASS_MEMBER_OF_ENUM |
16 |
Element członkowski wyliczenia. Pole Wartość określa n elementu członkowskiego. |
IMAGE_SYM_CLASS_REGISTER_PARAM |
17 |
Parametr rejestru. |
IMAGE_SYM_CLASS_BIT_FIELD |
18 |
Odwołanie do pola bitowego. Pole Wartość określa n-bit w polu bitowym. |
IMAGE_SYM_CLASS_BLOCK |
100 |
Rekord .bb (początek bloku) lub .eb (koniec bloku). Pole Wartość to adres lokalizacji kodu, który można przenieść. |
IMAGE_SYM_CLASS_FUNCTION |
101 |
Wartość używana przez narzędzia firmy Microsoft dla rekordów symboli definiujących zakres funkcji: begin function (.bf), end function ( .ef ) i wierszy w funkcji ( .lf). W przypadku rekordów lf pole Wartość daje liczbę wierszy źródłowych w funkcji. W przypadku rekordów .ef pole Wartość daje rozmiar kodu funkcji. |
IMAGE_SYM_CLASS_END_OF_STRUCT |
102 |
Wpis końca struktury. |
IMAGE_SYM_CLASS_FILE |
103 |
Wartość używana przez narzędzia firmy Microsoft, a także tradycyjny format COFF dla rekordu symbolu pliku źródłowego. Po symbolu następują pomocnicze rekordy, które nadają plikowi nazwę. |
IMAGE_SYM_CLASS_SECTION |
104 |
Definicja sekcji (zamiast tego narzędzia firmy Microsoft używają klasy magazynu STATIC). |
IMAGE_SYM_CLASS_WEAK_EXTERNAL |
105 |
Słaby zewnętrzny. Aby uzyskać więcej informacji, zobacz Pomocniczy format 3: Słabe zewnętrzne. |
IMAGE_SYM_CLASS_CLR_TOKEN |
107 |
Symbol tokenu CLR. Nazwa jest ciągiem ASCII, który składa się z wartości szesnastkowej tokenu. Aby uzyskać więcej informacji, zobacz CLR Token Definition (Tylko obiekt). |
Pomocnicze rekordy symboli
Pomocnicze rekordy tabeli symboli zawsze są zgodne i stosowane do niektórych standardowych rekordów tabeli symboli. Rekord pomocniczy może mieć dowolny format rozpoznawany przez narzędzia, ale dla nich należy przydzielić 18 bajtów, aby tabela symboli została zachowana jako tablica o regularnym rozmiarze. Obecnie narzędzia firmy Microsoft rozpoznają formaty pomocnicze dla następujących rodzajów rekordów: definicje funkcji, symbole rozpoczęcia i zakończenia funkcji (.bf i .ef), słabe zewnętrzne, nazwy plików i definicje sekcji.
Tradycyjny projekt COFF obejmuje również formaty rekordów pomocniczych dla tablic i struktur. Narzędzia firmy Microsoft nie używają tych narzędzi, ale zamiast tego umieszczają te symboliczne informacje w formacie debugowania języka Visual C++ w sekcjach debugowania.
Format pomocniczy 1: Definicje funkcji
Rekord tabeli symboli oznacza początek definicji funkcji, jeśli ma wszystkie następujące elementy: klasę magazynu EXTERNAL (2), wartość typu wskazującą, że jest to funkcja (0x20) i numer sekcji, który jest większy niż zero. Należy pamiętać, że rekord tabeli symboli z liczbą sekcji UNDEFINED (0) nie definiuje funkcji i nie ma rekordu pomocniczego. Po rekordach symboli definicji funkcji następuje rekord pomocniczy w formacie opisanym poniżej:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
TagIndex |
Indeks tabeli symboli odpowiedniego rekordu symbolu .bf (begin function). |
4 |
4 |
TotalSize |
Rozmiar kodu wykonywalnego dla samej funkcji. Jeśli funkcja znajduje się we własnej sekcji, parametr SizeOfRawData w nagłówku sekcji jest większy lub równy temu polu, w zależności od zagadnień dotyczących wyrównania. |
8 |
4 |
WskaźnikToLinenumber |
Przesunięcie pliku pierwszego wpisu wiersza COFF dla funkcji lub zero, jeśli nie istnieje. Aby uzyskać więcej informacji, zobacz numery wierszy COFF (przestarzałe). |
12 |
4 |
WskaźnikToNextFunction |
Indeks tabeli symboli rekordu dla następnej funkcji. Jeśli funkcja jest ostatnią wartością w tabeli symboli, to pole jest ustawione na zero. |
16 |
2 |
Nieużywane |
Format pomocniczy 2: symbole .bf i .ef
Dla każdej definicji funkcji w tabeli symboli trzy elementy opisują początek, zakończenie i liczbę wierszy. Każdy z tych symboli ma funkcję klasy magazynu (101):
Rekord symbolu o nazwie .bf (funkcja begin). Pole Wartość jest nieużywane.
Rekord symbolu o nazwie .lf (wiersze w funkcji). Pole Wartość zawiera liczbę wierszy w funkcji.
Rekord symbolu o nazwie .ef (koniec funkcji). Pole Wartość ma taką samą liczbę jak pole Total Size (Całkowity rozmiar) w rekordzie symbolu definicji funkcji.
Po rekordach symboli .bf i .ef (ale nie rekordach lf) następuje rekord pomocniczy o następującym formacie:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Nieużywane |
|
4 |
2 |
Linenumber |
Rzeczywisty numer wiersza porządkowego (1, 2, 3 itd.) w pliku źródłowym odpowiadający rekordowi bf lub ef. |
6 |
6 |
Nieużywane |
|
12 |
4 |
PointerToNextFunction ( tylko .bf) |
Indeks tabeli symboli następnego rekordu symbolu bf. Jeśli funkcja jest ostatnią wartością w tabeli symboli, to pole jest ustawione na zero. Nie jest on używany dla rekordów .ef. |
16 |
2 |
Nieużywane |
Format pomocniczy 3: słabe zewnętrzne
"Słabe zewnętrzne" to mechanizm plików obiektów, który umożliwia elastyczność w czasie łączenia. Moduł może zawierać nierozwiązany symbol zewnętrzny (sym1), ale może również zawierać rekord pomocniczy, który wskazuje, że jeśli sym1 nie jest obecny w czasie połączenia, inny symbol zewnętrzny (sym2) jest używany do rozpoznawania odwołań.
Jeśli definicja sym1 jest połączona, odwołanie zewnętrzne do symbolu jest zwykle rozpoznawane. Jeśli definicja sym1 nie jest połączona, wszystkie odwołania do słabego zewnętrznego sym1 odnoszą się zamiast tego do sym2. Symbol zewnętrzny, sym2, musi być zawsze połączony; Zazwyczaj jest on zdefiniowany w module zawierającym słabe odwołanie do sym1.
Słabe zewnętrzne są reprezentowane przez rekord tabeli symboli z klasą magazynu ZEWNĘTRZNEgo, numerem sekcji UNDEF i wartością zero. Po rekordzie symbolu słabego zewnętrznego następuje rekord pomocniczy o następującym formacie:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
TagIndex |
Indeks tabeli symboli sym2, który ma być połączony, jeśli sym1 nie zostanie znaleziony. |
4 |
4 |
Charakterystyka |
Wartość IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY wskazuje, że nie należy wykonywać wyszukiwania biblioteki sym1. Wartość IMAGE_WEAK_EXTERN_SEARCH_LIBRARY wskazuje, że należy wykonać wyszukiwanie biblioteki sym1. Wartość IMAGE_WEAK_EXTERN_SEARCH_ALIAS wskazuje, że sym1 jest aliasem sym2. |
8 |
10 |
Nieużywane |
Należy pamiętać, że pole Właściwości nie jest zdefiniowane w funkcji WINNT. H; Zamiast tego jest używane pole Total Size (Całkowity rozmiar).
Format pomocniczy 4: pliki
Ten format jest zgodny z rekordem tabeli symboli z klasą magazynu FILE (103). Sama nazwa symbolu powinna mieć wartość .file, a następujący po nim rekord pomocniczy nadaje nazwę pliku kodu źródłowego.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
18 |
Nazwa pliku |
Ciąg ANSI, który nadaje nazwę pliku źródłowego. Ta wartość jest dopełniona wartościami null, jeśli jest mniejsza niż maksymalna długość. |
Format pomocniczy 5: definicje sekcji
Ten format jest zgodny z rekordem tabeli symboli definiującym sekcję. Taki rekord ma nazwę symbolu, która jest nazwą sekcji (takiej jak .text lub .drectve) i ma klasę magazynu STATIC (3). Rekord pomocniczy zawiera informacje o sekcji, do której się odwołuje. W związku z tym duplikuje niektóre informacje w nagłówku sekcji.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Długość |
Rozmiar danych sekcji; tak samo jak SizeOfRawData w nagłówku sekcji. |
4 |
2 |
NumberOfRelocations |
Liczba wpisów relokacji dla sekcji. |
6 |
2 |
NumberOfLinenumbers |
Liczba wpisów numeru wiersza dla sekcji. |
8 |
4 |
Suma kontrolna |
Suma kontrolna dla danych wspólnych. Ma zastosowanie, jeśli flaga IMAGE_SCN_LNK_COMDAT jest ustawiona w nagłówku sekcji. Aby uzyskać więcej informacji, zobacz sekcje COMDAT (tylko obiekt). |
12 |
2 |
Numer |
Indeks oparty na jednym indeksie w tabeli sekcji skojarzonej sekcji. Jest to używane, gdy ustawienie wyboru COMDAT ma wartość 5. |
14 |
1 |
Selekcja |
Numer wyboru COMDAT. Ma to zastosowanie, jeśli sekcja jest sekcją COMDAT. |
15 |
3 |
Nieużywane |
Sekcje COMDAT (tylko obiekt)
Pole Wybór formatu pomocniczego definicji sekcji ma zastosowanie, jeśli sekcja jest sekcją COMDAT. Sekcja COMDAT to sekcja, która może być zdefiniowana przez więcej niż jeden plik obiektu. (Flaga IMAGE_SCN_LNK_COMDAT jest ustawiona w polu Flagi sekcji nagłówka sekcji). Pole Wybór określa sposób, w jaki konsolidator rozpoznaje wiele definicji sekcji COMDAT.
Pierwszy symbol z wartością sekcji COMDAT musi być symbolem sekcji. Ten symbol ma nazwę sekcji, pole Wartość równe zero, numer sekcji sekcji COMDAT, którego dotyczy pytanie, pole Typ równe IMAGE_SYM_TYPE_NULL, pole Klasa równe IMAGE_SYM_CLASS_STATIC i jeden rekord pomocniczy. Drugi symbol nosi nazwę "symbol COMDAT" i jest używany przez konsolidator w połączeniu z polem Wybór.
Poniżej przedstawiono wartości pola Wybór.
Stały | Wartość | Opis |
---|---|---|
IMAGE_COMDAT_SELECT_NODUPLICATES |
1 |
Jeśli ten symbol jest już zdefiniowany, konsolidator wystawia błąd "mnożenia zdefiniowanego symbolu". |
IMAGE_COMDAT_SELECT_ANY |
2 |
Każda sekcja, która definiuje ten sam symbol COMDAT, może być połączona; pozostałe są usuwane. |
IMAGE_COMDAT_SELECT_SAME_SIZE |
3 |
Konsolidator wybiera dowolną sekcję wśród definicji tego symbolu. Jeśli wszystkie definicje nie mają tego samego rozmiaru, zostanie wyświetlony błąd "mnożenie zdefiniowanego symbolu". |
IMAGE_COMDAT_SELECT_EXACT_MATCH |
4 |
Konsolidator wybiera dowolną sekcję wśród definicji tego symbolu. Jeśli wszystkie definicje nie są dokładnie zgodne, zostanie wyświetlony błąd "mnożenie zdefiniowanego symbolu". |
IMAGE_COMDAT_SELECT_ASSOCIATIVE |
5 |
Sekcja jest połączona, jeśli jest połączona pewna inna sekcja COMDAT. Ta druga sekcja jest wskazywana przez pole Liczba pomocniczego rekordu symbolu dla definicji sekcji. To ustawienie jest przydatne w przypadku definicji, które zawierają składniki w wielu sekcjach (na przykład kod w jednym i danych w innym), ale wszystkie muszą być połączone lub odrzucone jako zestaw. Druga sekcja, z którą ta sekcja jest skojarzona, musi być sekcją COMDAT, która może być inną sekcją skojarzoną COMDAT. Łańcuch skojarzeń sekcji COMDAT nie może utworzyć pętli. Łańcuch skojarzeń sekcji musi ostatecznie dojść do sekcji COMDAT, która nie ma zestawu IMAGE_COMDAT_SELECT_ASSOCIATIVE. |
IMAGE_COMDAT_SELECT_LARGEST |
6 |
Konsolidator wybiera największą definicję spośród wszystkich definicji tego symbolu. Jeśli ten rozmiar ma wiele definicji, wybór między nimi jest dowolny. |
Definicja tokenu CLR (tylko obiekt)
Ten symbol pomocniczy zwykle jest zgodny z IMAGE_SYM_CLASS_CLR_TOKEN. Służy do skojarzenia tokenu z przestrzenią nazw tabeli symboli COFF.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
1 |
bAuxType |
Musi być IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1). |
1 |
1 |
bReserved |
Zarezerwowane, musi mieć wartość zero. |
2 |
4 |
SymbolTableIndex |
Indeks symbolu symbolu COFF, do którego odwołuje się ta definicja tokenu CLR. |
6 |
12 |
Zarezerwowane, musi mieć wartość zero. |
Tabela ciągów COFF
Bezpośrednio po tabeli symboli COFF jest tabela ciągów COFF. Położenie tej tabeli można znaleźć przez pobranie adresu tabeli symboli w nagłówku COFF i dodanie liczby symboli pomnożonych przez rozmiar symbolu.
Na początku tabeli ciągów COFF znajduje się 4 bajty zawierające całkowity rozmiar (w bajtach) pozostałej części tabeli ciągów. Ten rozmiar zawiera samo pole rozmiaru, dzięki czemu wartość w tej lokalizacji będzie wynosić 4, jeśli nie ma żadnych ciągów.
Po rozmiarze są ciągi zakończone wartością null, które są wskazywane przez symbole w tabeli symboli COFF.
Tabela certyfikatów atrybutów (tylko obraz)
Certyfikaty atrybutów można skojarzyć z obrazem, dodając tabelę certyfikatów atrybutów. Tabela certyfikatów atrybutów składa się z zestawu ciągłych, wyrównowanych czworokątnie wpisów certyfikatu atrybutu. Dopełnienie zerowe jest wstawiane między oryginalnym końcem pliku a początkiem tabeli certyfikatów atrybutów w celu osiągnięcia tego wyrównania. Każdy wpis certyfikatu atrybutu zawiera następujące pola.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
dwLength |
Określa długość wpisu certyfikatu atrybutu. |
4 |
2 |
wRevision |
Zawiera numer wersji certyfikatu. Aby uzyskać szczegółowe informacje, zobacz następujący tekst. |
6 |
2 |
wCertificateType |
Określa typ zawartości w bCertificate. Aby uzyskać szczegółowe informacje, zobacz następujący tekst. |
8 |
Zobacz następujące informacje |
bCertyfikat |
Zawiera certyfikat, taki jak podpis Authenticode. Aby uzyskać szczegółowe informacje, zobacz następujący tekst. |
Wartość adresu wirtualnego z wpisu Tabela certyfikatów w opcjonalnym katalogu danych nagłówka jest przesunięciem pliku do pierwszego wpisu certyfikatu atrybutu. Dostęp do kolejnych wpisów jest uzyskiwany przez przejście do ciągu dwLength bajtów wpisu, zaokrąglone do wielokrotności 8-bajtowej od początku wpisu certyfikatu bieżącego atrybutu. Trwa to do momentu, aż suma zaokrąglonych wartości dwLength jest równa wartości Size z wpisu Tabeli certyfikatów w opcjonalnym katalogu danych nagłówka. Jeśli suma zaokrąglonych wartości dwLength nie jest równa wartości Rozmiar, tabela certyfikatów atrybutów lub pole Rozmiar jest uszkodzone.
Jeśli na przykład opcjonalny wpis tabeli certyfikatów katalogu danych nagłówka zawiera:
virtual address = 0x5000
size = 0x1000
Pierwszy certyfikat rozpoczyna się od przesunięcia 0x5000 od początku pliku na dysku. Aby przejść przez wszystkie wpisy certyfikatu atrybutu:
- Dodaj wartość dwLength pierwszego certyfikatu atrybutu do przesunięcia początkowego.
- Zaokrąglij wartość z kroku 1 do najbliższej wielokrotności 8 bajtów, aby znaleźć przesunięcie drugiego wpisu certyfikatu atrybutu.
- Dodaj wartość przesunięcia z kroku 2 do wartości dwLength wpisu certyfikatu drugiego atrybutu i zaokrąglij do najbliższej wielokrotności 8 bajtów, aby określić przesunięcie wpisu certyfikatu trzeciego atrybutu.
- Powtórz krok 3 dla każdego kolejnego certyfikatu, dopóki obliczone przesunięcie nie będzie równe 0x6000 (0x5000 rozpoczęcie + 0x1000 całkowity rozmiar), co oznacza, że cała tabela została przejeżżona.
Alternatywnie można wyliczyć wpisy certyfikatu, wywołując funkcję Win32 ImageEnumerateCertificates w pętli. Aby uzyskać link do strony referencyjnej funkcji, zobacz References.
Wpisy tabeli certyfikatów atrybutów mogą zawierać dowolny typ certyfikatu, o ile wpis ma poprawną wartość dwLength, unikatową wartość wRevision i unikatową wartość wCertificateType. Najczęstszym typem wpisu tabeli certyfikatów jest struktura WIN_CERTIFICATE, która jest udokumentowana w pliku Wintrust.h i omówiona w pozostałej części tej sekcji.
Opcje WIN_CERTIFICATE wRevision elementu członkowskiego obejmują (ale nie tylko) następujące.
Wartość | Nazwa | Notatki |
---|---|---|
0x0100 |
WIN_CERT_REVISION_1_0 |
Wersja 1, starsza wersja struktury Win_Certificate. Jest ona obsługiwana tylko na potrzeby weryfikowania starszych podpisów Authenticode |
0x0200 |
WIN_CERT_REVISION_2_0 |
Wersja 2 to bieżąca wersja struktury Win_Certificate. |
Opcje WIN_CERTIFICATE wCertificateType elementu członkowskiego obejmują (ale nie tylko) elementy w poniższej tabeli. Pamiętaj, że niektóre wartości nie są obecnie obsługiwane.
Wartość | Nazwa | Notatki |
---|---|---|
0x0001 |
WIN_CERT_TYPE_X509 |
bCertificate zawiera certyfikat X.509 Nieobsługiwane |
0x0002 |
WIN_CERT_TYPE_PKCS_SIGNED_DATA |
bCertificate zawiera strukturę PKCS#7 SignedData |
0x0003 |
WIN_CERT_TYPE_RESERVED_1 |
Zastrzeżony |
0x0004 |
WIN_CERT_TYPE_TS_STACK_SIGNED |
Podpisywanie certyfikatu stosu protokołu serwera terminali Nieobsługiwane |
Element członkowski struktury WIN_CERTIFICATE zawiera tablicę bajtów o zmiennej długości z typem zawartości określonym przez wCertificateType. Typ obsługiwany przez aplikację Authenticode to WIN_CERT_TYPE_PKCS_SIGNED_DATA, struktura PKCS#7 SignedData. Aby uzyskać szczegółowe informacje na temat formatu podpisu cyfrowego Authenticode, zobacz Windows Authenticode Portable Executable Signature Format.
Jeśli bCertificate zawartości nie kończy się na granicy czworokąta, wpis certyfikatu atrybutu jest wypełniony zerami, od końca bCertificate do następnej granicy czworokąta.
Wartość dwLength to długość finalizowanej struktury WIN_CERTIFICATE i jest obliczana jako:
dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)
Ta długość powinna obejmować rozmiar każdego dopełnienia, który jest używany do spełnienia wymagania, że każda struktura WIN_CERTIFICATE jest wyrównana czworokąt:
dwLength += (8 - (dwLength & 7)) & 7;
Rozmiar tabeli certyfikatów określony w tabeli certyfikatów wpisu w opcjonalnych katalogów danych nagłówka (tylko obraz)— obejmuje wypełnienie.
Aby uzyskać więcej informacji na temat używania interfejsu API ImageHlp do wyliczania, dodawania i usuwania certyfikatów z plików PE, zobacz ImageHlp Functions.
Dane certyfikatu
Jak określono w poprzedniej sekcji, certyfikaty w tabeli certyfikatów atrybutów mogą zawierać dowolny typ certyfikatu. Certyfikaty, które zapewniają integralność pliku PE, mogą zawierać skrót obrazu PE.
Skrót obrazu PE (lub skrót pliku) jest podobny do sumy kontrolnej pliku w tym, że algorytm skrótu generuje skrót komunikatu, który jest związany z integralnością pliku. Jednak suma kontrolna jest generowana przez prosty algorytm i jest używana głównie do wykrywania, czy blok pamięci na dysku zniknął źle, a przechowywane tam wartości stały się uszkodzone. Skrót pliku jest podobny do sumy kontrolnej, w którym również wykrywa uszkodzenie pliku. Jednak w przeciwieństwie do większości algorytmów sumy kontrolnej bardzo trudno jest zmodyfikować plik bez zmiany skrótu pliku z oryginalnej niezmodyfikowanej wartości. Skrót pliku może zatem służyć do wykrywania zamierzonych, a nawet subtelnych modyfikacji pliku, takich jak te wprowadzone przez wirusy, hakerów lub programy koni trojańskich.
W przypadku dołączania do certyfikatu skrót obrazu musi wykluczać niektóre pola w obrazie PE, takie jak wpis sumy kontrolnej i tabeli certyfikatów w opcjonalnych katalogach danych nagłówka. Wynika to z faktu, że czynność dodawania certyfikatu zmienia te pola i spowoduje obliczenie innej wartości skrótu.
Funkcja win32 ImageGetDigestStream udostępnia strumień danych z docelowego pliku PE, z którym mają być funkcje skrótu. Ten strumień danych pozostaje spójny, gdy certyfikaty są dodawane do pliku PE lub usuwane z niego. Na podstawie parametrów przekazywanych do ImageGetDigestStreammożna pominąć inne dane z obrazu PE z obliczeń skrótu. Aby uzyskać link do strony referencyjnej funkcji, zobacz References.
Delay-Load importować tabele (tylko obraz)
Te tabele zostały dodane do obrazu w celu obsługi jednolitego mechanizmu dla aplikacji w celu opóźnienia ładowania biblioteki DLL do pierwszego wywołania tej biblioteki DLL. Układ tabel jest zgodny z tradycyjnymi tabelami importu opisanymi w sekcji 6.4, sekcja .idata. W tym miejscu omówiono tylko kilka szczegółów.
Tabela katalogów Delay-Load
Tabela katalogów delay-load jest odpowiednikiem tabeli katalogów importu. Można go pobrać za pomocą wpisu Opóźnij deskryptor importu na liście opcjonalnych katalogów danych nagłówka (przesunięcie 200). Tabela jest rozmieszczona w następujący sposób:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Atrybuty |
Musi być zero. |
4 |
4 |
Nazwa |
RVA nazwy biblioteki DLL do załadowania. Nazwa znajduje się w sekcji danych tylko do odczytu obrazu. |
8 |
4 |
Uchwyt modułu |
RVA uchwytu modułu (w sekcji danych obrazu) biblioteki DLL, która ma być ładowana z opóźnieniem. Jest on używany do przechowywania przez procedurę dostarczaną do zarządzania ładowaniem opóźnionym. |
12 |
4 |
Opóźnij tabelę adresów importu |
RVA tabeli adresów importu opóźnionego ładowania. Aby uzyskać więcej informacji, zobacz Delay Import Address Table (IAT). |
16 |
4 |
Opóźnij tabelę nazw importu |
Nazwa RVA tabeli nazw opóźnień, która zawiera nazwy importów, które mogą wymagać załadowania. Jest to zgodne z układem tabeli nazw importu. Aby uzyskać więcej informacji, zobacz Hint/Name Table. |
20 |
4 |
Tabela importu opóźnień powiązanych |
RVA tabeli adresów związanych z opóźnieniem ładowania, jeśli istnieje. |
24 |
4 |
Zwalnianie tabeli opóźniania importowania |
RVA tabeli adresów zwalniania z opóźnieniem ładowania, jeśli istnieje. Jest to dokładna kopia tabeli adresów importu opóźnienia. Jeśli obiekt wywołujący zwalnia bibliotekę DLL, ta tabela powinna zostać skopiowana z powrotem do tabeli adresów importu opóźnienia, tak aby kolejne wywołania biblioteki DLL nadal używały mechanizmu thunking poprawnie. |
28 |
4 |
Sygnatura czasowa |
Sygnatura czasowa biblioteki DLL, z którą ten obraz został powiązany. |
Tabele, do których odwołuje się ta struktura danych, są zorganizowane i sortowane tak samo, jak ich odpowiedniki są przeznaczone do tradycyjnych importów. Aby uzyskać szczegółowe informacje, zobacz sekcja .idata.
Atrybuty
Jak dotąd nie zdefiniowano flag atrybutów. Konsolidator ustawia to pole na zero na obrazie. To pole może służyć do rozszerzania rekordu przez wskazanie obecności nowych pól lub może służyć do wskazywania zachowań funkcji pomocnika opóźnienia lub zwalniania.
Nazwa
Nazwa biblioteki DLL, która ma być ładowana z opóźnieniem, znajduje się w sekcji danych tylko do odczytu obrazu. Odwołuje się do niego pole szName.
Uchwyt modułu
Uchwyt biblioteki DLL, który ma zostać załadowany, znajduje się w sekcji danych obrazu. Pole phmod wskazuje uchwyt. Podany pomocnik opóźnionego ładowania używa tej lokalizacji do przechowywania dojścia do załadowanej biblioteki DLL.
Opóźnij tabelę adresów importu
Do tabeli adresów importu opóźnienia (IAT) odwołuje się deskryptor opóźniania importowania za pośrednictwem pola PIAT. Pomocnik opóźniania ładowania aktualizuje te wskaźniki z rzeczywistymi punktami wejścia, tak aby thunks nie były już w pętli wywołującej. Dostęp do wskaźników funkcji jest uzyskiwany przy użyciu wyrażenia pINT->u1.Function
.
Opóźnij tabelę nazw importu
Tabela nazw importu opóźnienia (INT) zawiera nazwy importów, które mogą wymagać ładowania. Są one uporządkowane w taki sam sposób, jak wskaźniki funkcji w IAT. Składają się one z tych samych struktur co standardowa INT i są dostępne przy użyciu wyrażenia pINT->u1.AddressOfData->Name[0]
.
Opóźnij powiązaną tabelę adresów importu i sygnaturę czasową
Tabela adresów importu powiązanego z opóźnieniem (BIAT) to opcjonalna tabela elementów IMAGE_THUNK_DATA używanych wraz z polem sygnatury czasowej tabeli katalogów delay-load przez fazę powiązania po przetworzeniu.
Opóźnienie zwalniania tabeli adresów importu
Opóźnienie zwalniania tabeli adresów importu (UIAT) to opcjonalna tabela IMAGE_THUNK_DATA elementów, których kod zwalniania używa do obsługi jawnego żądania zwolnienia. Składa się z zainicjowanych danych w sekcji tylko do odczytu, która jest dokładną kopią oryginalnego IAT, który odniósł kod do thunks opóźnienia ładowania. Na żądanie zwolnienia można zwolnić bibliotekę, *phmod wyczyszczone i UIAT napisane przez IAT, aby przywrócić wszystko do stanu wstępnego ładowania.
Sekcje specjalne
-
sekcji debugowania
- Debug Directory (tylko obraz)
- typ debugowania
- .debug$F (tylko obiekt)
- .debug$S (tylko obiekt)
- .debug$P (tylko obiekt)
- .debug$T (tylko obiekt)
- obsługa konsolidatora Dla informacji o debugowaniu firmy Microsoft
- sekcja .drectve (tylko obiekt)
- sekcji .edata (tylko obraz)
- sekcji .idata
- sekcji pdata
- sekcji .reloc (tylko obraz)
- sekcji tls
- struktury konfiguracji ładowania (tylko obraz)
-
sekcji rsrc
- tabeli katalogów zasobów
- wpisy katalogu zasobów
- ciąg katalogu zasobów
- wprowadzania danych zasobów
- sekcji cormeta (tylko obiekt)
- sekcji sxdata
Typowe sekcje COFF zawierają kod lub dane, które konsolidatory i moduły ładujące Microsoft Win32 przetwarzają bez specjalnej wiedzy na temat zawartości sekcji. Zawartość jest odpowiednia tylko dla aplikacji, która jest połączona lub wykonywana.
Jednak niektóre sekcje COFF mają specjalne znaczenie w przypadku znalezienia w plikach obiektów lub plikach obrazów. Narzędzia i moduły ładujący rozpoznają te sekcje, ponieważ mają one specjalne flagi ustawione w nagłówku sekcji, ponieważ lokalizacje specjalne w obrazie opcjonalnym punktem nagłówka, lub ponieważ sama nazwa sekcji wskazuje specjalną funkcję sekcji. (Nawet jeśli sama nazwa sekcji nie wskazuje specjalnej funkcji sekcji, nazwa sekcji jest określana zgodnie z konwencją, więc autorzy tej specyfikacji mogą odwoływać się do nazwy sekcji we wszystkich przypadkach).
Sekcje zarezerwowane i ich atrybuty zostały opisane w poniższej tabeli, a następnie szczegółowe opisy typów sekcji, które są utrwalane w plikach wykonywalnych i typach sekcji zawierających metadane rozszerzeń.
Nazwa sekcji | Zawartość | Charakterystyka |
---|---|---|
.Bss |
Niezainicjowane dane (format bezpłatny) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.cormeta |
Metadane CLR wskazujące, że plik obiektu zawiera kod zarządzany |
IMAGE_SCN_LNK_INFO |
.dane |
Zainicjowane dane (format bezpłatny) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.debug$F |
Wygenerowane informacje debugowania obiektu FPO (tylko obiekt, architektura x86, a teraz przestarzałe) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$P |
Wstępnie skompilowane typy debugowania (tylko obiekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$S |
Symbole debugowania (tylko obiekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$T |
Typy debugowania (tylko obiekty) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.drective |
Opcje konsolidatora |
IMAGE_SCN_LNK_INFO |
.edata |
Eksportowanie tabel |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.idata |
Importowanie tabel |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.idlsym |
Zawiera zarejestrowane SEH (tylko obraz) do obsługi atrybutów IDL. Aby uzyskać informacje, zobacz "Atrybuty IDL" w references na końcu tego tematu. |
IMAGE_SCN_LNK_INFO |
.pdata |
Informacje o wyjątku |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.rdata |
Dane inicjowane tylko do odczytu |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.reloc |
Relokacje obrazów |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.rsrc |
Katalog zasobów |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.sbss |
Dane niezainicjowane względne gp (format wolny) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Flaga IMAGE_SCN_GPREL powinna być ustawiona tylko dla architektur IA64; ta flaga jest nieprawidłowa dla innych architektur. Flaga IMAGE_SCN_GPREL dotyczy tylko plików obiektów; gdy ten typ sekcji pojawi się w pliku obrazu, nie można ustawić flagi IMAGE_SCN_GPREL. |
.sdata |
Względne gp zainicjowane dane (format wolny) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL Flaga IMAGE_SCN_GPREL powinna być ustawiona tylko dla architektur IA64; ta flaga jest nieprawidłowa dla innych architektur. Flaga IMAGE_SCN_GPREL dotyczy tylko plików obiektów; gdy ten typ sekcji pojawi się w pliku obrazu, nie można ustawić flagi IMAGE_SCN_GPREL. |
.srdata |
Dane tylko do odczytu względne gp (format wolny) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL Flaga IMAGE_SCN_GPREL powinna być ustawiona tylko dla architektur IA64; ta flaga jest nieprawidłowa dla innych architektur. Flaga IMAGE_SCN_GPREL dotyczy tylko plików obiektów; gdy ten typ sekcji pojawi się w pliku obrazu, nie można ustawić flagi IMAGE_SCN_GPREL. |
.sxdata |
Zarejestrowane dane programu obsługi wyjątków (format wolny i tylko x86/obiekt) |
IMAGE_SCN_LNK_INFO Zawiera indeks symboli każdego z procedur obsługi wyjątków, do których odwołuje się kod w tym pliku obiektu. Symbolem może być symbol UNDEF lub symbol zdefiniowany w tym module. |
.Tekst |
Kod wykonywalny (dowolny format) |
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ |
.tls |
Magazyn lokalny wątku (tylko obiekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.tls$ |
Magazyn lokalny wątku (tylko obiekt) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.vsdata |
Względne gp zainicjowane dane (format wolny i tylko dla architektur ARM, SH4 i Thumb) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.xdata |
Informacje o wyjątkach (format bezpłatny) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Niektóre sekcje wymienione tutaj są oznaczone jako "tylko obiekt" lub "tylko obraz", aby wskazać, że ich specjalne semantyka są istotne tylko dla plików obiektów lub plików obrazów, odpowiednio. Sekcja oznaczona jako "tylko obraz" może nadal pojawiać się w pliku obiektu jako sposób przechodzenia do pliku obrazu, ale sekcja nie ma specjalnego znaczenia dla konsolidatora, tylko do modułu ładującego pliki obrazu.
Sekcja debugowania
Sekcja .debug jest używana w plikach obiektów do przechowywania informacji debugowania generowanych przez kompilator i w plikach obrazów zawierających wszystkie wygenerowane informacje debugowania. W tej sekcji opisano pakowanie informacji debugowania w plikach obiektów i obrazów.
W następnej sekcji opisano format katalogu debugowania, który może znajdować się w dowolnym miejscu na obrazie. W kolejnych sekcjach opisano "grupy" w plikach obiektów zawierających informacje debugowania.
Domyślną wartością konsolidatora jest to, że informacje debugowania nie są mapowane na przestrzeń adresową obrazu. Sekcja debugowania istnieje tylko wtedy, gdy informacje debugowania są mapowane w przestrzeni adresowej.
Katalog debugowania (tylko obraz)
Pliki obrazów zawierają opcjonalny katalog debugowania, który wskazuje, jaka forma informacji debugowania jest obecna i gdzie jest. Ten katalog składa się z tablicy wpisów katalogu debugowania, których lokalizacja i rozmiar są wskazywane w opcjonalnym nagłówku obrazu.
Katalog debugowania może znajdować się w odrzucalnej sekcji debugowania (jeśli istnieje) lub może zostać uwzględniony w dowolnej innej sekcji w pliku obrazu lub w ogóle nie znajdować się w sekcji.
Każdy wpis katalogu debugowania identyfikuje lokalizację i rozmiar bloku informacji debugowania. Określony punkt odzyskiwania może być zerowy, jeśli informacje debugowania nie są objęte nagłówkiem sekcji (czyli znajduje się w pliku obrazu i nie jest mapowany na przestrzeń adresową czasu wykonywania). Jeśli jest mapowany, adres RVA jest jego adresem.
Wpis katalogu debugowania ma następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Charakterystyka |
Zarezerwowane, musi mieć wartość zero. |
4 |
4 |
TimeDateStamp |
Godzina i data utworzenia danych debugowania. |
8 |
2 |
Wersja główna |
Numer wersji głównej formatu danych debugowania. |
10 |
2 |
Wersja pomocnicza |
Numer wersji pomocniczej formatu danych debugowania. |
12 |
4 |
Typ |
Format informacji debugowania. To pole umożliwia obsługę wielu debugerów. Aby uzyskać więcej informacji, zobacz Typ debugowania. |
16 |
4 |
SizeOfData |
Rozmiar danych debugowania (nie obejmuje samego katalogu debugowania). |
20 |
4 |
AddressOfRawData |
Adres danych debugowania podczas ładowania względem bazy obrazów. |
24 |
4 |
WskaźnikToRawData |
Wskaźnik pliku do danych debugowania. |
Typ debugowania
Następujące wartości są definiowane dla pola Typ wpisu katalogu debugowania:
Stały | Wartość | Opis |
---|---|---|
IMAGE_DEBUG_TYPE_UNKNOWN |
0 |
Nieznana wartość, która jest ignorowana przez wszystkie narzędzia. |
IMAGE_DEBUG_TYPE_COFF |
1 |
Informacje debugowania COFF (numery wierszy, tabela symboli i tabela ciągów). Ten typ informacji debugowania jest również wskazywany przez pola w nagłówkach plików. |
IMAGE_DEBUG_TYPE_CODEVIEW |
2 |
Informacje o debugowaniu języka Visual C++. |
IMAGE_DEBUG_TYPE_FPO |
3 |
Informacje o pomijaniu wskaźnika ramki (FPO). Te informacje informują debugera, jak interpretować niestandardowe ramki stosu, które używają rejestru EBP do celu innego niż jako wskaźnik ramki. |
IMAGE_DEBUG_TYPE_MISC |
4 |
Lokalizacja pliku DBG. |
IMAGE_DEBUG_TYPE_EXCEPTION |
5 |
Kopia sekcji pdata. |
IMAGE_DEBUG_TYPE_FIXUP |
6 |
Zastrzeżony. |
IMAGE_DEBUG_TYPE_OMAP_TO_SRC |
7 |
Mapowanie z RVA na obrazie na RVA w obrazie źródłowym. |
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC |
8 |
Mapowanie elementu RVA na obrazie źródłowym na wartość RVA na obrazie. |
IMAGE_DEBUG_TYPE_BORLAND |
9 |
Zarezerwowane dla Borland. |
IMAGE_DEBUG_TYPE_RESERVED10 |
10 |
Zastrzeżony. |
IMAGE_DEBUG_TYPE_CLSID |
11 |
Zastrzeżony. |
IMAGE_DEBUG_TYPE_REPRO |
16 |
Determinizm PE lub powtarzalność. |
Niezdefiniowany |
17 |
Informacje o debugowaniu są osadzone w pliku PE w lokalizacji określonej przez wskaźnikToRawData. |
Niezdefiniowany |
19 |
Przechowuje skrót kryptograficzny zawartości pliku symboli używanego do kompilowania pliku PE/COFF. |
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS | 20 | Bity rozszerzonej charakterystyki biblioteki DLL. |
Jeśli pole Typ jest ustawione na IMAGE_DEBUG_TYPE_FPO, debugowanie nieprzetworzonych danych jest tablicą, w której każdy element członkowski opisuje ramkę stosu funkcji. Nie każda funkcja w pliku obrazu musi mieć zdefiniowane informacje obiektu FPO, mimo że typ debugowania jest obiektem FPO. Zakłada się, że te funkcje, które nie mają informacji o obiekcie FPO, mają normalne ramki stosu. Format informacji dotyczących obiektu FPO jest następujący:
#define FRAME_FPO 0
#define FRAME_TRAP 1
#define FRAME_TSS 2
typedef struct _FPO_DATA {
DWORD ulOffStart; // offset 1st byte of function code
DWORD cbProcSize; // # bytes in function
DWORD cdwLocals; // # bytes in locals/4
WORD cdwParams; // # bytes in params/4
WORD cbProlog : 8; // # bytes in prolog
WORD cbRegs : 3; // # regs saved
WORD fHasSEH : 1; // TRUE if SEH in func
WORD fUseBP : 1; // TRUE if EBP has been allocated
WORD reserved : 1; // reserved for future use
WORD cbFrame : 2; // frame type
} FPO_DATA;
Obecność wpisu typu IMAGE_DEBUG_TYPE_REPRO wskazuje, że plik PE jest zbudowany w sposób umożliwiający osiągnięcie determinizmu lub powtarzalności. Jeśli dane wejściowe nie zmienią się, plik wyjściowy PE ma gwarancję, że bit-for-bitowy jest identyczny niezależnie od tego, kiedy lub gdzie jest generowany PE. Różne pola sygnatury daty/godziny w pliku PE są wypełniane częścią lub wszystkimi bitami z obliczonej wartości skrótu, która używa zawartości pliku PE jako danych wejściowych, a zatem nie reprezentują już rzeczywistej daty i godziny utworzenia pliku PE lub powiązanych danych w pe. Nieprzetworzone dane tego wpisu debugowania mogą być puste lub mogą zawierać obliczoną wartość skrótu poprzedzoną cztero bajtową wartością reprezentującą długość wartości skrótu.
Jeśli pole Typ jest ustawione na IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, nieprzetworzone dane debugowania zawierają rozszerzone bity właściwości biblioteki DLL, w dodatku do tych, które można ustawić w opcjonalnym nagłówku obrazu. Zobacz Charakterystyki bibliotek DLL w sekcji Opcjonalne pola nagłówka Windows-Specific (tylko obraz).
Rozszerzone cechy biblioteki DLL
Następujące wartości są definiowane dla bitów rozszerzonych cech bibliotek DLL.
Stały | Wartość | Opis |
---|---|---|
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT | 0x0001 | Obraz jest zgodny z technologią wymuszania przepływu sterowania (CET) Shadow Stack. |
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT | 0x0040 | Wszystkie obiekty docelowe gałęzi we wszystkich sekcjach kodu obrazu są oznaczone adnotacjami za pomocą instrukcji dotyczących integralności przepływu sterowania krawędzią przesyłania dalej, takich jak x86 CET-Indirect Branch Tracking (IBT) lub instrukcje identyfikacji docelowej gałęzi usługi ARM (BTI). Ten bit nie jest używany przez system Windows. |
.debug$F (tylko obiekt)
Dane w tej sekcji zostały zastąpione w programie Visual C++ w wersji 7.0 lub nowszej przez bardziej rozbudowany zestaw danych emitowanych do podsekcji .debug$S.
Pliki obiektów mogą zawierać sekcje .debug$F, których zawartość jest co najmniej jednym rekordem FPO_DATA (informacje o pominięciu wskaźnika ramki). Zobacz "IMAGE_DEBUG_TYPE_FPO" w Typ debugowania.
Konsolidator rozpoznaje te rekordy .debug$F. Jeśli są generowane informacje debugowania, konsolidator sortuje rekordy FPO_DATA według procedury RVA i generuje dla nich wpis katalogu debugowania.
Kompilator nie powinien generować rekordów obiektu FPO dla procedur, które mają standardowy format ramki.
.debug$S (tylko obiekt)
Ta sekcja zawiera informacje debugowania języka Visual C++ (informacje symboliczne).
.debug$P (tylko obiekt)
Ta sekcja zawiera informacje o debugowaniu języka Visual C++ (wstępnie skompilowane informacje). Są to typy współużytkowane między wszystkimi obiektami, które zostały skompilowane przy użyciu prekompilowanego nagłówka wygenerowanego za pomocą tego obiektu.
.debug$T (tylko obiekt)
Ta sekcja zawiera informacje o debugowaniu języka Visual C++ (informacje o typie).
Obsługa konsolidatora dla informacji o debugowaniu firmy Microsoft
Aby obsługiwać informacje debugowania, konsolidator:
Zbiera wszystkie istotne dane debugowania z .debug$F, debugowania$S, .debug$Pi .debug$T.
Przetwarza te dane wraz z informacjami debugowania wygenerowanymi przez konsolidatora w pliku PDB i tworzy wpis katalogu debugowania, aby się do niego odwoływać.
Sekcja .drectve (tylko obiekt)
Sekcja jest sekcją dyrektywy, jeśli ma flagę IMAGE_SCN_LNK_INFO ustawioną w nagłówku sekcji i ma nazwę sekcji .drectve. Konsolidator usuwa sekcję .drectve po przetworzeniu informacji, więc sekcja nie jest wyświetlana w pliku obrazu, który jest połączony.
Sekcja .drectve składa się z ciągu tekstu, który może być zakodowany jako ANSI lub UTF-8. Jeśli znacznik kolejności bajtów UTF-8 (BOM, trzy bajtowy prefiks składający się z 0xEF, 0xBB i 0xBF) nie jest obecny, ciąg dyrektywy jest interpretowany jako ANSI. Ciąg dyrektywy to seria opcji konsolidatora, które są oddzielone spacjami. Każda opcja zawiera łącznik, nazwę opcji i dowolny odpowiedni atrybut. Jeśli opcja zawiera spacje, opcja musi być ujęta w cudzysłów. Sekcja .drectve nie może mieć relokacji ani numerów wierszy.
Sekcja .edata (tylko obraz)
Sekcja eksportu danych o nazwie .edata zawiera informacje o symbolach, do których inne obrazy mogą uzyskiwać dostęp za pośrednictwem linków dynamicznych. Wyeksportowane symbole są zwykle spotykane w bibliotekach DLL, ale biblioteki DLL mogą również importować symbole.
Poniżej opisano ogólną strukturę sekcji eksportu. Opisane tabele są zwykle ciągłe w pliku w podanej kolejności (choć nie jest to wymagane). Tylko tabela katalogów eksportu i tabela adresów eksportu są wymagane do wyeksportowania symboli jako zwykłych. (Porządkowy jest eksportem, do którego uzyskuje się dostęp bezpośrednio za pomocą indeksu tabeli adresów eksportu). Tabela wskaźnika nazw, tabela porządkowa i tabela nazw eksportu istnieją do obsługi używania nazw eksportu.
Nazwa tabeli | Opis |
---|---|
Eksportowanie tabeli katalogów |
Tabela zawierająca tylko jeden wiersz (w przeciwieństwie do katalogu debugowania). Ta tabela wskazuje lokalizacje i rozmiary innych tabel eksportu. |
Eksportowanie tabeli adresów |
Tablica obiektów RVA wyeksportowanych symboli. Są to rzeczywiste adresy wyeksportowanych funkcji i danych w sekcjach kodu wykonywalnego i danych. Inne pliki obrazów mogą importować symbol przy użyciu indeksu do tej tabeli (porządkowej) lub, opcjonalnie, przy użyciu nazwy publicznej, która odpowiada porządkowi, jeśli zdefiniowano nazwę publiczną. |
Tabela wskaźnika nazw |
Tablica wskaźników do nazw eksportu publicznego posortowana w kolejności rosnącej. |
Tabela porządkowa |
Tablica zwykłych elementów odpowiadających członkom tabeli wskaźnika nazw. Korespondencja jest według pozycji; dlatego tabela wskaźnika nazw i tabela porządkowa muszą mieć taką samą liczbę elementów członkowskich. Każdy porządkowy jest indeksem w tabeli adresów eksportu. |
Eksportowanie tabeli nazw |
Seria ciągów ASCII zakończonych wartościami null. Elementy członkowskie punktu tabeli wskaźnika nazwy do tego obszaru. Te nazwy są nazwami publicznymi, za pomocą których symbole są importowane i eksportowane; nie muszą być takie same jak nazwy prywatne używane w pliku obrazu. |
Gdy inny plik obrazu importuje symbol według nazwy, moduł ładujący Win32 wyszukuje tabelę wskaźnika nazw dla pasującego ciągu. Jeśli zostanie znaleziony pasujący ciąg, skojarzona porządkowa jest identyfikowana przez wyszukanie odpowiedniego elementu członkowskiego w tabeli porządkowej (czyli składowej tabeli porządkowej z tym samym indeksem co wskaźnik ciągu znaleziony w tabeli wskaźnika nazw). Wynikowy porządkowy jest indeksem w tabeli adresów eksportu, która daje rzeczywistą lokalizację żądanego symbolu. Dostęp do każdego symbolu eksportu można uzyskać za pomocą porządkowego.
Gdy inny plik obrazu importuje symbol według porządkowych, nie trzeba przeszukiwać tabeli wskaźnika nazwy pod kątem pasującego ciągu. Bezpośrednie stosowanie porządkowego jest zatem bardziej wydajne. Jednak nazwa eksportu jest łatwiej zapamiętana i nie wymaga od użytkownika znajomości indeksu tabeli dla symbolu.
Eksportuj tabelę katalogów
Informacje o symbolu eksportu zaczynają się od tabeli katalogu eksportu, która opisuje pozostałą część informacji o symbolach eksportu. Tabela katalogów eksportu zawiera informacje o adresach używanych do rozpoznawania importów do punktów wejścia na tym obrazie.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Flagi eksportu |
Wartość zarezerwowana musi mieć wartość 0. |
4 |
4 |
Sygnatura godziny/daty |
Godzina i data utworzenia danych eksportu. |
8 |
2 |
Wersja główna |
Numer wersji głównej. Główne i pomocnicze numery wersji mogą być ustawiane przez użytkownika. |
10 |
2 |
Wersja pomocnicza |
Numer wersji pomocniczej. |
12 |
4 |
Nazwa głównej nazwy |
Adres ciągu ASCII, który zawiera nazwę biblioteki DLL. Ten adres jest względny względem bazy obrazów. |
16 |
4 |
Podstawa porządkowa |
Początkowa liczba porządkowa eksportów na tym obrazie. To pole określa początkową liczbę porządkową tabeli adresów eksportu. Zwykle jest ustawiona na 1. |
20 |
4 |
Wpisy tabeli adresów |
Liczba wpisów w tabeli adresów eksportu. |
24 |
4 |
Liczba wskaźników nazw |
Liczba wpisów w tabeli wskaźnika nazw. Jest to również liczba wpisów w tabeli porządkowej. |
28 |
4 |
Eksportuj tabelę adresów RVA |
Adres tabeli adresów eksportu względem bazy obrazów. |
32 |
4 |
Wskaźnik nazwy RVA |
Adres tabeli wskaźnika nazwy eksportu względem bazy obrazów. Rozmiar tabeli jest podawany przez pole Liczba wskaźników nazw. |
36 |
4 |
Tabela porządkowa RVA |
Adres tabeli porządkowej względem bazy obrazów. |
Eksportuj tabelę adresów
Tabela adresów eksportu zawiera adres wyeksportowanych punktów wejścia oraz wyeksportowanych danych i bezwzględnych. Liczba porządkowa jest używana jako indeks do tabeli adresów eksportu.
Każdy wpis w tabeli adresów eksportu jest polem, które używa jednego z dwóch formatów w poniższej tabeli. Jeśli określony adres nie znajduje się w sekcji eksportu (zgodnie z definicją według adresu i długości wskazanej w opcjonalnym nagłówku), pole jest eksportem RVA, który jest rzeczywistym adresem w kodzie lub danych. W przeciwnym razie pole jest usługą przesyłania dalej RVA, która nazywa symbol w innej dll.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Eksportowanie głównej bazy danych |
Adres wyeksportowanego symbolu podczas ładowania do pamięci względem bazy obrazów. Na przykład adres wyeksportowanej funkcji. |
0 |
4 |
Usługa przesyłania dalej RVA |
Wskaźnik do ciągu ASCII zakończonego wartością null w sekcji eksportu. Ten ciąg musi należeć do zakresu podanego przez wpis katalogu danych tabeli eksportu. Zobacz Opcjonalne katalogi danych nagłówka (tylko obraz). Ten ciąg zawiera nazwę biblioteki DLL i nazwę eksportu (na przykład "MYDLL.expfunc") lub nazwę biblioteki DLL oraz numer porządkowy eksportu (na przykład "MYDLL.#27"). |
Usługa przesyłania dalej RVA eksportuje definicję z innego obrazu, co sprawia, że wygląda tak, jakby były eksportowane przez bieżący obraz. W związku z tym symbol jest jednocześnie importowany i eksportowany.
Na przykład w Kernel32.dll w systemie Windows XP eksport o nazwie "HeapAlloc" jest przekazywany do ciągu "NTDLL". RtlAllocateHeap". Dzięki temu aplikacje mogą używać modułu specyficznego dla systemu Windows XP Ntdll.dll bez faktycznego przechowywania odwołań importu do niego. Tabela importu aplikacji odnosi się tylko do Kernel32.dll. W związku z tym aplikacja nie jest specyficzna dla systemu Windows XP i może działać w dowolnym systemie Win32.
Eksportuj tabelę wskaźnika nazw
Tabela wskaźnika nazwy eksportu jest tablicą adresów (RVA) do tabeli nazw eksportu. Wskaźniki są 32-bitowe i są względne względem bazy obrazu. Wskaźniki są uporządkowane leksykalnie, aby umożliwić wyszukiwanie binarne.
Nazwa eksportu jest zdefiniowana tylko wtedy, gdy tabela wskaźnika nazwy eksportu zawiera wskaźnik.
Eksportowanie tabeli porządkowej
Tabela porządkowa eksportu jest tablicą 16-bitowych indeksów bezstronnych do tabeli adresów eksportu. Reguły są stronnicze od pola Podstawa porządkowa tabeli katalogów eksportu. Innymi słowy, baza porządkowa musi zostać odejmowana od zwykłych, aby uzyskać prawdziwe indeksy do tabeli adresów eksportu.
Tabela wskaźnika nazwy eksportu i tabela porządkowa eksportu tworzą dwie równoległe tablice rozdzielone, aby umożliwić wyrównanie pól naturalnych. Te dwie tabele, w efekcie, działają jako jedna tabela, w której kolumna Export Name Pointer wskazuje na publiczną (wyeksportowaną) nazwę, a kolumna Eksportuj porządkowe nadaje odpowiednią porządkową nazwę publiczną. Element członkowski tabeli wskaźnika nazwy eksportu i składowa tabeli porządkowej eksportu są skojarzone z tą samą pozycją (indeks) w odpowiednich tablicach.
W związku z tym po przeszukaniu tabeli wskaźnika nazwy eksportu i znalezieniu pasującego ciągu w pozycji i algorytm znajdowania symbolu RVA i stronniczy porządkowy jest:
i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];
rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;
Podczas wyszukiwania symbolu przez (stronniczy) porządkowy algorytm znajdowania symbolu RVA i nazwy to:
ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);
rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];
Eksportuj tabelę nazw
Tabela nazw eksportu zawiera rzeczywiste dane ciągu wskazywane przez tabelę wskaźnika nazwy eksportu. Ciągi w tej tabeli są nazwami publicznymi, których inne obrazy mogą używać do importowania symboli. Te nazwy eksportu publicznego nie muszą być takie same jak nazwy prywatnych symboli, które symbole mają we własnym pliku obrazu i kodzie źródłowym, chociaż mogą być.
Każdy wyeksportowany symbol ma wartość porządkową, która jest tylko indeksem w tabeli adresów eksportu. Jednak użycie nazw eksportu jest opcjonalne. Niektóre, wszystkie lub żadne z wyeksportowanych symboli mogą mieć nazwy eksportu. W przypadku wyeksportowanych symboli, które mają nazwy eksportu, odpowiednie wpisy w tabeli wskaźnika nazwy eksportu i tabeli porządkowej eksportu współpracują ze sobą, aby skojarzyć każdą nazwę z porządkową.
Struktura tabeli nazw eksportu jest serią ciągów o zmiennej długości ASCII zakończonych wartościami null.
Sekcja .idata
Wszystkie pliki obrazów importujące symbole, w tym praktycznie wszystkie pliki wykonywalne (EXE), mają sekcję .idata. Typowy układ pliku dla informacji o importowaniu jest następujący:
Tabela katalogów
Wpis katalogu o wartości null
DLL1 Import Lookup Table
Zero
DLL2 Import Lookup Table
Zero
DLL3 Importowanie tabeli odnośników
Zero
tabela Hint-Name
Importowanie tabeli katalogów
Informacje o importowaniu zaczynają się od tabeli katalogów importu, która opisuje pozostałą część informacji importowania. Tabela katalogów importu zawiera informacje o adresach używanych do rozwiązywania odwołań poprawki do punktów wejścia w obrazie dll. Tabela katalogów importu składa się z tablicy wpisów katalogu importu, jednego wpisu dla każdej biblioteki DLL, do której odwołuje się obraz. Ostatni wpis katalogu jest pusty (wypełniony wartościami null), który wskazuje koniec tabeli katalogów.
Każdy wpis katalogu importu ma następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Importowanie tabeli odnośników RVA (charakterystyka) |
RVA tabeli odnośników importu. Ta tabela zawiera nazwę lub porządkową dla każdego importu. (Nazwa "Charakterystyki" jest używana w pliku Winnt.h, ale nie opisuje już tego pola). |
4 |
4 |
Sygnatura godziny/daty |
Sygnatura ustawiona na zero, dopóki obraz nie zostanie powiązany. Po powiązaniu obrazu to pole jest ustawione na sygnaturę czasową/dane biblioteki DLL. |
8 |
4 |
Łańcuch przesyłania dalej |
Indeks pierwszego odwołania do usługi przesyłania dalej. |
12 |
4 |
Nazwa głównej nazwy |
Adres ciągu ASCII, który zawiera nazwę biblioteki DLL. Ten adres jest względny względem bazy obrazów. |
16 |
4 |
Importowanie tabeli adresów RVA (tabela Thunk) |
RVA tabeli adresów importu. Zawartość tej tabeli jest identyczna z zawartością tabeli odnośników importu, dopóki obraz nie zostanie powiązany. |
Importowanie tabeli odnośników
Tabela odnośników importu to tablica 32-bitowych liczb PE32 lub tablica liczb 64-bitowych dla PE32+. Każdy wpis używa formatu pola bitowego opisanego w poniższej tabeli. W tym formacie bit 31 jest najbardziej znaczącym bitem dla PE32, a bit 63 jest najbardziej znaczącym bitem dla PE32+. Kolekcja tych wpisów opisuje wszystkie importy z danej biblioteki DLL. Ostatni wpis jest ustawiony na zero (NULL), aby wskazać koniec tabeli.
Bity | Rozmiar | Pole bitowe | Opis |
---|---|---|---|
31/63 |
1 |
Flaga porządkowa/nazwa |
Jeśli ten bit jest ustawiony, zaimportuj według porządkowych. W przeciwnym razie zaimportuj według nazwy. Bit jest maskowany jako 0x80000000 pe32, 0x8000000000000000 pe32+. |
15-0 |
16 |
Liczba porządkowa |
16-bitowa liczba porządkowa. To pole jest używane tylko wtedy, gdy pole bitowe Ordinal/Name Flaga ma wartość 1 (import by ordinal). Bity 30-15 lub 62-15 muszą mieć wartość 0. |
30-0 |
31 |
Tabela wskazówek/nazw RVA |
31-bitowa nazwa RVA wpisu tabeli wskazówek/nazw. To pole jest używane tylko wtedy, gdy pole bitu Ordinal/Name Flaga ma wartość 0 (zaimportuj według nazwy). W przypadku bitów PE32+ 62-31 musi być zero. |
Tabela wskazówek/nazw
Jedna tabela wskazówek/nazw jest wystarczająca dla całej sekcji importu. Każdy wpis w tabeli wskazówek/nazw ma następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
2 |
Aluzja |
Indeks do tabeli wskaźnika nazwy eksportu. Próba dopasowania zostanie podjęta najpierw z tą wartością. Jeśli zakończy się to niepowodzeniem, wyszukiwanie binarne jest wykonywane w tabeli wskaźnika nazwy eksportu biblioteki DLL. |
2 |
zmienna |
Nazwa |
Ciąg ASCII zawierający nazwę do zaimportowania. Jest to ciąg, który musi być dopasowany do nazwy publicznej w dll. Ten ciąg uwzględnia wielkość liter i kończy się bajtem o wartości null. |
* |
0 lub 1 |
Pad |
Końcowy bajt zera, który pojawia się po końcowym bajtie o wartości null, w razie potrzeby, w celu wyrównania następnego wpisu na granicy parzyste. |
Importowanie tabeli adresów
Struktura i zawartość tabeli adresów importu są identyczne z zawartością tabeli odnośników importu, dopóki plik nie zostanie powiązany. Podczas tworzenia powiązania wpisy w tabeli adresów importu są zastępowane za pomocą 32-bitowych (dla PE32) lub 64-bitowych (dla PE32+) adresów importowanych symboli. Te adresy są rzeczywistymi adresami pamięci symboli, chociaż technicznie są one nadal nazywane "adresami wirtualnymi". Moduł ładujący zwykle przetwarza powiązanie.
Sekcja pdata
Sekcja .pdata zawiera tablicę wpisów tabeli funkcji, które są używane do obsługi wyjątków. Wskazuje na to wpis tabeli wyjątków w katalogu danych obrazu. Wpisy muszą być sortowane zgodnie z adresami funkcji (pierwszym polem w każdej strukturze), zanim zostaną wyemitowane do obrazu końcowego. Platforma docelowa określa, które z trzech odmian formatu wpisu tabeli funkcji opisane poniżej są używane.
W przypadku 32-bitowych obrazów MIPS wpisy tabeli funkcji mają następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Adres początkowy |
Va odpowiadającej funkcji. |
4 |
4 |
Adres końcowy |
Va końca funkcji. |
8 |
4 |
Procedura obsługi wyjątków |
Wskaźnik do procedury obsługi wyjątków do wykonania. |
12 |
4 |
Dane programu obsługi |
Wskaźnik do dodatkowych informacji, które mają zostać przekazane do programu obsługi. |
16 |
4 |
Adres końcowy prologu |
Va końca prologu funkcji. |
W przypadku platform ARM, PowerPC, SH3 i SH4 systemu Windows CE wpisy tabeli funkcji mają następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Adres początkowy |
Va odpowiadającej funkcji. |
4 |
8 bitów |
Długość prologu |
Liczba instrukcji w prologu funkcji. |
4 |
22 bity |
Długość funkcji |
Liczba instrukcji w funkcji. |
4 |
1 bit |
Flaga 32-bitowa |
W przypadku ustawienia funkcja składa się z 32-bitowych instrukcji. Jeśli funkcja jest jasna, składa się z 16-bitowych instrukcji. |
4 |
1 bit |
Flaga wyjątku |
W przypadku ustawienia dla funkcji istnieje program obsługi wyjątków. W przeciwnym razie program obsługi wyjątków nie istnieje. |
W przypadku platform x64 i Itanium wpisy tabeli funkcji mają następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Adres początkowy |
RVA odpowiedniej funkcji. |
4 |
4 |
Adres końcowy |
RVA końca funkcji. |
8 |
4 |
Odwij informacje |
RVA informacji o unwind. |
Sekcja .reloc (tylko obraz)
Tabela relokacji podstawowej zawiera wpisy dla wszystkich relokacji podstawowych na obrazie. Pole Tabela relokacji podstawowej w opcjonalnych katalogach danych nagłówka zawiera liczbę bajtów w tabeli relokacji podstawowej. Aby uzyskać więcej informacji, zobacz Opcjonalne katalogi danych nagłówka (tylko obraz). Tabela relokacji podstawowej jest podzielona na bloki. Każdy blok reprezentuje relokacje podstawowe dla strony 4K. Każdy blok musi rozpoczynać się od granicy 32-bitowej.
Moduł ładujący nie jest wymagany do przetwarzania relokacji podstawowych rozpoznawanych przez konsolidator, chyba że nie można załadować obrazu ładowania w bazie obrazu określonej w nagłówku PE.
Blok relokacji podstawowej
Każdy blok relokacji podstawowej rozpoczyna się od następującej struktury:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Strona RVA |
Podstawa obrazu oraz strona RVA jest dodawana do każdego przesunięcia w celu utworzenia oceny luk w zabezpieczeniach, w której należy zastosować relokację podstawową. |
4 |
4 |
Rozmiar bloku |
Całkowita liczba bajtów w bloku relokacji podstawowej, w tym pola Page RVA i Block Size oraz pola Typ/Przesunięcie, które następują. |
Następnie pole Rozmiar bloku następuje dowolna liczba wpisów pola Typ lub Przesunięcie. Każdy wpis to WORD (2 bajty) i ma następującą strukturę:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 bity |
Typ |
Przechowywane w dużych 4 bitach programu WORD, wartość wskazująca typ relokacji podstawowej do zastosowania. Aby uzyskać więcej informacji, zobacz Podstawowe typy relokacji. |
0 |
12 bitów |
Przesunięcie |
Przechowywane w pozostałych 12 bitach programu WORD, przesunięcie od adresu początkowego określonego w polu Page RVA dla bloku. To przesunięcie określa, gdzie ma zostać zastosowana relokacja podstawowa. |
Aby zastosować relokację bazową, różnica jest obliczana między preferowanym adresem podstawowym a bazą, w której obraz jest rzeczywiście ładowany. Jeśli obraz jest ładowany w preferowanej bazie, różnica wynosi zero, a tym samym relokacje podstawowe nie muszą być stosowane.
Podstawowe typy relokacji
Stały | Wartość | Opis |
---|---|---|
IMAGE_REL_BASED_ABSOLUTE |
0 |
Relokacja podstawowa jest pomijana. Tego typu można użyć do wypełnienia bloku. |
IMAGE_REL_BASED_HIGH |
1 |
Relokacja podstawowa dodaje wysokie 16 bitów różnicy do pola 16-bitowego z przesunięciem. Pole 16-bitowe reprezentuje wysoką wartość 32-bitowego wyrazu. |
IMAGE_REL_BASED_LOW |
2 |
Relokacja podstawowa dodaje niskie 16 bitów różnicy do pola 16-bitowego z przesunięciem. Pole 16-bitowe reprezentuje niską połowę 32-bitowego słowa. |
IMAGE_REL_BASED_HIGHLOW |
3 |
Relokacja podstawowa stosuje wszystkie 32 bity różnicy do pola 32-bitowego z przesunięciem. |
IMAGE_REL_BASED_HIGHADJ |
4 |
Relokacja podstawowa dodaje wysokie 16 bitów różnicy do pola 16-bitowego z przesunięciem. Pole 16-bitowe reprezentuje wysoką wartość 32-bitowego wyrazu. Małe 16 bitów wartości 32-bitowej są przechowywane w 16-bitowym słowie, który jest zgodny z tą bazową relokacją. Oznacza to, że ta relokacja podstawowa zajmuje dwa miejsca. |
IMAGE_REL_BASED_MIPS_JMPADDR |
5 |
Interpretacja relokacji zależy od typu maszyny. Gdy typ maszyny to MIPS, podstawowa relokacja ma zastosowanie do instrukcji skoku MIPS. |
IMAGE_REL_BASED_ARM_MOV32 |
5 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to ARM lub Thumb. Relokacja podstawowa stosuje 32-bitowy adres symbolu w kolejnej parze instrukcji MOVW/MOVT. |
IMAGE_REL_BASED_RISCV_HIGH20 |
5 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to RISC-V. Relokacja podstawowa ma zastosowanie do wysokich 20 bitów 32-bitowego adresu bezwzględnego. |
6 |
Zarezerwowane, musi mieć wartość zero. |
|
IMAGE_REL_BASED_THUMB_MOV32 |
7 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to Thumb. Relokacja podstawowa stosuje 32-bitowy adres symbolu do kolejnej pary instrukcji MOVW/MOVT. |
IMAGE_REL_BASED_RISCV_LOW12I |
7 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to RISC-V. Relokacja podstawowa ma zastosowanie do małych 12 bitów 32-bitowego adresu bezwzględnego utworzonego w formacie instrukcji typu I RISC-V. |
IMAGE_REL_BASED_RISCV_LOW12S |
8 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to RISC-V. Relokacja podstawowa ma zastosowanie do niskich 12 bitów 32-bitowego adresu bezwzględnego utworzonego w formacie instrukcji typu S RISC-V. |
IMAGE_REL_BASED_LOONGARCH32_MARK_LA |
8 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to LoongArch 32-bitowy. Relokacja podstawowa ma zastosowanie do 32-bitowego adresu bezwzględnego utworzonego w dwóch kolejnych instrukcjach. |
IMAGE_REL_BASED_LOONGARCH64_MARK_LA |
8 |
Ta relokacja ma znaczenie tylko wtedy, gdy typ maszyny to LoongArch 64-bitowy. Relokacja podstawowa ma zastosowanie do 64-bitowego adresu bezwzględnego utworzonego w czterech kolejnych instrukcjach. |
IMAGE_REL_BASED_MIPS_JMPADDR16 |
9 |
Relokacja ma znaczenie tylko wtedy, gdy typ maszyny to MIPS. Relokacja podstawowa ma zastosowanie do instrukcji skoku MIPS16. |
IMAGE_REL_BASED_DIR64 |
10 |
Relokacja podstawowa stosuje różnicę do pola 64-bitowego z przesunięciem. |
Sekcja .tls
Sekcja .tls zawiera bezpośrednią obsługę protokołu PE i COFF dla magazynu lokalnego wątku statycznego (TLS). TLS to specjalna klasa magazynu obsługiwana przez system Windows, w której obiekt danych nie jest zmienną automatyczną (stos), ale jest lokalna dla każdego pojedynczego wątku, który uruchamia kod. W związku z tym każdy wątek może zachować inną wartość zmiennej zadeklarowanej przy użyciu protokołu TLS.
Należy pamiętać, że dowolna ilość danych TLS może być obsługiwana przy użyciu wywołań interfejsu API TlsAlloc, TlsFree, TlsSetValue i TlsGetValue. Implementacja PE lub COFF jest alternatywnym podejściem do korzystania z interfejsu API i ma przewagę nad prostszą wersją z punktu widzenia programisty wysokiego poziomu. Ta implementacja umożliwia definiowanie i inicjowanie danych TLS podobnie jak zwykłe zmienne statyczne w programie. Na przykład w języku Visual C++można zdefiniować statyczną zmienną TLS w następujący sposób bez korzystania z interfejsu API systemu Windows:
__declspec (thread) int tlsFlag = 1;
Aby obsługiwać tę konstrukcję programowania, sekcja PE i COFF .tls określa następujące informacje: dane inicjowania, procedury wywołania zwrotnego dla inicjowania i kończenia wątku oraz indeks TLS, które zostały wyjaśnione w poniższej dyskusji.
Nuta
Przed systemem Windows Vista statycznie zadeklarowane obiekty danych TLS mogą być używane tylko w statycznie załadowanych plikach obrazów. Ten fakt sprawia, że nie jest zawodny do używania statycznych danych TLS w bibliotece DLL, chyba że wiesz, że biblioteka DLL lub cokolwiek statycznie połączonego z nim nigdy nie będzie ładowana dynamicznie z funkcją interfejsu API LoadLibrary. Jednak począwszy od systemu Windows Vista wprowadzono ulepszenia modułu ładującego systemu Windows, aby lepiej obsługiwać dynamiczne ładowanie bibliotek DLL ze statycznym protokołem TLS. Ta zmiana oznacza, że biblioteki DLL ze statycznie zadeklarowanymi obiektami danych TLS mogą być teraz bardziej niezawodne, nawet jeśli są ładowane dynamicznie przy użyciu biblioteki LoadLibrary. Moduł ładujący może przydzielać gniazda PROTOKOŁU TLS dla takich bibliotek DLL w czasie ładowania, ograniczając ograniczenia występujące we wcześniejszych wersjach systemu Windows.
Nuta
Odwołania do 32-bitowych przesunięć i mnożników indeksu 4 dotyczą systemów z architekturami 32-bitowymi. W systemie opartym na architekturze 64-bitowej dostosuj je w razie potrzeby.
Kod wykonywalny uzyskuje dostęp do statycznego obiektu danych TLS, wykonując następujące kroki:
W czasie łączenia konsolidator ustawia pole Adres indeksu katalogu TLS. To pole wskazuje lokalizację, w której program oczekuje otrzymania indeksu TLS.
Biblioteka czasu wykonywania firmy Microsoft ułatwia ten proces, definiując obraz pamięci katalogu TLS i nadając mu specjalną nazwę "__tls_used" (platformy Intel x86) lub "_tls_used" (inne platformy). Konsolidator szuka tego obrazu pamięci i używa tam danych do utworzenia katalogu TLS. Inne kompilatory, które obsługują protokół TLS i współpracują z konsolidatorem firmy Microsoft, muszą używać tej samej techniki.
Po utworzeniu wątku moduł ładujący komunikuje adres tablicy TLS wątku, umieszczając adres bloku środowiska wątku (TEB) w fs (dla x86) lub GS (dla x64). Wskaźnik do tablicy TLS jest przesunięty 0x2C od początku TEB. To zachowanie jest specyficzne dla środowiska Intel x86.
Moduł ładujący przypisuje wartość indeksu TLS do miejsca wskazanego przez pole Adres indeksu.
Kod wykonywalny pobiera indeks TLS, a także lokalizację tablicy TLS.
Kod używa indeksu TLS i lokalizacji tablicy TLS (mnożenia indeksu przez 4 i używania go jako przesunięcia do tablicy), aby uzyskać adres obszaru danych TLS dla danego programu i modułu. Każdy wątek ma własny obszar danych TLS, ale jest to niewidoczne dla programu, co nie musi wiedzieć, jak dane są przydzielane dla poszczególnych wątków.
Dostęp do pojedynczego obiektu danych TLS jest uzyskiwany jako pewne stałe przesunięcie do obszaru danych TLS.
Tablica TLS to tablica adresów, które system obsługuje dla każdego wątku. Każdy adres w tej tablicy zawiera lokalizację danych TLS dla danego modułu (EXE lub DLL) w programie. Indeks TLS wskazuje, który element członkowski tablicy ma być używany. Indeks jest liczbą (zrozumiałą tylko dla systemu), która identyfikuje moduł.
Katalog TLS
Katalog TLS ma następujący format:
Przesunięcie (PE32/ PE32+) | Rozmiar (PE32/ PE32+) | Pole | Opis |
---|---|---|---|
0 |
4/8 |
Raw Data Start VA |
Adres początkowy szablonu PROTOKOŁU TLS. Szablon to blok danych używany do inicjowania danych TLS. System kopiuje wszystkie te dane za każdym razem, gdy jest tworzony wątek, więc nie może być uszkodzony. Należy pamiętać, że ten adres nie jest RVA; jest to adres, dla którego powinna istnieć relokacja podstawowa w sekcji .reloc. |
4/8 |
4/8 |
Nieprzetworzone dane końcowe va |
Adres ostatniego bajtu protokołu TLS, z wyjątkiem wypełnienia zerowego. Podobnie jak w przypadku pola Nieprzetworzone dane początkowe va, jest to va, a nie RVA. |
8/16 |
4/8 |
Adres indeksu |
Lokalizacja do odbierania indeksu TLS, który przypisuje moduł ładujący. Ta lokalizacja znajduje się w zwykłej sekcji danych, więc można nadać jej symboliczną nazwę dostępną dla programu. |
12/24 |
4/8 |
Adres wywołań zwrotnych |
Wskaźnik do tablicy funkcji wywołania zwrotnego PROTOKOŁU TLS. Tablica ma wartość null zakończoną, więc jeśli żadna funkcja wywołania zwrotnego nie jest obsługiwana, to pole wskazuje 4 bajty ustawione na zero. Aby uzyskać informacje na temat prototypu tych funkcji, zobacz funkcji wywołania zwrotnego TLS. |
16/32 |
4 |
Rozmiar wypełnienia zerowego |
Rozmiar w bajtach szablonu, poza zainicjowanymi danymi rozdzielonymi polami Nieprzetworzone dane początkowe va i Raw Data End VA. Całkowity rozmiar szablonu powinien być taki sam jak całkowity rozmiar danych TLS w pliku obrazu. Wypełnienie zerowe to ilość danych, które pochodzą po zainicjowanych danych niezerowych. |
20/36 |
4 |
Charakterystyka |
Cztery bity [23:20] opisują informacje o wyrównaniu. Możliwe wartości są zdefiniowane jako IMAGE_SCN_ALIGN_*, które są również używane do opisywania wyrównania sekcji w plikach obiektów. Pozostałe 28 bitów są zarezerwowane do użytku w przyszłości. |
Funkcje wywołania zwrotnego PROTOKOŁU TLS
Program może zapewnić co najmniej jedną funkcję wywołania zwrotnego TLS, aby obsługiwać dodatkowe inicjowanie i kończenie dla obiektów danych TLS. Typowym zastosowaniem takiej funkcji wywołania zwrotnego jest wywoływanie konstruktorów i destruktorów dla obiektów.
Chociaż zwykle nie ma więcej niż jednej funkcji wywołania zwrotnego, wywołanie zwrotne jest implementowane jako tablica, aby umożliwić dodawanie dodatkowych funkcji wywołania zwrotnego w razie potrzeby. Jeśli istnieje więcej niż jedna funkcja wywołania zwrotnego, każda funkcja jest wywoływana w kolejności, w której jej adres pojawia się w tablicy. Wskaźnik o wartości null kończy tablicę. Jest to całkowicie prawidłowe, aby mieć pustą listę (bez obsługiwanej wywołania zwrotnego), w tym przypadku tablica wywołań zwrotnych ma dokładnie jeden element członkowski- wskaźnik o wartości null.
Prototyp funkcji wywołania zwrotnego (wskazywany przez wskaźnik typu PIMAGE_TLS_CALLBACK) ma te same parametry co funkcja punktu wejścia biblioteki DLL:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
PVOID DllHandle,
DWORD Reason,
PVOID Reserved
);
Parametr zarezerwowany powinien być ustawiony na zero. Parametr Reason może przyjmować następujące wartości:
Ustawienie | Wartość | Opis |
---|---|---|
DLL_PROCESS_ATTACH |
1 |
Rozpoczęto nowy proces, w tym pierwszy wątek. |
DLL_THREAD_ATTACH |
2 |
Utworzono nowy wątek. To powiadomienie zostało wysłane dla wszystkich, ale pierwszego wątku. |
DLL_THREAD_DETACH |
3 |
Wątek ma zostać przerwany. To powiadomienie zostało wysłane dla wszystkich, ale pierwszego wątku. |
DLL_PROCESS_DETACH |
0 |
Proces zostanie zakończony, w tym oryginalny wątek. |
Struktura konfiguracji ładowania (tylko obraz)
Struktura konfiguracji obciążenia (IMAGE_LOAD_CONFIG_DIRECTORY) była wcześniej używana w bardzo ograniczonych przypadkach w systemie operacyjnym Windows NT, aby opisać różne funkcje zbyt trudne lub zbyt duże, aby opisać w nagłówku pliku lub opcjonalny nagłówek obrazu. Bieżące wersje konsolidatora firmy Microsoft i systemu Windows XP i nowszych wersji systemu Windows używają nowej wersji tej struktury dla 32-bitowych systemów opartych na architekturze x86, które obejmują zarezerwowaną technologię SEH. Zapewnia to listę bezpiecznych procedur obsługi wyjątków strukturalnych używanych przez system operacyjny podczas wysyłania wyjątków. Jeśli adres procedury obsługi znajduje się w zakresie va obrazu i jest oznaczony jako zastrzeżony SEH-aware (oznacza to, że IMAGE_DLLCHARACTERISTICS_NO_SEH jest jasne w polu DllCharacteristics opcjonalnego nagłówka, zgodnie z wcześniejszym opisem), procedura obsługi musi znajdować się na liście znanych bezpiecznych procedur obsługi dla tego obrazu. W przeciwnym razie system operacyjny kończy działanie aplikacji. Dzięki temu "program obsługi wyjątków x86", który został użyty w przeszłości do przejęcia kontroli nad systemem operacyjnym.
Konsolidator firmy Microsoft automatycznie udostępnia domyślną strukturę konfiguracji ładowania w celu uwzględnienia zarezerwowanych danych SEH. Jeśli kod użytkownika zawiera już strukturę konfiguracji obciążenia, musi zawierać nowe zastrzeżone pola SEH. W przeciwnym razie konsolidator nie może zawierać zarezerwowanych danych SEH, a obraz nie jest oznaczony jako zawierający zastrzeżony SEH.
Załaduj katalog konfiguracji
Wpis katalogu danych dla wstępnie zarezerwowanej struktury konfiguracji obciążenia SEH musi określać określony rozmiar struktury konfiguracji obciążenia, ponieważ moduł ładujący systemu operacyjnego zawsze oczekuje określonej wartości. W tym względzie rozmiar jest naprawdę tylko sprawdzaniem wersji. Aby uzyskać zgodność z systemem Windows XP i starszymi wersjami systemu Windows, rozmiar musi mieć wartość 64 dla obrazów x86.
Układ konfiguracji ładowania
Struktura konfiguracji obciążenia ma następujący układ dla 32-bitowych i 64-bitowych plików PE:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Charakterystyka |
Flagi wskazujące atrybuty pliku, obecnie nieużywane. |
4 |
4 |
TimeDateStamp |
Wartość sygnatury daty i godziny. Wartość jest reprezentowana w liczbie sekund, które upłynęły od północy (00:00:00), 1 stycznia 1970, uniwersalny czas koordynowany, zgodnie z zegarem systemowym. Sygnaturę czasową można wydrukować przy użyciu funkcji czasu środowiska uruchomieniowego języka C (CRT). |
8 |
2 |
Wersja główna |
Numer wersji głównej. |
10 |
2 |
Wersja pomocnicza |
Numer wersji pomocniczej. |
12 |
4 |
GlobalFlagsClear |
Globalne flagi modułu ładującego, aby wyczyścić ten proces podczas uruchamiania procesu przez moduł ładujący. |
16 |
4 |
GlobalFlagsSet |
Globalne flagi modułu ładującego ustawione dla tego procesu podczas uruchamiania procesu przez moduł ładujący. |
20 |
4 |
CriticalSectionDefaultTimeout |
Domyślna wartość limitu czasu używana dla krytycznych sekcji tego procesu, które zostały porzucone. |
24 |
4/8 |
DeCommitFreeBlockThreshold |
Pamięć, która musi zostać zwolniona, zanim zostanie zwrócona do systemu w bajtach. |
28/32 |
4/8 |
DeCommitTotalFreeThreshold |
Całkowita ilość wolnej pamięci w bajtach. |
32/40 |
4/8 |
LockPrefixTable |
[tylko x86] Va listy adresów, w których jest używany prefiks LOCK, aby można je było zastąpić NOP na maszynach z pojedynczym procesorem. |
36/48 |
4/8 |
MaximumAllocationSize |
Maksymalny rozmiar alokacji w bajtach. |
40/56 |
4/8 |
VirtualMemoryThreshold |
Maksymalny rozmiar pamięci wirtualnej w bajtach. |
44/64 |
4/8 |
ProcessAffinityMask |
Ustawienie tego pola na wartość inną niż zero jest równoważne wywołaniu metody SetProcessAffinityMask z tą wartością podczas uruchamiania procesu (tylko.exe) |
48/72 |
4 |
ProcessHeapFlags |
Przetwarzaj flagi stert, które odpowiadają pierwszemu argumentowi funkcji HeapCreate. Te flagi dotyczą sterta procesu tworzonego podczas uruchamiania procesu. |
52/76 |
2 |
CSDVersion |
Identyfikator wersji dodatku Service Pack. |
54/78 |
2 |
DependentLoadFlags |
Domyślne flagi ładowania używane podczas rozwiązywania statycznie połączonych importów modułu przez system operacyjny. |
56/80 |
4/8 |
Lista edycji |
Zarezerwowane do użytku przez system. |
60/88 |
4/8 |
SecurityCookie |
Wskaźnik do pliku cookie używanego przez implementację języka Visual C++ lub GS. |
64/96 |
4/8 |
Tabela programu SEHandlerTable |
[tylko x86] Va posortowanej tabeli obiektów RVA dla każdego prawidłowego, unikatowego programu obsługi SE na obrazie. |
68/104 |
4/8 |
SeHandlerCount |
[tylko x86] Liczba unikatowych procedur obsługi w tabeli. |
72/112 |
4/8 |
GuardCFCheckFunctionPointer |
Va where Control Flow Guard check-function pointer is stored. |
76/120 |
4/8 |
GuardCFDispatchFunctionPointer |
Va, w którym jest przechowywany wskaźnik dyspozytora funkcji Control Flow Guard. |
80/128 |
4/8 |
GuardCFFunctionTable |
Va posortowanej tabeli obiektów RVA każdej funkcji Control Flow Guard na obrazie. |
84/136 |
4/8 |
GuardCFFunctionCount |
Liczba unikatowych obiektów RVA w powyższej tabeli. |
88/144 |
4 |
GuardFlags |
Flagi powiązane z osłoną przepływu sterowania. |
92/148 |
12 |
CodeIntegrity |
Informacje o integralności kodu. |
104/160 |
4/8 |
GuardAddressTakenIatEntryTable |
Va where Control Flow Guard address taken IAT table is stored . |
108/168 |
4/8 |
GuardAddressTakenIatEntryCount |
Liczba unikatowych obiektów RVA w powyższej tabeli. |
112/176 |
4/8 |
GuardLongJumpTargetTable |
Va, w którym jest przechowywana tabela docelowa funkcji Control Flow Guard z długim skokiem. |
116/184 |
4/8 |
GuardLongJumpTargetCount |
Liczba unikatowych obiektów RVA w powyższej tabeli. |
Pole GuardFlags zawiera kombinację co najmniej jednej z następujących flag i pól podrzędnych:
Moduł przeprowadza kontrole integralności przepływu sterowania przy użyciu obsługi dostarczonej przez system.
#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100
Moduł wykonuje kontrole przepływu sterowania i integralności zapisu.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200
Moduł zawiera prawidłowe metadane docelowe przepływu sterowania.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400
Moduł nie korzysta z pliku cookie zabezpieczeń /GS.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
Moduł obsługuje funkcję IAT z opóźnieniem tylko do odczytu.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000
Opóźnij importowanie tabeli we własnej sekcji .didat (z niczym innym), które mogą być swobodnie ponownie chronione.
#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000
Moduł zawiera pominięte informacje dotyczące eksportu. Oznacza to również, że adres podjętej tabeli IAT jest również obecny w konfiguracji ładowania.
#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000
Moduł umożliwia pomijanie eksportów.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000
Moduł zawiera informacje o obiekcie docelowym longjmp.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000
Maska dla pola podrzędnego zawierającego krok wpisów tabeli funkcji Control Flow Guard (czyli dodatkowa liczba bajtów na wpis tabeli).
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000
Ponadto nagłówek winnt.h zestawu SDK systemu Windows definiuje to makro, aby ilość bitów przesuwała wartość GuardFlags w prawo, aby uzasadnić krok tabeli funkcji Control Flow Guard:
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28
Sekcja .rsrc
Zasoby są indeksowane przez strukturę drzewa posortowanego binarnie na poziomie wielokrotnym. Ogólny projekt może obejmować 2**31 poziomów. Zgodnie z konwencją system Windows używa jednak trzech poziomów:
- Język nazw typów
Seria tabel katalogów zasobów wiąże wszystkie poziomy w następujący sposób: po każdej tabeli katalogów następuje seria wpisów katalogu, które dają nazwę lub identyfikator (identyfikator) dla tego poziomu (typ, nazwa lub poziom języka) oraz adres opisu danych lub innej tabeli katalogów. Jeśli adres wskazuje opis danych, dane są liściem w drzewie. Jeśli adres wskazuje inną tabelę katalogów, ta tabela wyświetla wpisy katalogu na następnym poziomie.
Identyfikatory typu, nazwy i języka liścia są określane przez ścieżkę, która jest pobierana przez tabele katalogów w celu dotarcia do liścia. Pierwsza tabela określa identyfikator typu, drugą tabelę (wskazywaną przez wpis katalogu w pierwszej tabeli) określa identyfikator nazwy, a trzecia tabela określa identyfikator języka.
Ogólna struktura sekcji .rsrc to:
Dane | Opis |
---|---|
Tabele katalogu zasobów (i wpisy katalogu zasobów) |
Seria tabel— jedna dla każdej grupy węzłów w drzewie. Wszystkie węzły najwyższego poziomu (typ) są wymienione w pierwszej tabeli. Wpisy w tej tabeli wskazują tabele drugiego poziomu. Każde drzewo drugiego poziomu ma ten sam identyfikator typu, ale różne identyfikatory nazw. Drzewa trzeciego poziomu mają te same identyfikatory typów i nazw, ale różne identyfikatory języków. Każda pojedyncza tabela jest natychmiast po wpisach katalogu, w których każdy wpis ma nazwę lub identyfikator liczbowy i wskaźnik do opisu danych lub tabeli na następnym niższym poziomie. |
Ciągi katalogu zasobów |
Ciągi Unicode wyrównane z dwoma bajtami, które służą jako dane ciągu wskazywane przez wpisy katalogu. |
Opis danych zasobu |
Tablica rekordów, wskazywana przez tabele, opisując rzeczywisty rozmiar i lokalizację danych zasobów. Te rekordy są liście w drzewie opisów zasobów. |
Dane zasobów |
Nieprzetworzone dane sekcji zasobów. Informacje o rozmiarze i lokalizacji w polu Opisy danych zasobów rozdzielają poszczególne regiony danych zasobów. |
Tabela katalogów zasobów
Każda tabela katalogów zasobów ma następujący format. Ta struktura danych powinna być traktowana jako nagłówek tabeli, ponieważ tabela rzeczywiście składa się z wpisów katalogu (opisanych w sekcji 6.9.2, "Wpisy katalogu zasobów") i tej struktury:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Charakterystyka |
Flagi zasobów. To pole jest zarezerwowane do użytku w przyszłości. Jest ona obecnie ustawiona na zero. |
4 |
4 |
Sygnatura godziny/daty |
Czas utworzenia danych zasobu przez kompilator zasobów. |
8 |
2 |
Wersja główna |
Numer wersji głównej ustawiony przez użytkownika. |
10 |
2 |
Wersja pomocnicza |
Numer wersji pomocniczej ustawiony przez użytkownika. |
12 |
2 |
Liczba wpisów nazw |
Liczba wpisów katalogu bezpośrednio po tabeli, które używają ciągów do identyfikowania wpisów Typ, Nazwa lub Język (w zależności od poziomu tabeli). |
14 |
2 |
Liczba wpisów identyfikatora |
Liczba wpisów katalogu bezpośrednio po wpisach Nazwa, które używają identyfikatorów liczbowych dla wpisów typu, nazwy lub języka. |
Wpisy katalogu zasobów
Wpisy katalogu składają się na wiersze tabeli. Każdy wpis katalogu zasobów ma następujący format. Niezależnie od tego, czy wpis jest wpisem Name lub ID, jest wskazywany przez tabelę katalogów zasobów, która wskazuje, ile wpisów Name i ID następuje po nim (pamiętaj, że wszystkie wpisy Nazwa poprzedzają wszystkie wpisy identyfikatora tabeli). Wszystkie wpisy tabeli są sortowane w kolejności rosnącej: pozycje Nazwa według ciągu uwzględniającego wielkość liter i wpisy identyfikatora według wartości liczbowej. Przesunięcia są względem adresu w IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Aby uzyskać więcej informacji, zobacz Peering Inside the PE: A Tour of the Win32 Portable Wykonywalny Format.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Przesunięcie nazwy |
Przesunięcie ciągu, który daje wpis Typ, Nazwa lub Identyfikator języka, w zależności od poziomu tabeli. |
0 |
4 |
Identyfikator liczby całkowitej |
32-bitowa liczba całkowita, która identyfikuje wpis Typ, Nazwa lub Identyfikator języka. |
4 |
4 |
Przesunięcie wprowadzania danych |
Duży bit 0. Adres wpisu danych zasobu (liścia). |
4 |
4 |
Przesunięcie podkatalogu |
Bit wysoki 1. Dolne 31 bitów to adres innej tabeli katalogów zasobów (następny poziom w dół). |
Ciąg katalogu zasobów
Obszar ciągu katalogu zasobów składa się z ciągów Unicode, które są wyrównane do wyrazów. Te ciągi są przechowywane razem po ostatnim wpisie katalogu zasobów i przed pierwszym wpisem danych zasobu. Minimalizuje to wpływ tych ciągów o zmiennej długości na wyrównanie wpisów katalogu o stałym rozmiarze. Każdy ciąg katalogu zasobów ma następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
2 |
Długość |
Rozmiar ciągu, bez uwzględniania samego pola długości. |
2 |
zmienna |
Ciąg Unicode |
Dane ciągów Unicode o zmiennej długości, wyrównane do wyrazów. |
Wpis danych zasobu
Każdy wpis dane zasobu opisuje rzeczywistą jednostkę danych pierwotnych w obszarze Dane zasobów. Wpis Dane zasobu ma następujący format:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Data RVA |
Adres jednostki danych zasobów w obszarze Dane zasobów. |
4 |
4 |
Rozmiar |
Rozmiar (w bajtach) danych zasobów wskazywanych przez pole Data RVA (Dane RVA). |
8 |
4 |
Strona kodowa |
Strona kodowa używana do dekodowania wartości punktów kodu w danych zasobów. Zazwyczaj strona kodowa będzie stroną kodową Unicode. |
12 |
4 |
Wartość zarezerwowana musi mieć wartość 0. |
Sekcja cormeta (tylko obiekt)
Metadane ŚRODOWISKA CLR są przechowywane w tej sekcji. Służy do wskazywania, że plik obiektu zawiera kod zarządzany. Format metadanych nie jest udokumentowany, ale można przekazać do interfejsów CLR do obsługi metadanych.
Sekcja .sxdata
Prawidłowe procedury obsługi wyjątków obiektu są wymienione w sekcji .sxdata tego obiektu. Sekcja jest oznaczona IMAGE_SCN_LNK_INFO. Zawiera indeks symboli COFF każdego prawidłowego programu obsługi, używając 4 bajtów na indeks.
Ponadto kompilator oznacza obiekt COFF jako zarejestrowany SEH, emitując symbol bezwzględny "@feat.00" z LSB pola wartości ustawionego na 1. Obiekt COFF bez zarejestrowanych procedur obsługi SEH miałby symbol "@feat.00", ale nie sekcji .sxdata.
Format pliku archiwum (biblioteki)
- sygnatury pliku archiwum
- Archiwizuj nagłówki składowych
- pierwszego elementu konsolidatora
- drugiej składowej konsolidatora
- longnames member
Format archiwum COFF zapewnia standardowy mechanizm przechowywania kolekcji plików obiektów. Te kolekcje są często nazywane bibliotekami w dokumentacji programowania.
Pierwsze 8 bajtów archiwum składa się z podpisu pliku. Pozostała część archiwum składa się z serii członków archiwum w następujący sposób:
Pierwszymi i drugimi członkami są "członkowie konsolidatora". Każdy z tych elementów członkowskich ma własny format zgodnie z opisem w sekcji Typ nazwy importu. Zazwyczaj konsolidator umieszcza informacje w tych elementach członkowskich archiwum. Członkowie konsolidatora zawierają katalog archiwum.
Trzeci element członkowski jest członkiem "longnames". Ten opcjonalny element członkowski składa się z serii ciągów ASCII zakończonych wartościami null, w których każdy ciąg jest nazwą innego elementu członkowskiego archiwum.
Pozostała część archiwum składa się ze standardowych elementów członkowskich (object-file). Każdy z tych elementów członkowskich zawiera zawartość jednego pliku obiektu w całości.
Nagłówek elementu członkowskiego archiwum poprzedza każdego członka. Na poniższej liście przedstawiono ogólną strukturę archiwum:
Podpis :"!<arch>\n" |
---|
Nagłówek |
---|
Członek konsolidatora 1 |
Nagłówek |
---|
Drugi element członkowski konsolidatora |
Nagłówek |
---|
Element członkowski longnames |
Nagłówek |
---|
Zawartość pliku OBJ 1 (format COFF) |
Nagłówek |
---|
Zawartość pliku OBJ 2 (format COFF) |
...
Nagłówek |
---|
Zawartość pliku OBJ N (format COFF) |
Podpis pliku archiwum
Sygnatura pliku archiwum identyfikuje typ pliku. Dowolne narzędzie (na przykład konsolidator), które pobiera plik archiwum jako dane wejściowe, może sprawdzić typ pliku, odczytując ten podpis. Podpis składa się z następujących znaków ASCII, w których każdy znak poniżej jest reprezentowany dosłownie, z wyjątkiem nowego wiersza (\n) znaku:
!<arch>\n
Nagłówek winnt.h zestawu Windows SDK definiuje następujące makra:
#define IMAGE_ARCHIVE_START_SIZE 8
#define IMAGE_ARCHIVE_START "!<arch>\n"
#define IMAGE_ARCHIVE_END "`\n"
#define IMAGE_ARCHIVE_PAD "\n"
#define IMAGE_ARCHIVE_LINKER_MEMBER "/ "
#define IMAGE_ARCHIVE_LONGNAMES_MEMBER "// "
#define IMAGE_ARCHIVE_HYBRIDMAP_MEMBER "/<HYBRIDMAP>/ "
Archiwizowanie nagłówków składowych
Każdy element członkowski (konsolidator, długie nazwy lub składowa pliku obiektu) jest poprzedzony nagłówkiem. Nagłówek elementu członkowskiego archiwum ma następujący format, w którym każde pole jest ciągiem tekstowym ASCII, który jest uzasadniony i wypełniony spacjami na końcu pola. W żadnym z tych pól nie ma znaku null zakończenia.
Każdy nagłówek elementu członkowskiego rozpoczyna się od pierwszego adresu parzysty po końcu poprzedniego elementu członkowskiego archiwum, jeden bajt "\n" (IMAGE_ARCHIVE_PAD) może zostać wstawiony po elemencie członkowskim archiwum, aby następujący element członkowski rozpoczął się na adres parzysty.
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
16 |
Nazwa |
Nazwa elementu członkowskiego archiwum z dołączonym ukośnikiem (/) w celu zakończenia nazwy. Jeśli pierwszy znak jest ukośnikiem, nazwa ma specjalną interpretację, jak opisano w poniższej tabeli. |
16 |
12 |
Data |
Data i godzina utworzenia elementu członkowskiego archiwum: jest to reprezentacja dziesiętna ASCII liczby sekund od 1/1/1970 UCT. |
28 |
6 |
Identyfikator użytkownika |
Reprezentacja dziesiętna ASCII identyfikatora użytkownika. To pole nie zawiera znaczącej wartości na platformach Windows, ponieważ narzędzia firmy Microsoft emitują wszystkie wartości puste. |
34 |
6 |
Identyfikator grupy |
Reprezentacja dziesiętna ASCII identyfikatora grupy. To pole nie zawiera znaczącej wartości na platformach Windows, ponieważ narzędzia firmy Microsoft emitują wszystkie wartości puste. |
40 |
8 |
Tryb |
ASCII ósemkowa reprezentacja trybu pliku elementu członkowskiego. Jest to wartość ST_MODE z _wstat funkcji czasu wykonywania języka C. |
48 |
10 |
Rozmiar |
Reprezentacja dziesiętna ASCII całkowitego rozmiaru elementu członkowskiego archiwum, a nie w tym rozmiar nagłówka. |
58 |
2 |
Koniec nagłówka |
Dwa bajty (0x60 0x0A) w ciągu C "'\n" (IMAGE_ARCHIVE_END). |
Pole Nazwa ma jeden z formatów przedstawionych w poniższej tabeli. Jak wspomniano wcześniej, każdy z tych ciągów jest uzasadniony i wypełniony spacjami końcowymi w polu 16 bajtów:
Zawartość pola Nazwa | Opis |
---|---|
nazwa/ |
Nazwa elementu członkowskiego archiwum. |
/ |
Element członkowski archiwum jest jednym z dwóch elementów członkowskich konsolidatora. Oba elementy członkowskie konsolidatora mają tę nazwę. |
// |
Element członkowski archiwum jest elementem członkowskim longnames, który składa się z serii ciągów ASCII zakończonych wartościami null. Element członkowski longnames jest trzecim elementem członkowskim archiwum i jest opcjonalny. |
/n |
Nazwa elementu członkowskiego archiwum znajduje się w elemencie offset n w obrębie elementu członkowskiego longnames. Liczba n to reprezentacja dziesiętna przesunięcia. Na przykład: "/26" wskazuje, że nazwa elementu członkowskiego archiwum znajduje się 26 bajtów poza początkiem zawartości elementu członkowskiego longnames. |
Pierwszy element członkowski konsolidatora
Nazwa pierwszego elementu członkowskiego konsolidatora to "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Pierwszy element członkowski konsolidatora jest uwzględniony w celu zapewnienia zgodności z poprzednimi wersjami. Nie jest on używany przez bieżące konsolidatory, ale jego format musi być poprawny. Ten element członkowski konsolidatora udostępnia katalog nazw symboli, podobnie jak drugi element członkowski konsolidatora. Dla każdego symbolu informacje wskazują miejsce znalezienia elementu członkowskiego archiwum zawierającego symbol.
Pierwszy element członkowski konsolidatora ma następujący format. Te informacje są wyświetlane po nagłówku:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Liczba symboli |
Niepodpisany długi, który zawiera liczbę indeksowanych symboli. Ta liczba jest przechowywana w formacie big-endian. Każdy element członkowski pliku obiektu zwykle definiuje jeden lub więcej symboli zewnętrznych. |
4 |
4 * n |
Przesunięcia |
Tablica plików przesunięć do nagłówków składowych archiwum, w których n jest równe polu Liczba symboli. Każda liczba w tablicy jest niepodpisaną długą przechowywaną w formacie big-endian. Dla każdego symbolu o nazwie w tabeli ciągów odpowiedni element w tablicy przesunięcia daje lokalizację elementu członkowskiego archiwum zawierającego symbol. |
* |
* |
Tabela ciągów |
Seria ciągów zakończonych wartościami null, które nazywają wszystkie symbole w katalogu. Każdy ciąg rozpoczyna się natychmiast po znaku null w poprzednim ciągu. Liczba ciągów musi być równa wartości pola Liczba symboli. |
Elementy tablicy przesunięcia muszą być rozmieszczone w kolejności rosnącej. Oznacza to, że symbole w tabeli ciągów muszą być ułożone zgodnie z kolejnością składowych archiwum. Na przykład wszystkie symbole w pierwszym elemencie członkowskim pliku obiektów muszą być wymienione przed symbolami w drugim pliku obiektu.
Drugi element członkowski konsolidatora
Podobnie jak pierwszy element członkowski konsolidatora, drugi element członkowski konsolidatora ma nazwę "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Mimo że oba elementy członkowskie konsolidatora udostępniają katalog symboli i składowych archiwum, drugi element członkowski konsolidatora jest używany w preferencjach do pierwszego przez wszystkie bieżące konsolidatory. Drugi element członkowski konsolidatora zawiera nazwy symboli w kolejności leksykalnej, co umożliwia szybsze wyszukiwanie według nazwy.
Drugi element członkowski ma następujący format. Te informacje są wyświetlane po nagłówku:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
4 |
Liczba członków |
Niepodpisany długi, który zawiera liczbę elementów członkowskich archiwum. |
4 |
4 * m |
Przesunięcia |
Tablica przesunięć pliku na nagłówki składowych archiwum rozmieszczona w kolejności rosnącej. Każde przesunięcie jest niepodpisane długo. Liczba m jest równa wartości pola Liczba członków. |
* |
4 |
Liczba symboli |
Niepodpisany długi, który zawiera liczbę indeksowanych symboli. Każdy element członkowski pliku obiektu zwykle definiuje jeden lub więcej symboli zewnętrznych. |
* |
2 * n |
Indeksy |
Tablica indeksów opartych na 1 (niepodpisanym krótkim ) mapowania nazw symboli na przesunięcia składowych archiwum. Liczba n jest równa polu Liczba symboli. Dla każdego symbolu o nazwie w tabeli ciągów odpowiedni element w tablicy Indeksy daje indeks do tablicy przesunięcia. Tablica przesunięcia z kolei udostępnia lokalizację elementu członkowskiego archiwum zawierającego symbol. |
* |
* |
Tabela ciągów |
Seria ciągów zakończonych wartościami null, które nazywają wszystkie symbole w katalogu. Każdy ciąg rozpoczyna się natychmiast po bajtie null w poprzednim ciągu. Liczba ciągów musi być równa wartości pola Liczba symboli. W tej tabeli wymieniono wszystkie nazwy symboli w kolejności rosnącej leksykalnej. |
Element członkowski longnames
Nazwa elementu członkowskiego longnames to "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Element członkowski longnames to seria ciągów nazw składowych archiwum. Nazwa pojawia się tutaj tylko wtedy, gdy w polu Nazwa jest za mało miejsca (16 bajtów). Element członkowski longnames jest opcjonalny. Może być pusty tylko z nagłówkiem lub może być całkowicie nieobecny bez nawet nagłówka.
Ciągi są zakończone wartością null. Każdy ciąg rozpoczyna się natychmiast po bajtie null w poprzednim ciągu.
Importowanie formatu biblioteki
Tradycyjne biblioteki importu, czyli biblioteki opisujące eksporty z jednego obrazu do użycia przez inny, zazwyczaj są zgodne z układem opisanym w sekcji 7, Format pliku archiwum (biblioteka). Podstawową różnicą jest to, że elementy członkowskie biblioteki importu zawierają pliki pseudo-obiektów zamiast rzeczywistych, w których każdy element członkowski zawiera współtworzenie sekcji wymagane do utworzenia tabel importu opisanych w sekcji 6.4, Sekcja .idata Konsolidator generuje to archiwum podczas kompilowania aplikacji eksportu.
Współtworzenie sekcji dla importu może być wnioskowane z małego zestawu informacji. Konsolidator może wygenerować pełne, pełne informacje do biblioteki importu dla każdego elementu członkowskiego w momencie utworzenia biblioteki lub napisać tylko informacje kanoniczne do biblioteki i pozwolić aplikacji, która później używa jej do generowania niezbędnych danych na bieżąco.
W bibliotece importu z długim formatem pojedynczy element członkowski zawiera następujące informacje:
- Nagłówek elementu członkowskiego archiwum
- Nagłówek pliku
- Nagłówki sekcji
- Dane odpowiadające poszczególnym nagłówkom sekcji
- Tabela symboli COFF
- Ciągi
Z kolei krótka biblioteka importu jest napisana w następujący sposób:
- Nagłówek elementu członkowskiego archiwum
- Importuj nagłówek
- Ciąg nazwy importowania zakończonego wartością null
- Ciąg nazwy dll zakończony o wartości null
Jest to wystarczające informacje, aby dokładnie odtworzyć całą zawartość elementu członkowskiego w momencie jego użycia.
Importuj nagłówek
Nagłówek importu zawiera następujące pola i przesunięcia:
Przesunięcie | Rozmiar | Pole | Opis |
---|---|---|---|
0 |
2 |
Sig1 |
Musi być IMAGE_FILE_MACHINE_UNKNOWN. Aby uzyskać więcej informacji, zobacz Typy maszyn. |
2 |
2 |
Sig2 |
Musi być 0xFFFF. |
4 |
2 |
Wersja |
Wersja struktury. |
6 |
2 |
Maszyna |
Liczba identyfikująca typ maszyny docelowej. Aby uzyskać więcej informacji, zobacz Typy maszyn. |
8 |
4 |
sygnatura Time-Date |
Godzina i data utworzenia pliku. |
12 |
4 |
Rozmiar danych |
Rozmiar ciągów, które są zgodne z nagłówkiem. |
16 |
2 |
Porządkowe/wskazówka |
Porządkowa lub wskazówka dotycząca importu określona przez wartość w polu Typ nazwy. |
18 |
2 bity |
Typ |
Typ importu. Aby uzyskać informacje o określonych wartościach i opisach, zobacz Typ importu. |
3 bity |
Typ nazwy |
Typ nazwy importu. Aby uzyskać więcej informacji, zobacz Import Name Type. |
|
11 bitów |
Zastrzeżony |
Wartość zarezerwowana musi mieć wartość 0. |
Po tej strukturze są dwa ciągi zakończone wartością null, które opisują nazwę zaimportowanego symbolu i bibliotekę DLL, z której pochodzi.
Typ importu
Następujące wartości są definiowane dla pola Typ w nagłówku importu:
Stały | Wartość | Opis |
---|---|---|
IMPORT_OBJECT_CODE |
0 |
Kod wykonywalny. |
IMPORT_OBJECT_DATA |
1 |
Dane. |
IMPORT_OBJECT_CONST |
2 |
Określony jako CONST w pliku .def. |
Te wartości służą do określania, które współtworzenie sekcji musi być generowane przez narzędzie korzystające z biblioteki, jeśli musi uzyskiwać dostęp do tych danych.
Typ nazwy importu
Nazwa symbolu importu zakończonego wartością null natychmiast następuje po skojarzonym nagłówku importu. Następujące wartości są definiowane dla pola Typ nazwy w nagłówku importu. Wskazują one, jak nazwa ma być używana do generowania prawidłowych symboli reprezentujących import:
Stały | Wartość | Opis |
---|---|---|
IMPORT_OBJECT_ORDINAL | 0 | Importowanie odbywa się według porządkowych. Oznacza to, że wartość w polu Porządkowy/Wskazówka nagłówka importu jest porządkowa importu. Jeśli ta stała nie jest określona, pole Porządkowe/Wskazówka powinno być zawsze interpretowane jako wskazówka importu. |
IMPORT_OBJECT_NAME | 1 | Nazwa importu jest identyczna z nazwą publicznego symbolu. |
IMPORT_OBJECT_NAME_NOPREFIX | 2 | Nazwa importu to nazwa symbolu publicznego, ale pomijając wiodące znaki ?, @lub opcjonalnie _. |
IMPORT_OBJECT_NAME_UNDECORATE | 3 | Nazwa importu to nazwa symbolu publicznego, ale pomijanie wiodącego znaku ?, @lub opcjonalnie _, i obcinanie przy pierwszym @. |
Dodatek A: Obliczanie skrótu obrazu Authenticode PE
Oczekuje się, że kilka certyfikatów atrybutów zostanie użytych do zweryfikowania integralności obrazów. Najczęściej jednak jest to podpis Authenticode. Sygnatura Authenticode może służyć do sprawdzania, czy odpowiednie sekcje pliku obrazu PE nie zostały zmienione w żaden sposób z oryginalnego formularza pliku. Aby wykonać to zadanie, podpisy Authenticode zawierają coś o nazwie skrót obrazu PE
Co to jest skrót obrazu Authenticode PE?
Skrót obrazu Authenticode PE lub skrót pliku jest podobny do sumy kontrolnej pliku, ponieważ generuje niewielką wartość, która odnosi się do integralności pliku. Suma kontrolna jest generowana przez prosty algorytm i służy głównie do wykrywania błędów pamięci. Oznacza to, że jest używany do wykrywania, czy blok pamięci na dysku zniknął źle, a przechowywane tam wartości stały się uszkodzone. Skrót pliku jest podobny do sumy kontrolnej, w którym również wykrywa uszkodzenie pliku. Jednak w przeciwieństwie do większości algorytmów sumy kontrolnej bardzo trudno jest zmodyfikować plik tak, aby miał ten sam skrót pliku co jego oryginalny (niezmodyfikowany) formularz. Oznacza to, że suma kontrolna ma na celu wykrywanie prostych błędów pamięci, które prowadzą do uszkodzenia, ale skrót pliku może służyć do wykrywania zamierzonych, a nawet subtelnych modyfikacji pliku, takich jak te wprowadzone przez wirusy, hakerów lub programy koni trojańskich.
W podpisie Authenticode skrót pliku jest podpisany cyfrowo przy użyciu klucza prywatnego znanego tylko podpisowi pliku. Użytkownik oprogramowania może zweryfikować integralność pliku, obliczając wartość skrótu pliku i porównując go z wartością podpisanego skrótu zawartego w podpisie cyfrowym Authenticode. Jeśli skróty plików nie są zgodne, część pliku objętego skrótem obrazu PE została zmodyfikowana.
Co zostało omówione w skrótach obrazu Authenticode PE?
Nie jest możliwe lub pożądane, aby uwzględnić wszystkie dane pliku obrazu w obliczeniu skrótu obrazu PE. Czasami po prostu przedstawia niepożądane cechy (na przykład nie można usunąć informacji debugowania z publicznie wydanych plików); czasami jest to po prostu niemożliwe. Na przykład nie można uwzględnić wszystkich informacji w pliku obrazu w podpisie Authenticode, a następnie wstawić sygnaturę Authenticode zawierającą skrót obrazu PE do obrazu PE, a później móc wygenerować identyczny skrót obrazu PE, uwzględniając wszystkie dane pliku obrazu w obliczeniu ponownie, ponieważ plik zawiera teraz podpis Authenticode, który nie był tam pierwotnie.
Proces generowania skrótu obrazu Authenticode PE
W tej sekcji opisano sposób obliczania skrótu obrazu PE i elementów obrazu PE można modyfikować bez unieważnienia podpisu Authenticode.
Nuta
Skrót obrazu PE dla określonego pliku można dołączyć do oddzielnego pliku wykazu bez dołączania certyfikatu atrybutu w pliku skrótów. Jest to istotne, ponieważ możliwe jest unieważnienie skrótu obrazu PE w pliku wykazu z podpisem Authenticode przez zmodyfikowanie obrazu PE, który w rzeczywistości nie zawiera podpisu Authenticode.
Wszystkie dane w sekcjach obrazu PE określone w tabeli sekcji są skrótami w całości, z wyjątkiem następujących zakresów wykluczeń:
Pole CheckSum pliku pól specyficznych dla systemu Windows opcjonalnego nagłówka. Ta suma kontrolna zawiera cały plik (w tym wszystkie certyfikaty atrybutów w pliku). Najprawdopodobniej suma kontrolna będzie inna niż oryginalna wartość po wstawieniu podpisu Authenticode.
Informacje dotyczące certyfikatów atrybutów. Obszary obrazu PE powiązane z podpisem Authenticode nie są uwzględniane w obliczeniu skrótu obrazu PE, ponieważ podpisy Authenticode można dodać lub usunąć z obrazu bez wpływu na ogólną integralność obrazu. Nie jest to problem, ponieważ istnieją scenariusze użytkownika, które zależą od ponownego podpisywania obrazów PE lub dodawania sygnatury czasowej. Funkcja Authenticode wyklucza następujące informacje z obliczenia skrótu:
Pole Tabela certyfikatów opcjonalnych katalogów danych nagłówka.
Tabela certyfikatów i odpowiadające im certyfikaty wskazywane przez pole Tabela certyfikatów wymienione bezpośrednio powyżej.
Aby obliczyć skrót obrazu PE, Authenticode porządkuje sekcje określone w tabeli sekcji według zakresu adresów, a następnie skróty wynikowej sekwencji bajtów, przekazując zakresy wykluczeń.
Informacje o końcu ostatniej sekcji. Obszar obok ostatniej sekcji (zdefiniowany przez najwyższe przesunięcie) nie jest skrótem. Ten obszar często zawiera informacje o debugowaniu. Informacje debugowania można ogólnie traktować jako porady dotyczące debugerów; nie ma wpływu na rzeczywistą integralność programu wykonywalnego. Po dostarczeniu produktu można dosłownie usunąć informacje debugowania z obrazu i nie wpływać na funkcjonalność programu. W rzeczywistości jest to czasami wykonywane jako miara zapisywania dysku. Warto zauważyć, że informacje debugowania zawarte w określonych sekcjach obrazu PE nie mogą zostać usunięte bez unieważnienia podpisu Authenticode.
Narzędzia makecert i signtool dostępne w zestawie SDK platformy Windows umożliwiają eksperymentowanie z tworzeniem i weryfikowaniem podpisów Authenticode. Aby uzyskać więcej informacji, zobacz Dokumentację poniżej.
Odwołania
pliki do pobrania i narzędzia dla systemu Windows (łącznie z zestawem Windows SDK)
tworzenie, wyświetlanie i zarządzanie certyfikatami
przewodnik Kernel-Mode podpisywania kodu (.doc)
windows Authenticode Portable Wykonywalny format podpisu wykonywalnego (.docx)