PE-indeling
Deze specificatie beschrijft de structuur van uitvoerbare bestanden (installatiekopieën) en objectbestanden onder de Windows-familie van besturingssystemen. Deze bestanden worden respectievelijk COFF-bestanden (Portable Executable) en Common Object File Format (COFF) genoemd.
Notitie
Dit document wordt verstrekt voor hulp bij de ontwikkeling van hulpprogramma's en toepassingen voor Windows, maar is niet gegarandeerd een volledige specificatie in alle opzichten. Microsoft behoudt zich het recht voor dit document zonder kennisgeving te wijzigen.
Deze revisie van microsoft Portable Executable en Common Object File Format Specification vervangt alle eerdere revisies van deze specificatie.
Algemene concepten
In dit document wordt de structuur opgegeven van uitvoerbare bestanden (installatiekopieën) en objectbestanden onder de Microsoft Windows-familie van besturingssystemen. Deze bestanden worden respectievelijk COFF-bestanden (Portable Executable) en Common Object File Format (COFF) genoemd. De naam 'Draagbaar uitvoerbaar bestand' verwijst naar het feit dat de indeling niet specifiek is voor architectuur.
Bepaalde concepten die in deze specificatie worden weergegeven, worden beschreven in de volgende tabel:
Naam | Beschrijving |
---|---|
kenmerkcertificaat |
Een certificaat dat wordt gebruikt om verifieerbare instructies te koppelen aan een installatiekopieën. Een aantal verschillende verifieerbare instructies kan worden gekoppeld aan een bestand; een van de nuttigste is een instructie van een softwarefabrikant die aangeeft wat de berichtsamenvating van de afbeelding naar verwachting is. Een samenvatting van een bericht is vergelijkbaar met een controlesom, behalve dat het zeer moeilijk is om te smeden. Daarom is het erg moeilijk om een bestand te wijzigen om dezelfde berichtsamenvating te hebben als het oorspronkelijke bestand. De instructie kan worden geverifieerd als gemaakt door de fabrikant met behulp van cryptografieschema's met openbare of persoonlijke sleutels. In dit document worden details beschreven over andere kenmerkcertificaten dan voor het toestaan van de invoeging in afbeeldingsbestanden. |
datum-/tijdstempel |
Een stempel dat wordt gebruikt voor verschillende doeleinden op verschillende plaatsen in een PE- of COFF-bestand. In de meeste gevallen is de indeling van elke stempel hetzelfde als die wordt gebruikt door de tijdfuncties in de C-runtimebibliotheek. Zie de beschrijving van IMAGE_DEBUG_TYPE_REPRO in Foutopsporingstypevoor uitzonderingen. Als de stempelwaarde 0 of 0xFFFFFFFF is, vertegenwoordigt deze geen echte of zinvolle datum-/tijdstempel. |
bestandspointer |
De locatie van een item in het bestand zelf, voordat deze wordt verwerkt door de linker (in het geval van objectbestanden) of het laadprogramma (in het geval van afbeeldingsbestanden). Met andere woorden, dit is een positie in het bestand zoals opgeslagen op schijf. |
linker |
Een verwijzing naar de linker die wordt geleverd met Microsoft Visual Studio. |
objectbestand |
Een bestand dat wordt opgegeven als invoer voor de linker. De linker produceert een afbeeldingsbestand, dat op zijn beurt wordt gebruikt als invoer door het laadprogramma. De term 'objectbestand' impliceert niet noodzakelijkerwijs een verbinding met objectgeoriënteerde programmering. |
gereserveerd, moet 0 zijn |
Een beschrijving van een veld dat aangeeft dat de waarde van het veld nul moet zijn voor generatoren en consumenten het veld moeten negeren. |
Relatief virtueel adres (RVA) |
In een afbeeldingsbestand is dit het adres van een item nadat het in het geheugen is geladen, waarbij het basisadres van het afbeeldingsbestand ervan is afgetrokken. De RVA van een item verschilt vrijwel altijd van de positie in het bestand op schijf (bestandsaanwijzer). In een objectbestand is een RVA minder zinvol omdat er geen geheugenlocaties zijn toegewezen. In dit geval zou een RVA een adres zijn binnen een sectie (verderop in deze tabel beschreven), waarop een herlocatie later wordt toegepast tijdens het koppelen. Voor het gemak moet een compiler alleen de eerste RVA in elke sectie instellen op nul. |
afdeling |
De basiseenheid van code of gegevens in een PE- of COFF-bestand. Alle code in een objectbestand kan bijvoorbeeld worden gecombineerd binnen één sectie of (afhankelijk van het compilergedrag) elke functie kan een eigen sectie innemen. Met meer secties is er meer bestandsoverhead, maar de linker kan selectiever koppelen in code. Een sectie is vergelijkbaar met een segment in intel 8086-architectuur. Alle onbewerkte gegevens in een sectie moeten aaneengesloten worden geladen. Daarnaast kan een afbeeldingsbestand een aantal secties bevatten, zoals .tls of .reloc, die speciale doeleinden hebben. |
Virtueel adres (VA) |
Hetzelfde als RVA, behalve dat het basisadres van het afbeeldingsbestand niet wordt afgetrokken. Het adres wordt een VA genoemd omdat Windows een afzonderlijke VA-ruimte voor elk proces maakt, onafhankelijk van fysiek geheugen. Voor vrijwel alle doeleinden moet een VA als slechts een adres worden beschouwd. Een VA is niet zo voorspelbaar als een RVA omdat het laadprogramma de installatiekopieën mogelijk niet op de gewenste locatie laadt. |
Overzicht
In de volgende lijst wordt de uitvoerbare indeling van Microsoft PE beschreven, met de basis van de afbeeldingskoptekst bovenaan. De sectie van de MS-DOS 2.0 compatibele EXE-header naar de ongebruikte sectie net voordat de PE-header de MS-DOS 2.0-sectie is en wordt alleen gebruikt voor MS-DOS compatibiliteit.
MS-DOS 2.0 compatibele EXE-header
ongebruikt
OEM-id
OEM-informatie
Verschuiving naar PE-header
MS-DOS 2.0 Stub Program and Relocation Table
ongebruikt
PE-koptekst (uitgelijnd op grens van 8 bytes)
Sectiekoppen
Afbeeldingspagina's:
gegevens importeren
exportgegevens
basisverplaatsingen
resourcegegevens
In de volgende lijst wordt de indeling van de Microsoft COFF-objectmodule beschreven:
Microsoft COFF-header
Sectiekoppen
Onbewerkte gegevens:
code
gegevens
foutopsporingsgegevens
Bedrijfsverplaatsingen
Bestandsheaders
- MS-DOS Stub (alleen afbeelding)
- handtekening (alleen afbeelding)
- COFF-bestandskoptekst (object en afbeelding)
- optionele koptekst (alleen afbeelding)
De PE-bestandskoptekst bestaat uit een Microsoft-MS-DOS stub, de PE-handtekening, de COFF-bestandskoptekst en een optionele header. Een COFF-objectbestandskoptekst bestaat uit een COFF-bestandskoptekst en een optionele header. In beide gevallen worden de bestandsheaders onmiddellijk gevolgd door sectieheaders.
MS-DOS Stub (alleen afbeelding)
De MS-DOS stub is een geldige toepassing die wordt uitgevoerd onder MS-DOS. Het wordt aan de voorkant van de EXE-installatiekopieën geplaatst. De linker plaatst hier een standaard stub, waarmee het bericht 'Dit programma kan niet worden uitgevoerd in DOS-modus' wordt afgedrukt wanneer de afbeelding wordt uitgevoerd in MS-DOS. De gebruiker kan een andere stub opgeven met behulp van de optie /STUB-linker.
Op locatie 0x3c heeft de stub het bestandsverschil met de PE-handtekening. Met deze informatie kan Windows het installatiekopieënbestand correct uitvoeren, ook al heeft het een MS-DOS stub. Deze bestandsverschil wordt op locatie 0x3c geplaatst tijdens het koppelen.
Handtekening (alleen afbeelding)
Na de MS-DOS stub, op de bestands offset die is opgegeven bij offset 0x3c, is een 4-bytehandtekening die het bestand identificeert als een PE-indeling afbeeldingsbestand. Deze handtekening is PE\0\0 (de letters 'P' en 'E' gevolgd door twee null-bytes).
COFF-bestandskoptekst (object en afbeelding)
Aan het begin van een objectbestand, of direct na de handtekening van een afbeeldingsbestand, is een standaard COFF-bestandskoptekst in de volgende indeling. Houd er rekening mee dat het aantal secties wordt beperkt tot 96 door het Windows-laadprogramma.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
2 |
Machine |
Het getal dat het type doelmachine aangeeft. Zie Machinetypenvoor meer informatie. |
2 |
2 |
NumberOfSections |
Het aantal secties. Dit geeft de grootte van de sectietabel aan, die direct volgt op de kopteksten. |
4 |
4 |
TimeDateStamp |
De lage 32 bits van het aantal seconden sinds 00:00 januari 1970 (een C-runtimewaarde time_t), wat aangeeft wanneer het bestand is gemaakt. |
8 |
4 |
PointerToSymbolTable |
De bestandsverschuiving van de tabel COFF-symbool of nul als er geen COFF-symbooltabel aanwezig is. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft. |
12 |
4 |
NumberOfSymbolen |
Het aantal vermeldingen in de symbooltabel. Deze gegevens kunnen worden gebruikt om de tekenreekstabel te vinden, die direct volgt op de symbooltabel. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft. |
16 |
2 |
SizeOfOptionalHeader |
De grootte van de optionele header, die vereist is voor uitvoerbare bestanden, maar niet voor objectbestanden. Deze waarde moet nul zijn voor een objectbestand. Zie Optionele koptekst (alleen afbeelding)voor een beschrijving van de koptekstindeling. |
18 |
2 |
Kenmerken |
De vlaggen die de kenmerken van het bestand aangeven. Zie Kenmerkenvoor specifieke markeringswaarden. |
Machinetypen
Het veld Machine heeft een van de volgende waarden, waarmee het CPU-type wordt opgegeven. Een afbeeldingsbestand kan alleen worden uitgevoerd op de opgegeven computer of op een systeem dat de opgegeven machine emuleren.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_FILE_MACHINE_UNKNOWN |
0x0 |
De inhoud van dit veld wordt verondersteld van toepassing te zijn op elk computertype |
IMAGE_FILE_MACHINE_ALPHA |
0x184 |
Alfa AXP, 32-bits adresruimte |
IMAGE_FILE_MACHINE_ALPHA64 |
0x284 |
Alfa 64, 64-bits adresruimte |
IMAGE_FILE_MACHINE_AM33 |
0x1d3 |
Matsushita AM33 |
IMAGE_FILE_MACHINE_AMD64 |
0x8664 |
x64 |
IMAGE_FILE_MACHINE_ARM |
0x1c0 |
ARM little endian |
IMAGE_FILE_MACHINE_ARM64 |
0xaa64 |
ARM64 little endian |
IMAGE_FILE_MACHINE_ARMNT |
0x1c4 |
ARM Duim-2 kleine endian |
IMAGE_FILE_MACHINE_AXP64 |
0x284 |
AXP 64 (hetzelfde als Alfa 64) |
IMAGE_FILE_MACHINE_EBC |
0xebc |
EFI-bytecode |
IMAGE_FILE_MACHINE_I386 |
0x14c |
Intel 386 of hoger processors en compatibele processors |
IMAGE_FILE_MACHINE_IA64 |
0x200 |
Intel Itanium-processorfamilie |
IMAGE_FILE_MACHINE_LOONGARCH32 |
0x6232 |
LoongArch 32-bits processorfamilie |
IMAGE_FILE_MACHINE_LOONGARCH64 |
0x6264 |
LoongArch 64-bits processorfamilie |
IMAGE_FILE_MACHINE_M32R |
0x9041 |
Mitsubishi M32R little endian |
IMAGE_FILE_MACHINE_MIPS16 |
0x266 |
MIPS16 |
IMAGE_FILE_MACHINE_MIPSFPU |
0x366 |
MIPS met FPU |
IMAGE_FILE_MACHINE_MIPSFPU16 |
0x466 |
MIPS16 met FPU |
IMAGE_FILE_MACHINE_POWERPC |
0x1f0 |
Power PC little endian |
IMAGE_FILE_MACHINE_POWERPCFP |
0x1f1 |
Power PC met ondersteuning voor drijvende komma |
IMAGE_FILE_MACHINE_R4000 |
0x166 |
MIPS little endian |
IMAGE_FILE_MACHINE_RISCV32 |
0x5032 |
RISC-V 32-bits adresruimte |
IMAGE_FILE_MACHINE_RISCV64 |
0x5064 |
RISC-V 64-bits adresruimte |
IMAGE_FILE_MACHINE_RISCV128 |
0x5128 |
RISC-V 128-bits adresruimte |
IMAGE_FILE_MACHINE_SH3 |
0x1a2 |
Hitachi SH3 |
IMAGE_FILE_MACHINE_SH3DSP |
0x1a3 |
Hitachi SH3 DSP |
IMAGE_FILE_MACHINE_SH4 |
0x1a6 |
Hitachi SH4 |
IMAGE_FILE_MACHINE_SH5 |
0x1a8 |
Hitachi SH5 |
IMAGE_FILE_MACHINE_THUMB |
0x1c2 |
Duim |
IMAGE_FILE_MACHINE_WCEMIPSV2 |
0x169 |
MIPS little-endian WCE v2 |
Kenmerken
Het veld Kenmerken bevat vlaggen die kenmerken van het object- of afbeeldingsbestand aangeven. De volgende vlaggen zijn momenteel gedefinieerd:
Vlag | Waarde | Beschrijving |
---|---|---|
IMAGE_FILE_RELOCS_STRIPPED |
0x0001 |
Alleen afbeelding, Windows CE en Microsoft Windows NT en hoger. Dit geeft aan dat het bestand geen basisverplaatsingen bevat en daarom moet worden geladen op het voorkeursbasisadres. Als het basisadres niet beschikbaar is, meldt het laadprogramma een fout. Het standaardgedrag van de linker is het stripen van basisverplaatsingen van uitvoerbare (EXE)-bestanden. |
IMAGE_FILE_EXECUTABLE_IMAGE |
0x0002 |
Alleen afbeelding. Dit geeft aan dat het afbeeldingsbestand geldig is en kan worden uitgevoerd. Als deze vlag niet is ingesteld, wordt een linkerfout aangegeven. |
IMAGE_FILE_LINE_NUMS_STRIPPED |
0x0004 |
COFF-regelnummers zijn verwijderd. Deze vlag is afgeschaft en moet nul zijn. |
IMAGE_FILE_LOCAL_SYMS_STRIPPED |
0x0008 |
COFF-symbooltabelvermeldingen voor lokale symbolen zijn verwijderd. Deze vlag is afgeschaft en moet nul zijn. |
IMAGE_FILE_AGGRESSIVE_WS_TRIM |
0x0010 |
Verouderd. Het werkset agressief knippen. Deze vlag is afgeschaft voor Windows 2000 en hoger en moet nul zijn. |
IMAGE_FILE_LARGE_ADDRESS_ AWARE |
0x0020 |
De toepassing kan > 2 GB-adressen verwerken. |
0x0040 |
Deze vlag is gereserveerd voor toekomstig gebruik. |
|
IMAGE_FILE_BYTES_REVERSED_LO |
0x0080 |
Little endian: de minst significante bit (LSB) gaat vooraf aan de meest significante bit (MSB) in het geheugen. Deze vlag is afgeschaft en moet nul zijn. |
IMAGE_FILE_32BIT_MACHINE |
0x0100 |
De machine is gebaseerd op een 32-bits architectuur. |
IMAGE_FILE_DEBUG_STRIPPED |
0x0200 |
Foutopsporingsgegevens worden verwijderd uit het afbeeldingsbestand. |
IMAGE_FILE_REMOVABLE_RUN_ FROM_SWAP |
0x0400 |
Als de installatiekopie zich op verwisselbare media bevindt, laadt u deze volledig en kopieert u deze naar het wisselbestand. |
IMAGE_FILE_NET_RUN_FROM_SWAP |
0x0800 |
Als de installatiekopie zich op netwerkmedia bevindt, laadt u deze volledig en kopieert u deze naar het wisselbestand. |
IMAGE_FILE_SYSTEM |
0x1000 |
Het installatiekopieënbestand is een systeembestand, geen gebruikersprogramma. |
IMAGE_FILE_DLL |
0x2000 |
Het afbeeldingsbestand is een DLL (Dynamic Link Library). Dergelijke bestanden worden beschouwd als uitvoerbare bestanden voor bijna alle doeleinden, hoewel ze niet rechtstreeks kunnen worden uitgevoerd. |
IMAGE_FILE_UP_SYSTEM_ONLY |
0x4000 |
Het bestand mag alleen worden uitgevoerd op een uniprocessorcomputer. |
IMAGE_FILE_BYTES_REVERSED_HI |
0x8000 |
Big endian: de MSB gaat vooraf aan de LSB in het geheugen. Deze vlag is afgeschaft en moet nul zijn. |
Optionele koptekst (alleen afbeelding)
Elk afbeeldingsbestand heeft een optionele header die informatie aan het laadprogramma biedt. Deze header is optioneel in de zin dat sommige bestanden (met name objectbestanden) deze niet hebben. Voor afbeeldingsbestanden is deze header vereist. Een objectbestand kan een optionele koptekst hebben, maar over het algemeen heeft deze header geen functie in een objectbestand, behalve om de grootte ervan te vergroten.
Houd er rekening mee dat de grootte van de optionele header niet is opgelost. Het veld SizeOfOptionalHeader in de COFF-header moet worden gebruikt om te controleren of een test in het bestand voor een bepaalde gegevensmap niet verder gaat dan SizeOfOptionalHeader-. Zie COFF File Header (Object and Image)voor meer informatie.
De NumberOfRvaAndSizes veld van de optionele header moet ook worden gebruikt om ervoor te zorgen dat er geen test voor een bepaalde gegevensmapvermelding buiten de optionele header valt. Daarnaast is het belangrijk om het optionele magicnummer voor headers te valideren voor de compatibiliteit met opmaak.
Het optionele magic-nummer van de header bepaalt of een afbeelding een PE32- of PE32+ uitvoerbaar bestand is.
Magic number | PE-indeling |
---|---|
0x10b |
PE32 |
0x20b |
PE32+ |
PE32+ afbeeldingen maken een 64-bits adresruimte mogelijk terwijl de grootte van de installatiekopieën wordt beperkt tot 2 gigabyte. Andere PE32+ wijzigingen worden behandeld in hun respectieve secties.
De optionele header zelf heeft drie belangrijke onderdelen.
Verschuiving (PE32/PE32+) | Grootte (PE32/PE32+) | Koptekstonderdeel | Beschrijving |
---|---|---|---|
0 |
28/24 |
Standaardvelden |
Velden die zijn gedefinieerd voor alle implementaties van COFF, inclusief UNIX. |
28/24 |
68/88 |
Windows-specifieke velden |
Aanvullende velden ter ondersteuning van specifieke functies van Windows (bijvoorbeeld subsystemen). |
96/112 |
Veranderlijk |
Gegevensmappen |
Adres-/grootteparen voor speciale tabellen die zijn gevonden in het afbeeldingsbestand en worden gebruikt door het besturingssysteem (bijvoorbeeld de importtabel en de exporttabel). |
Optionele standaardvelden voor kopteksten (alleen afbeelding)
De eerste acht velden van de optionele header zijn standaardvelden die zijn gedefinieerd voor elke implementatie van COFF. Deze velden bevatten algemene informatie die handig is voor het laden en uitvoeren van een uitvoerbaar bestand. Ze zijn ongewijzigd voor de PE32+-indeling.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
2 |
Magie |
Het niet-ondertekende gehele getal dat de status van het afbeeldingsbestand aangeeft. Het meest voorkomende getal is 0x10B, waarmee het wordt aangeduid als een normaal uitvoerbaar bestand. 0x107 identificeert deze als een ROM-installatiekopieën en 0x20B identificeert deze als een uitvoerbaar PE32+-bestand. |
2 |
1 |
MajorLinkerVersion |
Het primaire versienummer van de linker. |
3 |
1 |
MinorLinkerVersion |
Het secundaire versienummer van de linker. |
4 |
4 |
SizeOfCode |
De grootte van de codesectie (tekst) of de som van alle codesecties als er meerdere secties zijn. |
8 |
4 |
SizeOfInitializedData |
De grootte van de geïnitialiseerde gegevenssectie of de som van alle dergelijke secties als er meerdere gegevenssecties zijn. |
12 |
4 |
SizeOfUninitializedData |
De grootte van de niet-geïnitialiseerde gegevenssectie (BSS) of de som van alle dergelijke secties als er meerdere BSS-secties zijn. |
16 |
4 |
AddressOfEntryPoint |
Het adres van het toegangspunt ten opzichte van de basis van de installatiekopieën wanneer het uitvoerbare bestand in het geheugen wordt geladen. Voor programma-installatiekopieën is dit het beginadres. Voor apparaatstuurprogramma's is dit het adres van de initialisatiefunctie. Een toegangspunt is optioneel voor DLL's. Als er geen toegangspunt aanwezig is, moet dit veld nul zijn. |
20 |
4 |
BaseOfCode |
Het adres dat relatief is ten opzichte van de afbeeldingsbasis van de sectie begin van de code wanneer deze in het geheugen wordt geladen. |
PE32 bevat dit extra veld, dat ontbreekt in PE32+, na BaseOfCode.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
24 |
4 |
BaseOfData |
Het adres dat relatief is ten opzichte van de afbeeldingsbasis van de sectie begin van gegevens wanneer deze in het geheugen wordt geladen. |
Optionele koptekst Windows-Specific velden (alleen afbeelding)
De volgende 21 velden zijn een uitbreiding van de optionele COFF-headerindeling. Ze bevatten aanvullende informatie die vereist is voor de linker en het laadprogramma in Windows.
Verschuiving (PE32/ PE32+) | Grootte (PE32/ PE32+) | Veld | Beschrijving |
---|---|---|---|
28/24 |
4/8 |
ImageBase |
Het voorkeursadres van de eerste byte van de afbeelding wanneer deze in het geheugen wordt geladen; moet een veelvoud van 64 K zijn. De standaardwaarde voor DLL's is 0x10000000. De standaardinstelling voor Windows CE EXEs is 0x00010000. De standaardinstelling voor Windows NT, Windows 2000, Windows XP, Windows 95, Windows 98 en Windows Me is 0x00400000. |
32/32 |
4 |
SectionAlignment |
De uitlijning (in bytes) van secties wanneer ze in het geheugen worden geladen. Het moet groter dan of gelijk zijn aan FileAlignment. De standaardwaarde is het paginaformaat voor de architectuur. |
36/36 |
4 |
FileAlignment |
De uitlijningsfactor (in bytes) die wordt gebruikt om de onbewerkte gegevens van secties in het afbeeldingsbestand uit te lijnen. De waarde moet een macht zijn van 2 tussen 512 en 64 K, inclusief. De standaardwaarde is 512. Als de SectionAlignment kleiner is dan de paginagrootte van de architectuur, moet FileAlignment overeenkomen met SectionAlignment. |
40/40 |
2 |
MajorOperatingSystemVersion |
Het primaire versienummer van het vereiste besturingssysteem. |
42/42 |
2 |
MinorOperatingSystemVersion |
Het secundaire versienummer van het vereiste besturingssysteem. |
44/44 |
2 |
MajorImageVersion |
Het primaire versienummer van de installatiekopieën. |
46/46 |
2 |
MinorImageVersion |
Het secundaire versienummer van de installatiekopieën. |
48/48 |
2 |
MajorSubsystemVersion |
Het primaire versienummer van het subsysteem. |
50/50 |
2 |
MinorSubsystemVersion |
Het secundaire versienummer van het subsysteem. |
52/52 |
4 |
Win32VersionValue |
Gereserveerd, moet nul zijn. |
56/56 |
4 |
SizeOfImage |
De grootte (in bytes) van de afbeelding, inclusief alle headers, omdat de afbeelding in het geheugen wordt geladen. Het moet een veelvoud van SectionAlignment zijn. |
60/60 |
4 |
SizeOfHeaders |
De gecombineerde grootte van een MS-DOS stub-, PE-kop- en sectiekoppen afgerond op een veelvoud van FileAlignment. |
64/64 |
4 |
Checksum |
De controlesom van het afbeeldingsbestand. Het algoritme voor het berekenen van de controlesom wordt opgenomen in IMAGHELP.DLL. Hieronder vindt u een controle op validatie tijdens de laadtijd: alle stuurprogramma's, alle DLL's die tijdens het opstarten worden geladen en alle DLL's die in een kritiek Windows-proces worden geladen. |
68/68 |
2 |
Subsysteem |
Het subsysteem dat nodig is om deze installatiekopieën uit te voeren. Zie Windows-subsysteemvoor meer informatie. |
70/70 |
2 |
DllCharacteristics |
Zie DLL-kenmerken verderop in deze specificatie voor meer informatie. |
72/72 |
4/8 |
SizeOfStackReserve |
De grootte van de stack die moet worden gereserveerd. Alleen SizeOfStackCommit wordt doorgevoerd; de rest wordt één pagina tegelijk beschikbaar gesteld totdat de reservegrootte is bereikt. |
76/80 |
4/8 |
SizeOfStackCommit |
De grootte van de stapel die moet worden doorgevoerd. |
80/88 |
4/8 |
SizeOfHeapReserve |
De grootte van de lokale heapruimte die moet worden gereserveerd. Alleen SizeOfHeapCommit wordt doorgevoerd; de rest wordt één pagina tegelijk beschikbaar gesteld totdat de reservegrootte is bereikt. |
84/96 |
4/8 |
SizeOfHeapCommit |
De grootte van de lokale heapruimte die moet worden doorgevoerd. |
88/104 |
4 |
LoaderFlags |
Gereserveerd, moet nul zijn. |
92/108 |
4 |
NumberOfRvaAndSizes |
Het aantal gegevensmapvermeldingen in de rest van de optionele header. Elk beschrijft een locatie en grootte. |
Windows-subsysteem
De volgende waarden die zijn gedefinieerd voor het subsysteemveld van de optionele header bepalen welk Windows-subsysteem (indien aanwezig) nodig is om de installatiekopieën uit te voeren.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_SUBSYSTEM_UNKNOWN |
0 |
Een onbekend subsysteem |
IMAGE_SUBSYSTEM_NATIVE |
1 |
Apparaatstuurprogramma's en systeemeigen Windows-processen |
IMAGE_SUBSYSTEM_WINDOWS_GUI |
2 |
Het Windows GUI-subsysteem (grafische gebruikersinterface) |
IMAGE_SUBSYSTEM_WINDOWS_CUI |
3 |
Het Subsysteem voor Windows-tekens |
IMAGE_SUBSYSTEM_OS2_CUI |
5 |
Het subsysteem van het besturingssysteem/2 tekens |
IMAGE_SUBSYSTEM_POSIX_CUI |
7 |
Het Posix-tekensubsysteem |
IMAGE_SUBSYSTEM_NATIVE_WINDOWS |
8 |
Systeemeigen Win9x-stuurprogramma |
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI |
9 |
Windows CE |
IMAGE_SUBSYSTEM_EFI_APPLICATION |
10 |
Een EFI-toepassing (Extensible Firmware Interface) |
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER |
11 |
Een EFI-stuurprogramma met opstartservices |
IMAGE_SUBSYSTEM_EFI_RUNTIME_ DRIVER |
12 |
Een EFI-stuurprogramma met runtimeservices |
IMAGE_SUBSYSTEM_EFI_ROM |
13 |
Een EFI ROM-afbeelding |
IMAGE_SUBSYSTEM_XBOX |
14 |
XBOX |
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION |
16 |
Windows-opstarttoepassing. |
DLL-kenmerken
De volgende waarden worden gedefinieerd voor het veld DllCharacteristics van de optionele header.
Constant | Waarde | Beschrijving |
---|---|---|
0x0001 |
Gereserveerd, moet nul zijn. |
|
0x0002 |
Gereserveerd, moet nul zijn. |
|
0x0004 |
Gereserveerd, moet nul zijn. |
|
0x0008 |
Gereserveerd, moet nul zijn. |
|
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA |
0x0020 |
Afbeelding kan een hoge entropie 64-bits virtuele adresruimte verwerken. |
IMAGE_DLLCHARACTERISTICS_ DYNAMIC_BASE |
0x0040 |
DLL kan tijdens de laadtijd worden verplaatst. |
IMAGE_DLLCHARACTERISTICS_ FORCE_INTEGRITY |
0x0080 |
Controles voor code-integriteit worden afgedwongen. |
IMAGE_DLLCHARACTERISTICS_ NX_COMPAT |
0x0100 |
Afbeelding is NX-compatibel. |
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION |
0x0200 |
Isolatiebewust, maar de installatiekopieën niet isoleren. |
IMAGE_DLLCHARACTERISTICS_ NO_SEH |
0x0400 |
Maakt geen gebruik van se-verwerking (Structured Exception). Er kan geen SE-handler worden aangeroepen in deze afbeelding. |
IMAGE_DLLCHARACTERISTICS_ NO_BIND |
0x0800 |
Bind de afbeelding niet. |
IMAGE_DLLCHARACTERISTICS_APPCONTAINER |
0x1000 |
De installatiekopieën moeten worden uitgevoerd in een AppContainer. |
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER |
0x2000 |
Een WDM-chauffeur. |
IMAGE_DLLCHARACTERISTICS_GUARD_CF |
0x4000 |
Afbeelding ondersteunt Control Flow Guard. |
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE |
0x8000 |
Terminal Server-bewust. |
Optionele headergegevensmappen (alleen afbeelding)
Elke gegevensmap geeft het adres en de grootte van een tabel of tekenreeks die door Windows wordt gebruikt. Deze gegevensmapvermeldingen worden allemaal in het geheugen geladen, zodat het systeem deze tijdens runtime kan gebruiken. Een gegevensmap is een veld met 8 bytes met de volgende declaratie:
typedef struct _IMAGE_DATA_DIRECTORY {
DWORD VirtualAddress;
DWORD Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;
Het eerste veld, VirtualAddress, is eigenlijk de RVA van de tabel. De RVA is het adres van de tabel ten opzichte van het basisadres van de afbeelding wanneer de tabel wordt geladen. Het tweede veld geeft de grootte in bytes. De gegevensmappen, die het laatste deel van de optionele header vormen, worden weergegeven in de volgende tabel.
Houd er rekening mee dat het aantal mappen niet is opgelost. Voordat u een specifieke map zoekt, controleert u het veld NumberOfRvaAndSizes in de optionele koptekst.
Neem ook niet aan dat de RVA's in deze tabel verwijzen naar het begin van een sectie of dat de secties die specifieke tabellen bevatten, specifieke namen hebben.
Verschuiving (PE/PE32+) | Grootte | Veld | Beschrijving |
---|---|---|---|
96/112 |
8 |
Tabel exporteren |
Het adres en de grootte van de exporttabel. Zie .edata Section (alleen afbeelding)voor meer informatie. |
104/120 |
8 |
Tabel importeren |
Het adres en de grootte van de importtabel. Zie De sectie .idatavoor meer informatie. |
112/128 |
8 |
Resourcetabel |
Het adres en de grootte van de resourcetabel. Zie The .rsrc Sectionvoor meer informatie. |
120/136 |
8 |
Uitzonderingstabel |
Het adres en de grootte van de uitzonderingstabel. Zie De sectie .pdatavoor meer informatie. |
128/144 |
8 |
Certificaattabel |
Het adres en de grootte van de kenmerkcertificaattabel. Zie De kenmerkcertificaattabel (alleen afbeelding)voor meer informatie. |
136/152 |
8 |
Basisverplaatsingstabel |
Het adres en de grootte van de basisverplaatsingstabel. Zie De .reloc Section (Alleen afbeelding)voor meer informatie. |
144/160 |
8 |
Debuggen |
Het beginadres en de grootte van de foutopsporingsgegevens. Zie de sectie .debug sectionvoor meer informatie. |
152/168 |
8 |
Architectuur |
Gereserveerd, moet 0 zijn |
160/176 |
8 |
Global Ptr |
De RVA van de waarde die moet worden opgeslagen in het globale aanwijzerregister. Het groottelid van deze structuur moet worden ingesteld op nul. |
168/184 |
8 |
TLS-tabel |
Het lokale opslagadres (TLS) van de thread en de grootte van de tabel. Zie De sectie .tlsvoor meer informatie. |
176/192 |
8 |
Configuratietabel laden |
Het adres en de grootte van de loadconfiguratietabel. Zie The Load Configuration Structure (Alleen image)voor meer informatie. |
184/200 |
8 |
Afhankelijk importeren |
Het adres en de grootte van de afhankelijke importtabel. |
192/208 |
8 |
IAT |
Het adres en de grootte van de adrestabel importeren. Zie Adrestabel importerenvoor meer informatie. |
200/216 |
8 |
Importdescriptor uitstellen |
Het vertragingsdescriptoradres en de grootte van de importdescriptor. Zie Delay-Load Tabellen importeren (alleen afbeelding)voor meer informatie. |
208/224 |
8 |
CLR Runtime-header |
Het headeradres en de grootte van de CLR-runtime. Zie De sectie .cormeta (alleen object)voor meer informatie. |
216/232 |
8 |
Gereserveerd, moet nul zijn |
De vermelding certificaattabel verwijst naar een tabel met kenmerkcertificaten. Deze certificaten worden niet in het geheugen geladen als onderdeel van de installatiekopieën. Als zodanig is het eerste veld van deze vermelding, dat normaal gesproken een RVA is, in plaats daarvan een bestandsaanwijzer.
Sectietabel (sectiekoppen)
Elke rij van de sectietabel is in feite een sectiekop. Deze tabel volgt direct de optionele koptekst, indien van toepassing. Deze plaatsing is vereist omdat de bestandskop geen directe aanwijzer naar de sectietabel bevat. In plaats daarvan wordt de locatie van de sectietabel bepaald door de locatie van de eerste byte na de kopteksten te berekenen. Zorg ervoor dat u de grootte van de optionele header gebruikt zoals opgegeven in de bestandskoptekst.
Het aantal vermeldingen in de sectietabel wordt gegeven door het veld NumberOfSections in de bestandskoptekst. Vermeldingen in de sectietabel worden genummerd vanaf één (1). De code- en gegevensgeheugensectievermeldingen staan in de volgorde die wordt gekozen door de linker.
In een afbeeldingsbestand moeten de VA's voor secties worden toegewezen door de linker, zodat ze in oplopende volgorde en aangrenzend zijn en ze een veelvoud van de sectie-uitlijningswaarde in de optionele header moeten zijn.
Elke sectiekop (vermelding in de sectietabel) heeft de volgende indeling, voor een totaal van 40 bytes per vermelding.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
8 |
Naam |
Een tekenreeks met 8 bytes, met null-padded UTF-8. Als de tekenreeks precies 8 tekens lang is, is er geen afsluit null. Voor langere namen bevat dit veld een slash (/) die wordt gevolgd door een ASCII-weergave van een decimaal getal dat een verschuiving is in de tekenreekstabel. Uitvoerbare afbeeldingen maken geen gebruik van een tekenreekstabel en bieden geen ondersteuning voor sectienamen van meer dan 8 tekens. Lange namen in objectbestanden worden afgekapt als ze worden verzonden naar een uitvoerbaar bestand. |
8 |
4 |
VirtualSize |
De totale grootte van de sectie wanneer deze in het geheugen wordt geladen. Als deze waarde groter is dan SizeOfRawData, wordt de sectie nul opgevuld. Dit veld is alleen geldig voor uitvoerbare afbeeldingen en moet worden ingesteld op nul voor objectbestanden. |
12 |
4 |
VirtualAddress |
Voor uitvoerbare installatiekopieën is het adres van de eerste byte van de sectie ten opzichte van de basis van de installatiekopieën wanneer de sectie in het geheugen wordt geladen. Voor objectbestanden is dit veld het adres van de eerste byte voordat de verplaatsing wordt toegepast; om het eenvoudig te maken, moeten compilers dit instellen op nul. Anders is het een willekeurige waarde die wordt afgetrokken van verschuivingen tijdens de verplaatsing. |
16 |
4 |
SizeOfRawData |
De grootte van de sectie (voor objectbestanden) of de grootte van de geïnitialiseerde gegevens op schijf (voor afbeeldingsbestanden). Voor uitvoerbare afbeeldingen moet dit een veelvoud van FileAlignment uit de optionele header zijn. Als dit kleiner is dan VirtualSize, wordt de rest van de sectie gevuld met nul. Omdat het veld SizeOfRawData wordt afgerond, maar het veld VirtualSize niet is, is het ook mogelijk dat SizeOfRawData groter is dan VirtualSize. Wanneer een sectie alleen niet-geïnitialiseerde gegevens bevat, moet dit veld nul zijn. |
20 |
4 |
PointerToRawData |
De bestandswijzer naar de eerste pagina van de sectie in het COFF-bestand. Voor uitvoerbare afbeeldingen moet dit een veelvoud van FileAlignment uit de optionele header zijn. Voor objectbestanden moet de waarde worden uitgelijnd op een grens van 4 bytes voor de beste prestaties. Wanneer een sectie alleen niet-geïnitialiseerde gegevens bevat, moet dit veld nul zijn. |
24 |
4 |
PointerToRelocations |
De bestandsaanwijzer naar het begin van herlocatievermeldingen voor de sectie. Dit is ingesteld op nul voor uitvoerbare afbeeldingen of als er geen verplaatsingen zijn. |
28 |
4 |
PointerToLinenumbers |
De bestandsaanwijzer naar het begin van regelnummervermeldingen voor de sectie. Dit is ingesteld op nul als er geen COFF-regelnummers zijn. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft. |
32 |
2 |
NumberOfRelocations |
Het aantal herplaatsingsvermeldingen voor de sectie. Dit is ingesteld op nul voor uitvoerbare installatiekopieën. |
34 |
2 |
NumberOfLinenumbers |
Het aantal regelnummers voor de sectie. Deze waarde moet nul zijn voor een afbeelding omdat COFF-foutopsporingsgegevens zijn afgeschaft. |
36 |
4 |
Kenmerken |
De vlaggen die de kenmerken van de sectie beschrijven. Zie Sectievlagkenvoor meer informatie. |
Sectievlagmen
De sectievlaggen in het veld Kenmerken van de sectiekop geven kenmerken van de sectie aan.
Vlag | Waarde | Beschrijving |
---|---|---|
0x00000000 |
Gereserveerd voor toekomstig gebruik. |
|
0x00000001 |
Gereserveerd voor toekomstig gebruik. |
|
0x00000002 |
Gereserveerd voor toekomstig gebruik. |
|
0x00000004 |
Gereserveerd voor toekomstig gebruik. |
|
IMAGE_SCN_TYPE_NO_PAD |
0x00000008 |
De sectie mag niet worden opgevuld naar de volgende grens. Deze vlag is verouderd en wordt vervangen door IMAGE_SCN_ALIGN_1BYTES. Dit is alleen geldig voor objectbestanden. |
0x00000010 |
Gereserveerd voor toekomstig gebruik. |
|
IMAGE_SCN_CNT_CODE |
0x00000020 |
De sectie bevat uitvoerbare code. |
IMAGE_SCN_CNT_INITIALIZED_DATA |
0x00000040 |
De sectie bevat geïnitialiseerde gegevens. |
IMAGE_SCN_CNT_UNINITIALIZED_ DATA |
0x00000080 |
De sectie bevat niet-geïnitialiseerde gegevens. |
IMAGE_SCN_LNK_OTHER |
0x00000100 |
Gereserveerd voor toekomstig gebruik. |
IMAGE_SCN_LNK_INFO |
0x00000200 |
De sectie bevat opmerkingen of andere informatie. De sectie .drectve heeft dit type. Dit is alleen geldig voor objectbestanden. |
0x00000400 |
Gereserveerd voor toekomstig gebruik. |
|
IMAGE_SCN_LNK_REMOVE |
0x00000800 |
De sectie maakt geen deel uit van de afbeelding. Dit is alleen geldig voor objectbestanden. |
IMAGE_SCN_LNK_COMDAT |
0x00001000 |
De sectie bevat COMDAT-gegevens. Zie COMDAT-secties (alleen object)voor meer informatie. Dit is alleen geldig voor objectbestanden. |
IMAGE_SCN_GPREL |
0x00008000 |
De sectie bevat gegevens waarnaar wordt verwezen via de algemene aanwijzer (GP). |
IMAGE_SCN_MEM_PURGEABLE |
0x00020000 |
Gereserveerd voor toekomstig gebruik. |
IMAGE_SCN_MEM_16BIT |
0x00020000 |
Gereserveerd voor toekomstig gebruik. |
IMAGE_SCN_MEM_LOCKED |
0x00040000 |
Gereserveerd voor toekomstig gebruik. |
IMAGE_SCN_MEM_PRELOAD |
0x00080000 |
Gereserveerd voor toekomstig gebruik. |
IMAGE_SCN_ALIGN_1BYTES |
0x00100000 |
Gegevens uitlijnen op een grens van 1 byte. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_2BYTES |
0x00200000 |
Gegevens uitlijnen op een grens van twee bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_4BYTES |
0x00300000 |
Gegevens uitlijnen op een grens van 4 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_8BYTES |
0x00400000 |
Gegevens uitlijnen op een grens van 8 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_16BYTES |
0x00500000 |
Gegevens uitlijnen op een grens van 16 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_32BYTES |
0x00600000 |
Gegevens uitlijnen op een grens van 32 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_64BYTES |
0x00700000 |
Gegevens uitlijnen op een grens van 64 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_128BYTES |
0x00800000 |
Gegevens uitlijnen op een grens van 128 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_256BYTES |
0x00900000 |
Gegevens uitlijnen op een grens van 256 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_512BYTES |
0x00A00000 |
Gegevens uitlijnen op een grens van 512 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_1024BYTES |
0x00B00000 |
Gegevens uitlijnen op een grens van 1024 bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_2048BYTES |
0x00C00000 |
Gegevens uitlijnen op een grens van 2048-bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_4096BYTES |
0x00D00000 |
Gegevens uitlijnen op een grens van 4096-bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_ALIGN_8192BYTES |
0x00E00000 |
Gegevens uitlijnen op een grens van 8192-bytes. Alleen geldig voor objectbestanden. |
IMAGE_SCN_LNK_NRELOC_OVFL |
0x01000000 |
De sectie bevat uitgebreide verplaatsingen. |
IMAGE_SCN_MEM_DISCARDABLE |
0x02000000 |
De sectie kan indien nodig worden verwijderd. |
IMAGE_SCN_MEM_NOT_CACHED |
0x04000000 |
De sectie kan niet in de cache worden opgeslagen. |
IMAGE_SCN_MEM_NOT_PAGED |
0x08000000 |
De sectie kan niet worden gepaginad. |
IMAGE_SCN_MEM_SHARED |
0x10000000 |
De sectie kan worden gedeeld in het geheugen. |
IMAGE_SCN_MEM_EXECUTE |
0x20000000 |
De sectie kan als code worden uitgevoerd. |
IMAGE_SCN_MEM_READ |
0x40000000 |
De sectie kan worden gelezen. |
IMAGE_SCN_MEM_WRITE |
0x80000000 |
De sectie kan worden geschreven naar. |
IMAGE_SCN_LNK_NRELOC_OVFL geeft aan dat het aantal verplaatsingen voor de sectie groter is dan de 16 bits die hiervoor zijn gereserveerd in de sectiekoptekst. Als de bit is ingesteld en het veld NumberOfRelocations in de sectiekop is 0xffff, wordt het werkelijke aantal verplaatsingen opgeslagen in het veld 32-bits VirtualAddress van de eerste herlocatie. Het is een fout als IMAGE_SCN_LNK_NRELOC_OVFL is ingesteld en er minder dan 0xffff verplaatsingen in de sectie zijn.
Gegroepeerde secties (alleen object)
Het "$" teken (dollarteken) heeft een speciale interpretatie in sectienamen in objectbestanden.
Bij het bepalen van de afbeeldingssectie die de inhoud van een objectsectie bevat, verwijdert de linker de '$' en alle tekens die erop volgen. Een objectsectie met de naam .text$X draagt daadwerkelijk bij aan de sectie .text in de afbeelding.
De tekens na de $bepalen echter de volgorde van de bijdragen aan de afbeeldingssectie. Alle bijdragen met dezelfde objectsectienaam worden aan elkaar toegewezen in de afbeelding en de blokken bijdragen worden gesorteerd in lexicale volgorde op objectsectienaam. Daarom komt alles in objectbestanden met de sectienaam .text$X uiteindelijk samen, na de .text$W bijdragen en vóór de .text$Y bijdragen.
De sectienaam in een afbeeldingsbestand bevat nooit een $-teken.
Andere inhoud van het bestand
- Sectiegegevens
- COFF-verplaatsingen (alleen object)
- COFF-regelnummers (afgeschaft)
- COFF-symbooltabel
- hulpsymboolrecords
- COFF-tekenreekstabel
- de kenmerkcertificaattabel (alleen afbeelding)
- Delay-Load tabellen importeren (alleen afbeelding)
De gegevensstructuren die tot nu toe zijn beschreven, tot en met de optionele header, bevinden zich allemaal op een vaste offset van het begin van het bestand (of van de PE-header als het bestand een afbeelding is die een MS-DOS stub bevat).
De rest van een COFF-object of afbeeldingsbestand bevat blokken gegevens die niet noodzakelijkerwijs op een specifieke bestandsverschil staan. In plaats daarvan worden de locaties gedefinieerd door aanwijzers in de optionele koptekst of een sectiekop.
Een uitzondering is voor afbeeldingen met een SectionAlignment-waarde van minder dan de paginagrootte van de architectuur (4 K voor Intel x86 en voor MIPS en 8 K voor Itanium). Zie optionele koptekst (alleen afbeelding)voor een beschrijving van SectionAlignment. In dit geval gelden er beperkingen voor de bestandsverrekening van de sectiegegevens, zoals beschreven in sectie 5.1, 'Sectiegegevens'. Een andere uitzondering hierop is dat kenmerkcertificaat- en foutopsporingsgegevens aan het einde van een afbeeldingsbestand moeten worden geplaatst, waarbij de kenmerkcertificaattabel direct voorafgaand aan de sectie voor foutopsporing staat, omdat het laadprogramma deze niet in het geheugen toe wijst. De regel over kenmerkcertificaat en foutopsporingsinformatie is echter niet van toepassing op objectbestanden.
Sectiegegevens
Geïnitialiseerde gegevens voor een sectie bestaan uit eenvoudige blokken bytes. Voor secties die alle nullen bevatten, hoeven de sectiegegevens echter niet te worden opgenomen.
De gegevens voor elke sectie bevinden zich op de bestandsverschil die is opgegeven door het veld PointerToRawData in de sectiekoptekst. De grootte van deze gegevens in het bestand wordt aangegeven door het veld SizeOfRawData. Als SizeOfRawData kleiner is dan VirtualSize, wordt de rest opgevuld met nullen.
In een afbeeldingsbestand moeten de sectiegegevens worden uitgelijnd op een grens zoals opgegeven door het veld FileAlignment in de optionele header. Sectiegegevens moeten worden weergegeven in volgorde van de RVA-waarden voor de bijbehorende secties (zoals de afzonderlijke sectiekoppen in de sectietabel).
Er zijn extra beperkingen voor afbeeldingsbestanden als de waarde SectionAlignment in de optionele header kleiner is dan de paginagrootte van de architectuur. Voor dergelijke bestanden moet de locatie van sectiegegevens in het bestand overeenkomen met de locatie in het geheugen wanneer de afbeelding wordt geladen, zodat de fysieke offset voor sectiegegevens hetzelfde is als de RVA.
COFF-verplaatsingen (alleen object)
Objectbestanden bevatten COFF-verplaatsingen, die aangeven hoe de sectiegegevens moeten worden gewijzigd wanneer ze in het afbeeldingsbestand worden geplaatst en vervolgens in het geheugen worden geladen.
Afbeeldingsbestanden bevatten geen COFF-verplaatsingen, omdat alle symbolen waarnaar wordt verwezen al adressen in een platte adresruimte zijn toegewezen. Een afbeelding bevat informatie over herlocatie in de vorm van basisverplaatsingen in de sectie .reloc (tenzij de afbeelding het kenmerk IMAGE_FILE_RELOCS_STRIPPED heeft). Zie De .reloc Section (Alleen afbeelding)voor meer informatie.
Voor elke sectie in een objectbestand bevat een matrix met records met vaste lengte de COFF-verplaatsingen van de sectie. De positie en lengte van de matrix worden opgegeven in de sectiekoptekst. Elk element van de matrix heeft de volgende indeling.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
VirtualAddress |
Het adres van het item waarop verplaatsing wordt toegepast. Dit is de verschuiving vanaf het begin van de sectie, plus de waarde van het rva-/offsetveld van de sectie. Zie sectietabel (sectiekoppen). Als de eerste byte van de sectie bijvoorbeeld een adres van 0x10 heeft, heeft de derde byte een adres van 0x12. |
4 |
4 |
SymbolTableIndex |
Een op nul gebaseerde index in de symbooltabel. Dit symbool geeft het adres dat moet worden gebruikt voor de verplaatsing. Als het opgegeven symbool sectieopslagklasse heeft, is het adres van het symbool het adres met de eerste sectie van dezelfde naam. |
8 |
2 |
Type |
Een waarde die aangeeft welk soort verplaatsing moet worden uitgevoerd. Geldige herlocatietypen zijn afhankelijk van het type machine. Zie type indicatoren. |
Als het symbool waarnaar wordt verwezen door het veld SymbolTableIndex de opslagklasse IMAGE_SYM_CLASS_SECTION heeft, is het adres van het symbool het begin van de sectie. De sectie bevindt zich meestal in hetzelfde bestand, behalve wanneer het objectbestand deel uitmaakt van een archief (bibliotheek). In dat geval is de sectie te vinden in elk ander objectbestand in het archief met dezelfde naam van het archieflid als het huidige objectbestand. (De relatie met de naam van het archieflid wordt gebruikt bij het koppelen van importtabellen, dat wil gezegd de sectie .idata.)
Type indicatoren
Het veld Type van de herlocatierecord geeft aan welk type verplaatsing moet worden uitgevoerd. Voor elk type machine worden verschillende verplaatsingstypen gedefinieerd.
x64-processors
De volgende herlocatietypeindicatoren worden gedefinieerd voor x64 en compatibele processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_AMD64_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_AMD64_ADDR64 |
0x0001 |
De 64-bits VA van het verplaatsingsdoel. |
IMAGE_REL_AMD64_ADDR32 |
0x0002 |
De 32-bits VA van het verplaatsingsdoel. |
IMAGE_REL_AMD64_ADDR32NB |
0x0003 |
Het 32-bits adres zonder een rva (image base). |
IMAGE_REL_AMD64_REL32 |
0x0004 |
Het relatieve 32-bits adres van de byte na de verplaatsing. |
IMAGE_REL_AMD64_REL32_1 |
0x0005 |
Het 32-bits adres ten opzichte van byteafstand 1 van de verplaatsing. |
IMAGE_REL_AMD64_REL32_2 |
0x0006 |
Het 32-bits adres ten opzichte van byteafstand 2 van de verplaatsing. |
IMAGE_REL_AMD64_REL32_3 |
0x0007 |
Het 32-bits adres ten opzichte van byteafstand 3 van de verplaatsing. |
IMAGE_REL_AMD64_REL32_4 |
0x0008 |
Het 32-bits adres ten opzichte van byteafstand 4 van de verplaatsing. |
IMAGE_REL_AMD64_REL32_5 |
0x0009 |
Het 32-bits adres ten opzichte van byteafstand 5 van de verplaatsing. |
IMAGE_REL_AMD64_SECTION |
0x000A |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_AMD64_SECREL |
0x000B |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_AMD64_SECREL7 |
0x000C |
Een 7-bits niet-ondertekende offset van de basis van de sectie die het doel bevat. |
IMAGE_REL_AMD64_TOKEN |
0x000D |
CLR-tokens. |
IMAGE_REL_AMD64_SREL32 |
0x000E |
Een 32-bits ondertekende spanafhankelijke waarde die in het object wordt verzonden. |
IMAGE_REL_AMD64_PAIR |
0x000F |
Een paar dat onmiddellijk moet volgen op elke bereikafhankelijke waarde. |
IMAGE_REL_AMD64_SSPAN32 |
0x0010 |
Een 32-bits ondertekende spanafhankelijke waarde die wordt toegepast tijdens het koppelen. |
ARM-processors
De volgende indicatoren voor herlocatietypen worden gedefinieerd voor ARM-processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_ARM_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_ARM_ADDR32 |
0x0001 |
De 32-bits VA van het doel. |
IMAGE_REL_ARM_ADDR32NB |
0x0002 |
De 32-bits RVA van het doel. |
IMAGE_REL_ARM_BRANCH24 |
0x0003 |
De 24-bits relatieve verplaatsing naar het doel. |
IMAGE_REL_ARM_BRANCH11 |
0x0004 |
De verwijzing naar een subroutine-aanroep. De verwijzing bestaat uit twee 16-bits instructies met 11-bits offsets. |
IMAGE_REL_ARM_REL32 |
0x000A |
Het relatieve 32-bits adres van de byte na de verplaatsing. |
IMAGE_REL_ARM_SECTION |
0x000E |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_ARM_SECREL |
0x000F |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_ARM_MOV32 |
0x0010 |
De 32-bits VA van het doel. Deze verplaatsing wordt toegepast met behulp van een MOVW-instructie voor de lage 16 bits gevolgd door een MOVT voor de hoge 16 bits. |
IMAGE_REL_THUMB_MOV32 |
0x0011 |
De 32-bits VA van het doel. Deze verplaatsing wordt toegepast met behulp van een MOVW-instructie voor de lage 16 bits gevolgd door een MOVT voor de hoge 16 bits. |
IMAGE_REL_THUMB_BRANCH20 |
0x0012 |
De instructie wordt opgelost met de 21-bits relatieve verplaatsing naar het 2-byte uitgelijnde doel. De minst significante bit van de verplaatsing is altijd nul en wordt niet opgeslagen. Deze verplaatsing komt overeen met een duim-2 32-bits voorwaardelijke B-instructie. |
Ongebruikt |
0x0013 |
|
IMAGE_REL_THUMB_BRANCH24 |
0x0014 |
De instructie is opgelost met de 25-bits relatieve verplaatsing naar het 2-byte uitgelijnde doel. De minst significante bit van de verplaatsing is nul en wordt niet opgeslagen. Deze verplaatsing komt overeen met een Duim-2 B instructie. |
IMAGE_REL_THUMB_BLX23 |
0x0015 |
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 4-byte uitgelijnde doel. De lage 2 bits van de verplaatsing zijn nul en worden niet opgeslagen. Deze verplaatsing komt overeen met een Thumb-2 BLX-instructie. |
IMAGE_REL_ARM_PAIR |
0x0016 |
De verplaatsing is alleen geldig wanneer deze direct volgt op een ARM_REFHI of THUMB_REFHI. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel. |
ARM64-processors
De volgende indicatoren voor herlocatietypen worden gedefinieerd voor ARM64-processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_ARM64_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_ARM64_ADDR32 |
0x0001 |
De 32-bits VA van het doel. |
IMAGE_REL_ARM64_ADDR32NB |
0x0002 |
De 32-bits RVA van het doel. |
IMAGE_REL_ARM64_BRANCH26 |
0x0003 |
De 26-bits relatieve verplaatsing naar het doel, voor B- en BL-instructies. |
IMAGE_REL_ARM64_PAGEBASE_REL21 |
0x0004 |
De paginabasis van het doel, voor ADRP-instructies. |
IMAGE_REL_ARM64_REL21 |
0x0005 |
De 12-bits relatieve verplaatsing naar het doel, voor instructie ADR |
IMAGE_REL_ARM64_PAGEOFFSET_12A |
0x0006 |
De 12-bits pagina-offset van het doel, voor instructies ADD/ADDS (direct) met nul shift. |
IMAGE_REL_ARM64_PAGEOFFSET_12L |
0x0007 |
De 12-bits pagina-offset van het doel, voor instructie LDR (geïndexeerd, niet-ondertekend onmiddellijk). |
IMAGE_REL_ARM64_SECREL |
0x0008 |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_ARM64_SECREL_LOW12A |
0x0009 |
Bit 0:11 van de sectie-offset van het doel, voor instructies ADD/ADDS (onmiddellijk) met nul shift. |
IMAGE_REL_ARM64_SECREL_HIGH12A |
0x000A |
Bit 12:23 van de sectie-offset van het doel, voor instructies ADD/ADDS (onmiddellijk) met nul shift. |
IMAGE_REL_ARM64_SECREL_LOW12L |
0x000B |
Bit 0:11 van de sectie-offset van het doel, voor instructie LDR (geïndexeerd, niet-ondertekend onmiddellijk). |
IMAGE_REL_ARM64_TOKEN |
0x000C |
CLR-token. |
IMAGE_REL_ARM64_SECTION |
0x000D |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_ARM64_ADDR64 |
0x000E |
De 64-bits VA van het verplaatsingsdoel. |
IMAGE_REL_ARM64_BRANCH19 |
0x000F |
De 19-bits verschuiving naar het verplaatsingsdoel, voor voorwaardelijke B-instructie. |
IMAGE_REL_ARM64_BRANCH14 |
0x0010 |
De 14-bits verschuiving naar het verplaatsingsdoel, voor instructies TBZ en TBNZ. |
IMAGE_REL_ARM64_REL32 |
0x0011 |
Het relatieve 32-bits adres van de byte na de verplaatsing. |
Processoren van De SuperH van Processor
De volgende indicatoren voor herlocatietypen worden gedefinieerd voor SH3- en SH4-processors. SH5-specifieke verplaatsingen worden vermeld als SHM (SH Media).
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_SH3_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_SH3_DIRECT16 |
0x0001 |
Een verwijzing naar de 16-bits locatie die de VA van het doelsymbool bevat. |
IMAGE_REL_SH3_DIRECT32 |
0x0002 |
De 32-bits VA van het doelsymbool. |
IMAGE_REL_SH3_DIRECT8 |
0x0003 |
Een verwijzing naar de 8-bits locatie die de VA van het doelsymbool bevat. |
IMAGE_REL_SH3_DIRECT8_WORD |
0x0004 |
Een verwijzing naar de 8-bits instructie die de effectieve 16-bits VA van het doelsymbool bevat. |
IMAGE_REL_SH3_DIRECT8_LONG |
0x0005 |
Een verwijzing naar de 8-bits instructie die de effectieve 32-bits VA van het doelsymbool bevat. |
IMAGE_REL_SH3_DIRECT4 |
0x0006 |
Een verwijzing naar de 8-bits locatie waarvan de lage 4 bits de VA van het doelsymbool bevatten. |
IMAGE_REL_SH3_DIRECT4_WORD |
0x0007 |
Een verwijzing naar de 8-bits instructie waarvan lage 4 bits de effectieve 16-bits VA van het doelsymbool bevatten. |
IMAGE_REL_SH3_DIRECT4_LONG |
0x0008 |
Een verwijzing naar de 8-bits instructie waarvan de lage 4 bits de effectieve 32-bits VA van het doelsymbool bevatten. |
IMAGE_REL_SH3_PCREL8_WORD |
0x0009 |
Een verwijzing naar de 8-bits instructie die de effectieve 16-bits relatieve verschuiving van het doelsymbool bevat. |
IMAGE_REL_SH3_PCREL8_LONG |
0x000A |
Een verwijzing naar de 8-bits instructie die de effectieve 32-bits relatieve verschuiving van het doelsymbool bevat. |
IMAGE_REL_SH3_PCREL12_WORD |
0x000B |
Een verwijzing naar de 16-bits instructie waarvan de lage 12 bits de effectieve 16-bits relatieve verschuiving van het doelsymbool bevatten. |
IMAGE_REL_SH3_STARTOF_SECTION |
0x000C |
Een verwijzing naar een 32-bits locatie die de VA is van de sectie die het doelsymbool bevat. |
IMAGE_REL_SH3_SIZEOF_SECTION |
0x000D |
Een verwijzing naar de 32-bits locatie die de grootte is van de sectie die het doelsymbool bevat. |
IMAGE_REL_SH3_SECTION |
0x000E |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_SH3_SECREL |
0x000F |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_SH3_DIRECT32_NB |
0x0010 |
De 32-bits RVA van het doelsymbool. |
IMAGE_REL_SH3_GPREL4_LONG |
0x0011 |
GP relatief. |
IMAGE_REL_SH3_TOKEN |
0x0012 |
CLR-token. |
IMAGE_REL_SHM_PCRELPT |
0x0013 |
De verschuiving van de huidige instructie in longwords. Als de NOMODE-bit niet is ingesteld, voegt u de inverse van de lage bit bij bit 32 in om PTA of PTB te selecteren. |
IMAGE_REL_SHM_REFLO |
0x0014 |
De lage 16 bits van het 32-bits adres. |
IMAGE_REL_SHM_REFHALF |
0x0015 |
De hoge 16 bits van het 32-bits adres. |
IMAGE_REL_SHM_RELLO |
0x0016 |
De lage 16 bits van het relatieve adres. |
IMAGE_REL_SHM_RELHALF |
0x0017 |
De hoge 16 bits van het relatieve adres. |
IMAGE_REL_SHM_PAIR |
0x0018 |
De herlocatie is alleen geldig wanneer deze onmiddellijk volgt op een REFHALF-, RELHALF- of RELLO-herlocatie. Het veld SymbolTableIndex van de verplaatsing bevat een verplaatsing en geen index in de symbooltabel. |
IMAGE_REL_SHM_NOMODE |
0x8000 |
De verplaatsing negeert de sectiemodus. |
IBM PowerPC-processors
De volgende indicatoren voor herlocatietypen worden gedefinieerd voor PowerPC-processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_PPC_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_PPC_ADDR64 |
0x0001 |
De 64-bits VA van het doel. |
IMAGE_REL_PPC_ADDR32 |
0x0002 |
De 32-bits VA van het doel. |
IMAGE_REL_PPC_ADDR24 |
0x0003 |
De lage 24 bits van de VA van het doel. Dit is alleen geldig wanneer het doelsymbool absoluut is en kan worden uitgebreid tot de oorspronkelijke waarde. |
IMAGE_REL_PPC_ADDR16 |
0x0004 |
De lage 16 bits van de VA van het doel. |
IMAGE_REL_PPC_ADDR14 |
0x0005 |
De lage 14 bits van de VA van het doel. Dit is alleen geldig wanneer het doelsymbool absoluut is en kan worden uitgebreid tot de oorspronkelijke waarde. |
IMAGE_REL_PPC_REL24 |
0x0006 |
Een 24-bits pc-relatieve verschuiving naar de locatie van het symbool. |
IMAGE_REL_PPC_REL14 |
0x0007 |
Een 14-bits pc-relatieve verschuiving naar de locatie van het symbool. |
IMAGE_REL_PPC_ADDR32NB |
0x000A |
De 32-bits RVA van het doel. |
IMAGE_REL_PPC_SECREL |
0x000B |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_PPC_SECTION |
0x000C |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_PPC_SECREL16 |
0x000F |
De 16-bits offset van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_PPC_REFHI |
0x0010 |
De hoge 16 bits van de 32-bits VA van het doel. Dit wordt gebruikt voor de eerste instructie in een reeks met twee instructies waarmee een volledig adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die zijn genomen van de locatie die wordt verplaatst. |
IMAGE_REL_PPC_REFLO |
0x0011 |
De lage 16 bits van de VA van het doel. |
IMAGE_REL_PPC_PAIR |
0x0012 |
Een herlocatie die alleen geldig is wanneer deze onmiddellijk volgt op een REFHI- of SECRELHI-herlocatie. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel. |
IMAGE_REL_PPC_SECRELLO |
0x0013 |
De lage 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie. |
IMAGE_REL_PPC_GPREL |
0x0015 |
De 16-bits ondertekende verplaatsing van het doel ten opzichte van het GP-register. |
IMAGE_REL_PPC_TOKEN |
0x0016 |
Het CLR-token. |
Intel 386-processors
De volgende herlocatietypeindicatoren worden gedefinieerd voor Intel 386 en compatibele processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_I386_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_I386_DIR16 |
0x0001 |
Niet ondersteund. |
IMAGE_REL_I386_REL16 |
0x0002 |
Niet ondersteund. |
IMAGE_REL_I386_DIR32 |
0x0006 |
De 32-bits VA van het doel. |
IMAGE_REL_I386_DIR32NB |
0x0007 |
De 32-bits RVA van het doel. |
IMAGE_REL_I386_SEG12 |
0x0009 |
Niet ondersteund. |
IMAGE_REL_I386_SECTION |
0x000A |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_I386_SECREL |
0x000B |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_I386_TOKEN |
0x000C |
Het CLR-token. |
IMAGE_REL_I386_SECREL7 |
0x000D |
Een 7-bits offset van de basis van de sectie die het doel bevat. |
IMAGE_REL_I386_REL32 |
0x0014 |
De 32-bits relatieve verplaatsing naar het doel. Dit ondersteunt de x86 relatieve vertakking en aanroepinstructies. |
Intel Itanium Processor Family (IPF)
De volgende herlocatietypeindicatoren worden gedefinieerd voor de Intel Itanium-processorfamilie en compatibele processors. Houd er rekening mee dat verplaatsingen op instructies gebruikmaken van de offset van de bundel en het sleufnummer voor de verplaatsingsverplaatsing.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_IA64_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_IA64_IMM14 |
0x0001 |
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze in de opgegeven sleuf in de IMM14-bundel wordt ingevoegd. Het verplaatsingsdoel moet absoluut zijn of de afbeelding moet worden vastgezet. |
IMAGE_REL_IA64_IMM22 |
0x0002 |
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze in de opgegeven sleuf in de IMM22-bundel wordt ingevoegd. Het verplaatsingsdoel moet absoluut zijn of de afbeelding moet worden vastgezet. |
IMAGE_REL_IA64_IMM64 |
0x0003 |
Het sleufnummer van deze verplaatsing moet één (1) zijn. De herlocatie kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres voordat deze wordt opgeslagen in alle drie de sleuven van de IMM64-bundel. |
IMAGE_REL_IA64_DIR32 |
0x0004 |
De 32-bits VA van het doel. Dit wordt alleen ondersteund voor /LARGEADDRESSAWARE:NO-installatiekopieën. |
IMAGE_REL_IA64_DIR64 |
0x0005 |
De 64-bits VA van het doel. |
IMAGE_REL_IA64_PCREL21B |
0x0006 |
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing zijn nul en worden niet opgeslagen. |
IMAGE_REL_IA64_PCREL21M |
0x0007 |
De instructie wordt opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing, die nul zijn, worden niet opgeslagen. |
IMAGE_REL_IA64_PCREL21F |
0x0008 |
De LSBs van de verschuiving van deze verplaatsing moeten het sleufnummer bevatten, terwijl de rest het bundeladres is. De bundel is opgelost met de 25-bits relatieve verplaatsing naar het 16-bits uitgelijnde doel. De lage 4 bits van de verplaatsing zijn nul en worden niet opgeslagen. |
IMAGE_REL_IA64_GPREL22 |
0x0009 |
De instructieverplaatsing kan worden gevolgd door een ADDEND-herlocatie waarvan de waarde wordt toegevoegd aan het doeladres en vervolgens een 22-bits GP-relatieve verschuiving die wordt berekend en toegepast op de GPREL22 bundel. |
IMAGE_REL_IA64_LTOFF22 |
0x000A |
De instructie is opgelost met de 22-bits GP-relatieve verschuiving naar de letterlijke tabelvermelding van het doelsymbool. De linker maakt deze letterlijke tabelvermelding op basis van deze verplaatsing en de ADDEND-herlocatie die kan volgen. |
IMAGE_REL_IA64_SECTION |
0x000B |
De 16-bits sectieindex van de sectie bevat het doel. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_IA64_SECREL22 |
0x000C |
De instructie is opgelost met de 22-bits offset van het doel vanaf het begin van de sectie. Deze verplaatsing kan onmiddellijk worden gevolgd door een ADDEND-verplaatsing, waarvan het veld Waarde de 32-bits niet-ondertekende verschuiving van het doel vanaf het begin van de sectie bevat. |
IMAGE_REL_IA64_SECREL64I |
0x000D |
Het sleufnummer voor deze verplaatsing moet één (1) zijn. De instructie is opgelost met de 64-bits offset van het doel vanaf het begin van de sectie. Deze verplaatsing kan onmiddellijk worden gevolgd door een ADDEND-verplaatsing waarvan het veld Waarde de 32-bits niet-ondertekende verschuiving van het doel bevat vanaf het begin van de sectie. |
IMAGE_REL_IA64_SECREL32 |
0x000E |
Het adres van gegevens dat moet worden opgelost met de 32-bits offset van het doel vanaf het begin van de sectie. |
IMAGE_REL_IA64_DIR32NB |
0x0010 |
De 32-bits RVA van het doel. |
IMAGE_REL_IA64_SREL14 |
0x0011 |
Dit wordt toegepast op een ondertekende 14-bits direct dat het verschil bevat tussen twee herverdeelbare doelen. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden. |
IMAGE_REL_IA64_SREL22 |
0x0012 |
Dit wordt toegepast op een ondertekende 22-bits direct met het verschil tussen twee herverdeelbare doelen. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden. |
IMAGE_REL_IA64_SREL32 |
0x0013 |
Dit wordt toegepast op een ondertekende 32-bits direct dat het verschil tussen twee herverdeelbare waarden bevat. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden. |
IMAGE_REL_IA64_UREL32 |
0x0014 |
Dit wordt toegepast op een niet-ondertekende 32-bits onmiddellijke waarde die het verschil tussen twee herverdeelbare waarden bevat. Dit is een declaratief veld voor de linker die aangeeft dat de compiler deze waarde al heeft verzonden. |
IMAGE_REL_IA64_PCREL60X |
0x0015 |
Een 60-bits pc-relatieve fixup die altijd als EEN URL-instructie van een MLX-bundel blijft. |
IMAGE_REL_IA64_PCREL60B |
0x0016 |
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MBB-bundel met NOP. B in slot 1 en een 25-bits BR-instructie (met de 4 laagste bits allemaal nul en verwijderd) in sleuf 2. |
IMAGE_REL_IA64_PCREL60F |
0x0017 |
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MFB-bundel met NOP. F in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2. |
IMAGE_REL_IA64_PCREL60I |
0x0018 |
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MIB-bundel met NOP. Ik in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2. |
IMAGE_REL_IA64_PCREL60M |
0x0019 |
Een 60-bits pc-relatieve fixup. Als de doelverplaatsing in een ondertekend 25-bits veld past, converteert u de hele bundel naar een MMB-bundel met NOP. M in slot 1 en een 25-bits (4 laagste bits alle nul en verwijderde) BR-instructie in slot 2. |
IMAGE_REL_IA64_IMMGPREL64 |
0x001a |
Een 64-bits GP-relatieve fixup. |
IMAGE_REL_IA64_TOKEN |
0x001b |
Een CLR-token. |
IMAGE_REL_IA64_GPREL32 |
0x001c |
Een 32-bits GP-relatieve fixup. |
IMAGE_REL_IA64_ADDEND |
0x001F |
De verplaatsing is alleen geldig wanneer deze onmiddellijk volgt op een van de volgende verplaatsingen: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I of SECREL32. De waarde bevat de addend die moet worden toegepast op instructies binnen een bundel, niet voor gegevens. |
MIPS-processors
De volgende indicatoren voor herlocatietypen worden gedefinieerd voor MIPS-processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_MIPS_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_MIPS_REFHALF |
0x0001 |
De hoge 16 bits van de 32-bits VA van het doel. |
IMAGE_REL_MIPS_REFWORD |
0x0002 |
De 32-bits VA van het doel. |
IMAGE_REL_MIPS_JMPADDR |
0x0003 |
De lage 26 bits van de VA van het doel. Dit ondersteunt de MIPS J- en JAL-instructies. |
IMAGE_REL_MIPS_REFHI |
0x0004 |
De hoge 16 bits van de 32-bits VA van het doel. Dit wordt gebruikt voor de eerste instructie in een reeks met twee instructies waarmee een volledig adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst. |
IMAGE_REL_MIPS_REFLO |
0x0005 |
De lage 16 bits van de VA van het doel. |
IMAGE_REL_MIPS_GPREL |
0x0006 |
Een 16-bits ondertekende verplaatsing van het doel ten opzichte van het GP-register. |
IMAGE_REL_MIPS_LITERAL |
0x0007 |
Hetzelfde als IMAGE_REL_MIPS_GPREL. |
IMAGE_REL_MIPS_SECTION |
0x000A |
De 16-bits sectieindex van de sectie bevat het doel. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_MIPS_SECREL |
0x000B |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_MIPS_SECRELLO |
0x000C |
De lage 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie. |
IMAGE_REL_MIPS_SECRELHI |
0x000D |
De hoge 16 bits van de 32-bits offset van het doel vanaf het begin van de sectie. Een IMAGE_REL_MIPS_PAIR verplaatsing moet onmiddellijk volgen. De SymbolTableIndex van de pair-verplaatsing bevat een ondertekende 16-bits verplaatsing die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst. |
IMAGE_REL_MIPS_JMPADDR16 |
0x0010 |
De lage 26 bits van de VA van het doel. Dit ondersteunt de MIPS16 JAL-instructie. |
IMAGE_REL_MIPS_REFWORDNB |
0x0022 |
De 32-bits RVA van het doel. |
IMAGE_REL_MIPS_PAIR |
0x0025 |
De herlocatie is alleen geldig wanneer deze direct volgt op een REFHI- of SECRELHI-herlocatie. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel. |
Mitsubishi M32R
De volgende herlocatietypeindicatoren worden gedefinieerd voor de Mitsubishi M32R-processors.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_M32R_ABSOLUTE |
0x0000 |
De verplaatsing wordt genegeerd. |
IMAGE_REL_M32R_ADDR32 |
0x0001 |
De 32-bits VA van het doel. |
IMAGE_REL_M32R_ADDR32NB |
0x0002 |
De 32-bits RVA van het doel. |
IMAGE_REL_M32R_ADDR24 |
0x0003 |
De 24-bits VA van het doel. |
IMAGE_REL_M32R_GPREL16 |
0x0004 |
De 16-bits offset van het GP-register van het doel. |
IMAGE_REL_M32R_PCREL24 |
0x0005 |
De 24-bits offset van het programmateller (PC) van het doel, verschoven naar links met 2 bits en sign-extended |
IMAGE_REL_M32R_PCREL16 |
0x0006 |
De 16-bits verschuiving van het doel van de pc, verschoven naar links met 2 bits en teken-extended |
IMAGE_REL_M32R_PCREL8 |
0x0007 |
De 8-bits verschuiving van het doel van de pc, verschoven naar links met 2 bits en teken-extended |
IMAGE_REL_M32R_REFHALF |
0x0008 |
De 16 MB's van de doel-VA. |
IMAGE_REL_M32R_REFHI |
0x0009 |
De 16 MB's van de doel-VA, aangepast voor de LSB-tekenextensie. Dit wordt gebruikt voor de eerste instructie in een twee-instructiereeks waarmee een volledig 32-bits adres wordt geladen. Deze verplaatsing moet onmiddellijk worden gevolgd door een PAIR-verplaatsing waarvan SymbolTableIndex een ondertekende 16-bits verplaatsing bevat die wordt toegevoegd aan de bovenste 16 bits die worden genomen van de locatie die wordt verplaatst. |
IMAGE_REL_M32R_REFLO |
0x000A |
De 16 LSBs van de doel-VA. |
IMAGE_REL_M32R_PAIR |
0x000B |
De herlocatie moet de REFHI-verplaatsing volgen. De SymbolTableIndex bevat een verplaatsing en geen index in de symbooltabel. |
IMAGE_REL_M32R_SECTION |
0x000C |
De 16-bits sectieindex van de sectie die het doel bevat. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens. |
IMAGE_REL_M32R_SECREL |
0x000D |
De 32-bits verschuiving van het doel vanaf het begin van de sectie. Dit wordt gebruikt ter ondersteuning van foutopsporingsgegevens en lokale opslag van statische threads. |
IMAGE_REL_M32R_TOKEN |
0x000E |
Het CLR-token. |
COFF-regelnummers (afgeschaft)
COFF-regelnummers worden niet meer geproduceerd en worden in de toekomst niet verbruikt.
COFF-regelnummers geven de relatie tussen code- en regelnummers in bronbestanden aan. De Microsoft-indeling voor COFF-regelnummers is vergelijkbaar met standaard-COFF, maar is uitgebreid om één sectie toe te staan om te relateren aan regelnummers in meerdere bronbestanden.
COFF-regelnummers bestaan uit een matrix met records met een vaste lengte. De locatie (bestandsverschil) en de grootte van de matrix worden opgegeven in de sectiekoptekst. Elke regelnummerrecord heeft de volgende notatie.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Type (*) |
Dit is een samenvoeging van twee velden: SymbolTableIndex en VirtualAddress. Of SymbolTableIndex of RVA wordt gebruikt, is afhankelijk van de waarde van het lijnnummer. |
4 |
2 |
Lijnnummer |
Als u geen nul opgeeft, geeft dit veld een regelnummer op basis van één. Wanneer nul wordt het veld Type geïnterpreteerd als een symbooltabelindex voor een functie. |
Het veld Type is een samenvoeging van twee 4-bytevelden: SymbolTableIndex en VirtualAddress.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
SymbolTableIndex |
Wordt gebruikt wanneer lijnnummer nul is: index voor een symbooltabelvermelding voor een functie. Deze indeling wordt gebruikt om de functie aan te geven waarnaar een groep regelnummerrecords verwijst. |
0 |
4 |
VirtualAddress |
Wordt gebruikt als lijnnummer niet-nul is: de RVA van de uitvoerbare code die overeenkomt met de aangegeven bronregel. In een objectbestand bevat dit de VA in de sectie. |
Een regelnummerrecord kan het veld Regelnummer instellen op nul en verwijzen naar een functiedefinitie in de symbooltabel of als standaardregelnummerinvoer door een positief geheel getal (regelnummer) en het bijbehorende adres in de objectcode te geven.
Een groep regelnummervermeldingen begint altijd met de eerste notatie: de index van een functiesymbool. Als dit de eerste regelnummerrecord in de sectie is, is dit ook de comdat-symboolnaam voor de functie als de vlag COMDAT van de sectie is ingesteld. Zie COMDAT-secties (alleen object). De hulprecord van de functie in de symbooltabel heeft een aanwijzer naar het veld Lijnnummer dat verwijst naar dezelfde regelnummerrecord.
Een record die een functie identificeert, wordt gevolgd door een willekeurig aantal regelnummeritems die werkelijke informatie over het regelnummer geven (dat wil gezegd: vermeldingen met regelnummer groter dan nul). Deze vermeldingen zijn één gebaseerd ten opzichte van het begin van de functie en vertegenwoordigen elke bronregel in de functie, met uitzondering van de eerste regel.
De eerste record voor het regelnummer voor het volgende voorbeeld geeft bijvoorbeeld de functie ReverseSign op (SymbolTableIndex of ReverseSign en Linenumber ingesteld op nul). Vervolgens worden records met de waarden van het regelnummer 1, 2 en 3 gevolgd, die overeenkomen met de bronregels, zoals wordt weergegeven:
// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2: return -1 * i;
3: }
Tabel COFF-symbool
De symbooltabel in deze sectie wordt overgenomen van de traditionele COFF-indeling. Dit verschilt van microsoft Visual C++ foutopsporingsgegevens. Een bestand kan zowel een COFF-symbooltabel als informatie over foutopsporing in Visual C++ bevatten en de twee worden gescheiden gehouden. Sommige Microsoft-hulpprogramma's gebruiken de symbooltabel voor beperkte maar belangrijke doeleinden, zoals het doorgeven van COMDAT-gegevens aan de linker. Sectienamen en bestandsnamen, evenals code- en gegevenssymbolen, worden weergegeven in de symbooltabel.
De locatie van de symbooltabel wordt aangegeven in de COFF-header.
De symbooltabel is een matrix met records, elke 18 bytes lang. Elke record is een standaard- of hulprecord voor symbolentabellen. Een standaardrecord definieert een symbool of naam en heeft de volgende indeling.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
8 |
Naam (*) |
De naam van het symbool, vertegenwoordigd door een samenvoeging van drie structuren. Er wordt een matrix van 8 bytes gebruikt als de naam niet langer is dan 8 bytes. Zie symboolnaamweergavevoor meer informatie. |
8 |
4 |
Waarde |
De waarde die is gekoppeld aan het symbool. De interpretatie van dit veld is afhankelijk van SectionNumber en StorageClass. Een typische betekenis is het onvervangbare adres. |
12 |
2 |
SectionNumber |
Het ondertekende gehele getal dat de sectie identificeert, met behulp van een op één gebaseerde index in de sectietabel. Sommige waarden hebben een speciale betekenis, zoals gedefinieerd in sectie 5.4.2, 'Sectienummerwaarden'. |
14 |
2 |
Type |
Een getal dat het type vertegenwoordigt. Microsoft-hulpprogramma's stellen dit veld in op 0x20 (functie) of 0x0 (geen functie). Zie typeweergavevoor meer informatie. |
16 |
1 |
StorageClass |
Een opgesomde waarde die de opslagklasse vertegenwoordigt. Zie Storage Classvoor meer informatie. |
17 |
1 |
NumberOfAuxSymbolen |
Het aantal vermeldingen in de hulpsymbooltabel die volgen op deze record. |
Nul of meer hulprecords voor symbolentabellen volgen onmiddellijk elke standaardrecord voor symbolentabellen. Meestal volgt echter niet meer dan één hulp-symbooltabelrecord een standaardrecord voor symbolentabellen (met uitzondering van .file records met lange bestandsnamen). Elke hulprecord heeft dezelfde grootte als een standaard-symbooltabelrecord (18 bytes), maar in plaats van een nieuw symbool te definiëren, geeft de hulprecord aanvullende informatie over het laatste gedefinieerde symbool. De keuze van verschillende indelingen die moeten worden gebruikt, is afhankelijk van het veld StorageClass. Momenteel gedefinieerde notaties voor hulptabelrecords voor symbolen worden weergegeven in sectie 5.5, 'Hulpsymboolrecords'.
Hulpprogramma's die COFF-symbooltabellen lezen, moeten hulpsymboolrecords negeren waarvan de interpretatie onbekend is. Hierdoor kan de indeling van de symbooltabel worden uitgebreid om nieuwe hulprecords toe te voegen, zonder dat bestaande hulpprogramma's worden onderbroken.
Weergave van symboolnaam
Het veld ShortName in een symbooltabel bestaat uit 8 bytes die de naam zelf bevatten, als deze niet langer is dan 8 bytes, of het veld ShortName geeft een verschuiving in de tekenreekstabel. Als u wilt bepalen of de naam zelf of een offset wordt opgegeven, test u de eerste 4 bytes voor gelijkheid tot nul.
Volgens de conventie worden de namen behandeld als met nul beëindigde UTF-8 gecodeerde tekenreeksen.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
8 |
ShortName |
Een matrix van 8 bytes. Deze matrix wordt gevuld met null-waarden aan de rechterkant als de naam kleiner is dan 8 bytes. |
0 |
4 |
Nullen |
Een veld dat is ingesteld op alle nullen als de naam langer is dan 8 bytes. |
4 |
4 |
Afstand |
Een verschuiving in de tekenreekstabel. |
Waarden voor sectienummer
Normaal gesproken is het veld Sectiewaarde in een symbooltabelvermelding een op één gebaseerde index in de sectietabel. Dit veld is echter een ondertekend geheel getal en kan negatieve waarden aannemen. De volgende waarden, kleiner dan één, hebben speciale betekenissen.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_SYM_UNDEFINED |
0 |
Er is nog geen sectie toegewezen aan de symboolrecord. Een waarde van nul geeft aan dat een verwijzing naar een extern symbool ergens anders wordt gedefinieerd. Een waarde van niet-nul is een gemeenschappelijk symbool met een grootte die wordt opgegeven door de waarde. |
IMAGE_SYM_ABSOLUTE |
-1 |
Het symbool heeft een absolute waarde (niet herverdeelbaar) en is geen adres. |
IMAGE_SYM_DEBUG |
-2 |
Het symbool bevat algemene informatie over het type of de foutopsporing, maar komt niet overeen met een sectie. Microsoft-hulpprogramma's gebruiken deze instelling samen met .file records (storage class FILE). |
Typeweergave
Het veld Type van een symbooltabel bevat 2 bytes, waarbij elke byte typegegevens vertegenwoordigt. De LSB vertegenwoordigt het eenvoudige gegevenstype (basis) en de MSB vertegenwoordigt het complexe type, indien van toepassing:
MSB | LSB |
---|---|
Complex type: geen, aanwijzer, functie, matrix. |
Basistype: geheel getal, drijvende komma, enzovoort. |
De volgende waarden worden gedefinieerd voor het basistype, hoewel Microsoft-hulpprogramma's dit veld doorgaans niet gebruiken en de LSB instellen op 0. In plaats daarvan wordt foutopsporingsinformatie in Visual C++ gebruikt om typen aan te geven. De mogelijke COFF-waarden worden hier echter vermeld voor volledigheid.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_SYM_TYPE_NULL |
0 |
Geen typegegevens of onbekend basistype. Microsoft-hulpprogramma's gebruiken deze instelling |
IMAGE_SYM_TYPE_VOID |
1 |
Geen geldig type; gebruikt met ongeldige aanwijzers en functies |
IMAGE_SYM_TYPE_CHAR |
2 |
Een teken (ondertekende byte) |
IMAGE_SYM_TYPE_SHORT |
3 |
Een geheel getal met 2 bytes dat is ondertekend |
IMAGE_SYM_TYPE_INT |
4 |
Een natuurlijk geheel getaltype (normaal gesproken 4 bytes in Windows) |
IMAGE_SYM_TYPE_LONG |
5 |
Een geheel getal met 4 bytes dat is ondertekend |
IMAGE_SYM_TYPE_FLOAT |
6 |
Een 4-byte-drijvendekommagetal |
IMAGE_SYM_TYPE_DOUBLE |
7 |
Een getal van 8 bytes met drijvende komma |
IMAGE_SYM_TYPE_STRUCT |
8 |
Een structuur |
IMAGE_SYM_TYPE_UNION |
9 |
Een samenvoeging |
IMAGE_SYM_TYPE_ENUM |
10 |
Een geïnventariseerd type |
IMAGE_SYM_TYPE_MOE |
11 |
Een lid van opsomming (een specifieke waarde) |
IMAGE_SYM_TYPE_BYTE |
12 |
Een byte; niet-ondertekend geheel getal van 1 bytes |
IMAGE_SYM_TYPE_WORD |
13 |
Een woord; geheel getal met 2 bytes |
IMAGE_SYM_TYPE_UINT |
14 |
Een niet-ondertekend geheel getal van natuurlijke grootte (normaal gesproken 4 bytes) |
IMAGE_SYM_TYPE_DWORD |
15 |
Een niet-ondertekend geheel getal van 4 bytes |
De belangrijkste byte geeft aan of het symbool een aanwijzer is naar, functie retourneert of matrix van het basistype dat is opgegeven in de LSB. Microsoft-hulpprogramma's gebruiken dit veld alleen om aan te geven of het symbool een functie is, zodat de slechts twee resulterende waarden 0x0 en 0x20 voor het veld Type. Andere hulpprogramma's kunnen dit veld echter gebruiken om meer informatie te communiceren.
Het is erg belangrijk om het functiekenmerk correct op te geven. Deze informatie is vereist om incrementeel koppelen correct te laten werken. Voor sommige architecturen is de informatie mogelijk vereist voor andere doeleinden.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_SYM_DTYPE_NULL |
0 |
Geen afgeleid type; het symbool is een eenvoudige scalaire variabele. |
IMAGE_SYM_DTYPE_POINTER |
1 |
Het symbool is een aanwijzer naar het basistype. |
IMAGE_SYM_DTYPE_FUNCTION |
2 |
Het symbool is een functie die een basistype retourneert. |
IMAGE_SYM_DTYPE_ARRAY |
3 |
Het symbool is een matrix van het basistype. |
Opslagklasse
Het veld StorageClass van de symbooltabel geeft aan welk type definitie een symbool vertegenwoordigt. In de volgende tabel ziet u mogelijke waarden. Het veld StorageClass is een geheel getal van 1 byte dat niet is ondertekend. De speciale waarde -1 moet derhalve worden beschouwd als niet-ondertekende equivalent, 0xFF.
Hoewel in de traditionele COFF-indeling veel waarden voor opslagklasse worden gebruikt, zijn Microsoft-hulpprogramma's afhankelijk van de foutopsporingsindeling van Visual C++ voor de meeste symbolische informatie en gebruiken doorgaans slechts vier opslagklassewaarden: EXTERNAL (2), STATIC (3), FUNCTION (101) en FILE (103). Behalve in de tweede kolomkop hieronder moet 'Waarde' worden gebruikt om het waardeveld van de symboolrecord te betekenen (waarvan de interpretatie afhankelijk is van het getal dat is gevonden als de opslagklasse).
Constant | Waarde | Beschrijving/interpretatie van het veld Waarde |
---|---|---|
IMAGE_SYM_CLASS_END_OF_FUNCTION |
-1 (0xFF) |
Een speciaal symbool dat het einde van de functie aangeeft voor foutopsporing. |
IMAGE_SYM_CLASS_NULL |
0 |
Geen toegewezen opslagklasse. |
IMAGE_SYM_CLASS_AUTOMATIC |
1 |
De automatische variabele (stack). Het veld Waarde geeft de verschuiving van het stackframe op. |
IMAGE_SYM_CLASS_EXTERNAL |
2 |
Een waarde die Microsoft-hulpprogramma's gebruiken voor externe symbolen. Het veld Waarde geeft de grootte aan als het sectienummer IMAGE_SYM_UNDEFINED (0). Als het sectienummer niet nul is, geeft het veld Waarde de verschuiving in de sectie op. |
IMAGE_SYM_CLASS_STATIC |
3 |
De verschuiving van het symbool in de sectie. Als het veld Waarde nul is, vertegenwoordigt het symbool een sectienaam. |
IMAGE_SYM_CLASS_REGISTER |
4 |
Een registervariabele. Het veld Waarde geeft het registernummer op. |
IMAGE_SYM_CLASS_EXTERNAL_DEF |
5 |
Een symbool dat extern is gedefinieerd. |
IMAGE_SYM_CLASS_LABEL |
6 |
Een codelabel dat in de module is gedefinieerd. Het veld Waarde geeft de verschuiving van het symbool in de sectie op. |
IMAGE_SYM_CLASS_UNDEFINED_LABEL |
7 |
Een verwijzing naar een codelabel dat niet is gedefinieerd. |
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT |
8 |
Het structuurlid. Het veld Waarde geeft het nde lid op. |
IMAGE_SYM_CLASS_ARGUMENT |
9 |
Een formeel argument (parameter) van een functie. Het veld Waarde geeft het nde argument op. |
IMAGE_SYM_CLASS_STRUCT_TAG |
10 |
De tagnaamvermelding van de structuur. |
IMAGE_SYM_CLASS_MEMBER_OF_UNION |
11 |
Een lid van de vereniging. Het veld Waarde geeft het nde lid op. |
IMAGE_SYM_CLASS_UNION_TAG |
12 |
De vermelding tagnaam van Union. |
IMAGE_SYM_CLASS_TYPE_DEFINITION |
13 |
Een Typedef-vermelding. |
IMAGE_SYM_CLASS_UNDEFINED_STATIC |
14 |
Een statische gegevensdeclaratie. |
IMAGE_SYM_CLASS_ENUM_TAG |
15 |
Een opsommingstype tagnaamvermelding. |
IMAGE_SYM_CLASS_MEMBER_OF_ENUM |
16 |
Een lid van een opsomming. Het veld Waarde geeft het nde lid op. |
IMAGE_SYM_CLASS_REGISTER_PARAM |
17 |
Een registerparameter. |
IMAGE_SYM_CLASS_BIT_FIELD |
18 |
Een bitveldverwijzing. Het veld Waarde geeft de nde bit in het bitveld op. |
IMAGE_SYM_CLASS_BLOCK |
100 |
Een .bb-record (begin van blok) of .eb (einde van blok). Het veld Waarde is het herbruikbare adres van de codelocatie. |
IMAGE_SYM_CLASS_FUNCTION |
101 |
Een waarde die Microsoft-hulpprogramma's gebruiken voor symboolrecords die de omvang van een functie definiëren: beginfunctie (.bf), eindfunctie (.ef) en lijnen in functie (.lf). Voor .lf-records geeft het veld Waarde het aantal bronregels in de functie. Voor .ef-records geeft het veld Waarde de grootte van de functiecode. |
IMAGE_SYM_CLASS_END_OF_STRUCT |
102 |
Een einde van de structuurvermelding. |
IMAGE_SYM_CLASS_FILE |
103 |
Een waarde die microsoft-hulpprogramma's, evenals de traditionele COFF-indeling, gebruikt voor de record met het bronbestandsymbool. Het symbool wordt gevolgd door hulprecords waarmee het bestand een naam krijgt. |
IMAGE_SYM_CLASS_SECTION |
104 |
Een definitie van een sectie (Microsoft-hulpprogramma's gebruiken in plaats daarvan STATISCHE opslagklasse). |
IMAGE_SYM_CLASS_WEAK_EXTERNAL |
105 |
Een zwak extern. Zie Hulpindeling 3: Zwakke externenvoor meer informatie. |
IMAGE_SYM_CLASS_CLR_TOKEN |
107 |
Een CLR-tokensymbool. De naam is een ASCII-tekenreeks die bestaat uit de hexadecimale waarde van het token. Zie CLR-tokendefinitie (alleen object)voor meer informatie. |
Hulpsymboolrecords
Hulpsymbooltabelrecords volgen altijd en zijn van toepassing op een standaardtabelrecord. Een hulprecord kan elke indeling hebben die de hulpprogramma's kunnen herkennen, maar er moeten 18 bytes voor deze records worden toegewezen, zodat de symbooltabel wordt onderhouden als een matrix met een normale grootte. Momenteel herkennen Microsoft-hulpprogramma's hulpindelingen voor de volgende soorten records: functiedefinities, begin- en eindsymbolen (.bf en .ef), zwakke externen, bestandsnamen en sectiedefinities.
Het traditionele COFF-ontwerp bevat ook hulprecordindelingen voor matrices en structuren. Microsoft-hulpprogramma's gebruiken deze niet, maar plaats in plaats daarvan die symbolische informatie in de foutopsporingsindeling van Visual C++ in de secties voor foutopsporing.
Hulpindeling 1: functiedefinities
Een symbooltabelrecord markeert het begin van een functiedefinitie als deze al het volgende heeft: een opslagklasse van EXTERNAL (2), een typewaarde die aangeeft dat het een functie is (0x20) en een sectienummer dat groter is dan nul. Houd er rekening mee dat een symbooltabelrecord met een sectienummer UNDEFINED (0) de functie niet definieert en geen hulprecord heeft. Symboolrecords voor functiedefinities worden gevolgd door een hulprecord in de indeling die hieronder wordt beschreven:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
TagIndex |
De symbooltabelindex van de bijbehorende symboolrecord .bf (beginfunctie). |
4 |
4 |
TotalSize |
De grootte van de uitvoerbare code voor de functie zelf. Als de functie zich in een eigen sectie bevindt, is de SizeOfRawData in de sectiekop groter of gelijk aan dit veld, afhankelijk van de uitlijningsoverwegingen. |
8 |
4 |
PointerToLinenumber |
De bestandsverschuiving van de eerste COFF-regelnummervermelding voor de functie, of nul als er geen bestaat. Zie COFF-regelnummers (afgeschaft)voor meer informatie. |
12 |
4 |
PointerToNextFunction |
De index van de symbooltabel van de record voor de volgende functie. Als de functie de laatste in de symbooltabel is, wordt dit veld ingesteld op nul. |
16 |
2 |
Ongebruikt |
Hulpopmaak 2: .bf- en .ef-symbolen
Voor elke functiedefinitie in de symbooltabel beschrijven drie items het begin, einde en het aantal regels. Elk van deze symbolen heeft de opslagklasse FUNCTION (101):
Een symboolrecord met de naam .bf (beginfunctie). Het veld Waarde wordt niet gebruikt.
Een symboolrecord met de naam .lf (lijnen in functie). Het veld Waarde geeft het aantal regels in de functie.
Een symboolrecord met de naam .ef (einde van functie). Het veld Waarde heeft hetzelfde getal als het veld Totale grootte in de record voor het functiedefinitiesymbool.
De .bf- en EF-symboolrecords (maar niet .lf-records) worden gevolgd door een hulprecord met de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Ongebruikt |
|
4 |
2 |
Lijnnummer |
Het werkelijke rangnummer (1, 2, 3, enzovoort) in het bronbestand, dat overeenkomt met de .bf- of .ef-record. |
6 |
6 |
Ongebruikt |
|
12 |
4 |
PointerToNextFunction ( alleen .bf) |
De index van de symbooltabel van de volgende .bf-symboolrecord. Als de functie de laatste in de symbooltabel is, wordt dit veld ingesteld op nul. Het wordt niet gebruikt voor .ef-records. |
16 |
2 |
Ongebruikt |
Hulpindeling 3: Zwakke externen
Zwakke externen zijn een mechanisme voor objectbestanden die flexibiliteit op het moment van koppelen mogelijk maken. Een module kan een niet-opgelost extern symbool (sym1) bevatten, maar kan ook een hulprecord bevatten die aangeeft dat als sym1 niet aanwezig is op het moment van koppeling, een ander extern symbool (sym2) wordt gebruikt om verwijzingen op te lossen.
Als een definitie van sym1 is gekoppeld, wordt een externe verwijzing naar het symbool normaal opgelost. Als een definitie van sym1 niet is gekoppeld, verwijzen alle verwijzingen naar de zwakke externe voor sym1 in plaats daarvan naar sym2. Het externe symbool, sym2, moet altijd worden gekoppeld; doorgaans wordt deze gedefinieerd in de module die de zwakke verwijzing naar sym1 bevat.
Zwakke externe waarden worden vertegenwoordigd door een symbooltabelrecord met de klasse EXTERNAL Storage, UNDEF-sectienummer en een waarde van nul. De zwak-externe symboolrecord wordt gevolgd door een hulprecord met de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
TagIndex |
De symbooltabelindex van sym2, het symbool dat moet worden gekoppeld als sym1 niet wordt gevonden. |
4 |
4 |
Kenmerken |
Een waarde van IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY geeft aan dat er geen bibliotheekzoekactie naar sym1 moet worden uitgevoerd. Een waarde van IMAGE_WEAK_EXTERN_SEARCH_LIBRARY geeft aan dat een bibliotheekzoekactie naar sym1 moet worden uitgevoerd. Een waarde van IMAGE_WEAK_EXTERN_SEARCH_ALIAS geeft aan dat sym1 een alias is voor sym2. |
8 |
10 |
Ongebruikt |
Houd er rekening mee dat het veld Kenmerken niet is gedefinieerd in WINNT. H; In plaats daarvan wordt het veld Totale grootte gebruikt.
Hulpindeling 4: Bestanden
Deze indeling volgt een symbooltabelrecord met opslagklasse FILE (103). De symboolnaam zelf moet .file zijn en de hulprecord die volgt, geeft de naam van een broncodebestand.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
18 |
Bestandsnaam |
Een ANSI-tekenreeks die de naam van het bronbestand geeft. Dit wordt opgevuld met null-waarden als deze kleiner is dan de maximale lengte. |
Hulpindeling 5: sectiedefinities
Deze indeling volgt een symbooltabelrecord die een sectie definieert. Een dergelijke record heeft een symboolnaam die de naam is van een sectie (zoals .text of .drectve) en heeft opslagklasse STATIC (3). De hulprecord bevat informatie over de sectie waarnaar deze verwijst. Hierdoor wordt een deel van de informatie in de sectiekop gedupliceerd.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Lengte |
De grootte van sectiegegevens; hetzelfde als SizeOfRawData in de sectieheader. |
4 |
2 |
NumberOfRelocations |
Het aantal herplaatsingsvermeldingen voor de sectie. |
6 |
2 |
NumberOfLinenumbers |
Het aantal regelnummers voor de sectie. |
8 |
4 |
Checksum |
De controlesom voor gemeenschappelijke gegevens. Dit is van toepassing als de vlag IMAGE_SCN_LNK_COMDAT is ingesteld in de koptekst van de sectie. Zie COMDAT-secties (alleen object)voor meer informatie. |
12 |
2 |
Getal |
Eén index in de sectietabel voor de bijbehorende sectie. Dit wordt gebruikt wanneer de comdat-selectie-instelling 5 is. |
14 |
1 |
Selectie |
Het selectienummer COMDAT. Dit is van toepassing als de sectie een COMDAT-sectie is. |
15 |
3 |
Ongebruikt |
COMDAT-secties (alleen object)
Het veld Selectie van de aanvullende indeling van de sectiedefinitie is van toepassing als de sectie een COMDAT-sectie is. Een COMDAT-sectie is een sectie die kan worden gedefinieerd door meer dan één objectbestand. (De vlag IMAGE_SCN_LNK_COMDAT is ingesteld in het veld Sectievlagken van de sectiekop.) Het selectieveld bepaalt de manier waarop de linker de meerdere definities van COMDAT-secties oplost.
Het eerste symbool met de sectiewaarde van de sectie COMDAT moet het sectiesymbool zijn. Dit symbool heeft de naam van de sectie, het veld Waarde gelijk aan nul, het sectienummer van de betreffende COMDAT-sectie, het veld Type dat gelijk is aan IMAGE_SYM_TYPE_NULL, het veld Klasse gelijk aan IMAGE_SYM_CLASS_STATIC en één hulprecord. Het tweede symbool heet 'het COMDAT-symbool' en wordt gebruikt door de linker in combinatie met het selectieveld.
De waarden voor het selectieveld worden hieronder weergegeven.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_COMDAT_SELECT_NODUPLICATES |
1 |
Als dit symbool al is gedefinieerd, geeft de linker een fout 'vermenigvuldigen gedefinieerd symbool' uit. |
IMAGE_COMDAT_SELECT_ANY |
2 |
Elke sectie die hetzelfde COMDAT-symbool definieert, kan worden gekoppeld; de rest wordt verwijderd. |
IMAGE_COMDAT_SELECT_SAME_SIZE |
3 |
De linker kiest een willekeurige sectie tussen de definities voor dit symbool. Als alle definities niet dezelfde grootte hebben, wordt er een 'vermenigvuldigingssymbool' weergegeven. |
IMAGE_COMDAT_SELECT_EXACT_MATCH |
4 |
De linker kiest een willekeurige sectie tussen de definities voor dit symbool. Als alle definities niet exact overeenkomen, wordt er een 'vermenigvuldigen gedefinieerd symbool' weergegeven. |
IMAGE_COMDAT_SELECT_ASSOCIATIVE |
5 |
De sectie is gekoppeld als een bepaalde andere COMDAT-sectie is gekoppeld. Deze andere sectie wordt aangegeven door het veld Getal van de hulpsymboolrecord voor de sectiedefinitie. Deze instelling is handig voor definities met onderdelen in meerdere secties (bijvoorbeeld code in een en andere gegevens), maar waarbij alles moet worden gekoppeld of verwijderd als een set. De andere sectie waaraan deze sectie is gekoppeld, moet een COMDAT-sectie zijn, die een andere associatieve COMDAT-sectie kan zijn. De koppelingsketen van een associatieve COMDAT-sectie kan geen lus vormen. De sectiekoppelingsketen moet uiteindelijk naar een COMDAT-sectie komen waarvoor geen IMAGE_COMDAT_SELECT_ASSOCIATIVE set is ingesteld. |
IMAGE_COMDAT_SELECT_LARGEST |
6 |
De linker kiest de grootste definitie uit alle definities voor dit symbool. Als meerdere definities deze grootte hebben, is de keuze tussen deze definities willekeurig. |
CLR-tokendefinitie (alleen object)
Dit hulpsymbool volgt over het algemeen de IMAGE_SYM_CLASS_CLR_TOKEN. Het wordt gebruikt om een token te koppelen aan de naamruimte van de COFF-symbooltabel.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
1 |
bAuxType |
Moet IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1) zijn. |
1 |
1 |
bReserved |
Gereserveerd, moet nul zijn. |
2 |
4 |
SymbolTableIndex |
De symboolindex van het COFF-symbool waarnaar deze CLR-tokendefinitie verwijst. |
6 |
12 |
Gereserveerd, moet nul zijn. |
Tabel COFF-tekenreeks
Direct na de tabel COFF-symbool is de tabel COFF-tekenreeks. De positie van deze tabel wordt gevonden door het adres van de symbooltabel in de COFF-koptekst te nemen en het aantal symbolen toe te voegen dat wordt vermenigvuldigd met de grootte van een symbool.
Aan het begin van de tabel COFF-tekenreeks zijn 4 bytes die de totale grootte (in bytes) van de rest van de tekenreekstabel bevatten. Deze grootte omvat het grootteveld zelf, zodat de waarde op deze locatie 4 zou zijn als er geen tekenreeksen aanwezig waren.
Na de grootte zijn tekenreeksen die null-beëindigd zijn en waarnaar wordt verwezen door symbolen in de tabel COFF-symbolen.
De kenmerkcertificaattabel (alleen afbeelding)
Kenmerkcertificaten kunnen worden gekoppeld aan een installatiekopieën door een kenmerkcertificaattabel toe te voegen. De kenmerkcertificaattabel bestaat uit een set aaneengesloten, quadword-uitgelijnde kenmerkcertificaatvermeldingen. Nulopvulling wordt ingevoegd tussen het oorspronkelijke einde van het bestand en het begin van de kenmerkcertificaattabel om deze uitlijning te bereiken. Elke kenmerkcertificaatvermelding bevat de volgende velden.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
dwLength |
Hiermee geeft u de lengte van de kenmerkcertificaatvermelding. |
4 |
2 |
wRevision |
Bevat het versienummer van het certificaat. Zie de volgende tekst voor meer informatie. |
6 |
2 |
wCertificateType |
Hiermee geeft u het type inhoud in bCertificate. Zie de volgende tekst voor meer informatie. |
8 |
Zie het volgende |
bCertificate |
Bevat een certificaat, zoals een Authenticode-handtekening. Zie de volgende tekst voor meer informatie. |
De waarde van het virtuele adres uit de vermelding Certificaattabel in de optionele headergegevensmap is een bestandsverschil met de eerste kenmerkcertificaatvermelding. Volgende vermeldingen worden geopend door de dwLength-bytes van die vermelding naar boven af te ronden op een veelvoud van 8 bytes, vanaf het begin van de huidige kenmerkcertificaatvermelding. Dit gaat door totdat de som van de afgeronde dwLength-waarden gelijk is aan de waarde Grootte uit de vermelding Certificatentabel in de optionele headergegevensmap. Als de som van de afgeronde dwLength-waarden niet gelijk is aan de waarde Grootte, is de certificaattabel van het kenmerk of het veld Grootte beschadigd.
Als de certificaattabelvermelding van de optionele headergegevensmap bijvoorbeeld het volgende bevat:
virtual address = 0x5000
size = 0x1000
Het eerste certificaat begint bij offset 0x5000 vanaf het begin van het bestand op schijf. Ga als volgende door alle vermeldingen van het kenmerkcertificaat:
- Voeg de dwLength-waarde van het eerste kenmerkcertificaat toe aan de begin offset.
- Rond de waarde af van stap 1 naar boven naar het dichtstbijzijnde veelvoud van 8 byte om de verschuiving van de tweede kenmerkcertificaatvermelding te vinden.
- Voeg de offsetwaarde van stap 2 toe aan de dwLength-waarde van het tweede kenmerkcertificaat en afronden naar boven naar het dichtstbijzijnde veelvoud van 8 byte om de verschuiving van de derde kenmerkcertificaatvermelding te bepalen.
- Herhaal stap 3 voor elk opeenvolgend certificaat totdat de berekende offset gelijk is aan 0x6000 (0x5000 begin + 0x1000 totale grootte), wat aangeeft dat u de hele tabel hebt doorlopen.
U kunt de certificaatvermeldingen ook opsommen door de Win32-ImageEnumerateCertificates functie in een lus aan te roepen. Zie Verwijzingenvoor een koppeling naar de referentiepagina van de functie.
Vermeldingen in de kenmerkcertificaattabel kunnen elk certificaattype bevatten, zolang de vermelding de juiste dwLength-waarde, een unieke wRevision-waarde en een unieke wCertificateType-waarde heeft. Het meest voorkomende type certificaattabelvermelding is een WIN_CERTIFICATE structuur, die wordt gedocumenteerd in Wintrust.h en in de rest van deze sectie wordt besproken.
De opties voor de WIN_CERTIFICATE wRevision-lid omvatten (maar zijn niet beperkt tot) het volgende.
Waarde | Naam | Notities |
---|---|---|
0x0100 |
WIN_CERT_REVISION_1_0 |
Versie 1, verouderde versie van de Win_Certificate-structuur. Het wordt alleen ondersteund voor het verifiëren van verouderde Authenticode-handtekeningen |
0x0200 |
WIN_CERT_REVISION_2_0 |
Versie 2 is de huidige versie van de Win_Certificate-structuur. |
De opties voor de WIN_CERTIFICATE wCertificateType lid omvatten (maar zijn niet beperkt tot) de items in de volgende tabel. Houd er rekening mee dat sommige waarden momenteel niet worden ondersteund.
Waarde | Naam | Notities |
---|---|---|
0x0001 |
WIN_CERT_TYPE_X509 |
bCertificate bevat een X.509-certificaat Niet ondersteund |
0x0002 |
WIN_CERT_TYPE_PKCS_SIGNED_DATA |
bCertificate bevat een PKCS#7 SignedData-structuur |
0x0003 |
WIN_CERT_TYPE_RESERVED_1 |
Gereserveerd |
0x0004 |
WIN_CERT_TYPE_TS_STACK_SIGNED |
Terminal Server Protocol Stack-certificaatondertekening Niet ondersteund |
De WIN_CERTIFICATE structuur bCertificate lid bevat een bytematrix met variabele lengte met het inhoudstype dat is opgegeven door wCertificateType. Het type dat wordt ondersteund door Authenticode, is WIN_CERT_TYPE_PKCS_SIGNED_DATA, een PKCS#7 SignedData structuur. Zie Windows Authenticode Portable Executable Signature Formatvoor meer informatie over de authenticode-indeling voor digitale handtekeningen.
Als de bCertificate inhoud niet eindigt op een quadwordgrens, wordt de vermelding van het kenmerkcertificaat opgevuld met nullen, vanaf het einde van bCertificate naar de volgende quadwordgrens.
De dwLength waarde is de lengte van de voltooide WIN_CERTIFICATE structuur en wordt berekend als:
dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)
Deze lengte moet de grootte bevatten van elke opvulling die wordt gebruikt om te voldoen aan de vereiste dat elke WIN_CERTIFICATE structuur quadword is uitgelijnd:
dwLength += (8 - (dwLength & 7)) & 7;
De grootte van de certificaattabeldie is opgegeven in de certificatentabel vermelding in de optionele headergegevensmappen (alleen afbeelding)- bevat de opvulling.
Zie ImageHlp Functions-voor meer informatie over het gebruik van de ImageHlp-API voor het inventariseren, toevoegen en verwijderen van certificaten uit PE-bestanden.
Certificaatgegevens
Zoals vermeld in de vorige sectie, kunnen de certificaten in de kenmerkcertificaattabel elk certificaattype bevatten. Certificaten die ervoor zorgen dat de integriteit van een PE-bestand een PE-installatiekopieënhash bevat.
Een PE-afbeeldingshash (of bestands-hash) is vergelijkbaar met een bestandscontrolesom omdat het hash-algoritme een berichtsamenvating produceert die is gerelateerd aan de integriteit van een bestand. Er wordt echter een controlesom geproduceerd door een eenvoudig algoritme en wordt voornamelijk gebruikt om te detecteren of een blok geheugen op schijf ongeldig is gegaan en de waarden die daar zijn opgeslagen, zijn beschadigd. Een bestandshash is vergelijkbaar met een controlesom omdat ook bestandsbeschadiging wordt gedetecteerd. In tegenstelling tot de meeste controlesomalgoritmen is het echter erg moeilijk om een bestand te wijzigen zonder de bestandshash te wijzigen van de oorspronkelijke ongewijzigde waarde. Een bestandshash kan dus worden gebruikt om opzettelijke en zelfs subtiele wijzigingen in een bestand te detecteren, zoals die zijn geïntroduceerd door virussen, hackers of Trojaanse paardenprogramma's.
Wanneer de afbeeldingssamenvating is opgenomen in een certificaat, moet bepaalde velden in de PE-installatiekopieën worden uitgesloten, zoals de vermelding Checksum en Certificaattabel in optionele headergegevensmappen. Dit komt doordat de handeling van het toevoegen van een certificaat deze velden wijzigt en ertoe zou leiden dat een andere hash-waarde wordt berekend.
De functie Win32 ImageGetDigestStream biedt een gegevensstroom van een PE-doelbestand waarmee u hash-functies kunt uitvoeren. Deze gegevensstroom blijft consistent wanneer certificaten worden toegevoegd aan of verwijderd uit een PE-bestand. Op basis van de parameters die worden doorgegeven aan ImageGetDigestStream, kunnen andere gegevens uit de PE-installatiekopieën worden weggelaten uit de hashberekening. Zie Verwijzingenvoor een koppeling naar de referentiepagina van de functie.
Delay-Load Tabellen importeren (alleen afbeelding)
Deze tabellen zijn toegevoegd aan de afbeelding ter ondersteuning van een uniform mechanisme voor toepassingen om het laden van een DLL uit te stellen totdat de eerste aanroep in dat DLL-bestand wordt aangeroepen. De indeling van de tabellen komt overeen met die van de traditionele importtabellen die worden beschreven in sectie 6.4, de sectie .idata.". Hier worden slechts enkele details besproken.
De Delay-Load Directory-tabel
De maptabel met vertragingsbelasting is de tegenhanger van de importdirectory-tabel. Deze kan worden opgehaald via de vermelding Delay Import Descriptor in de optionele lijst met headergegevensmappen (offset 200). De tabel is als volgt gerangschikt:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Kenmerken |
Moet nul zijn. |
4 |
4 |
Naam |
De RVA van de naam van het DLL-bestand dat moet worden geladen. De naam bevindt zich in de sectie alleen-lezengegevens van de afbeelding. |
8 |
4 |
Modulehandgreep |
De RVA van de modulehandgreep (in de gegevenssectie van de afbeelding) van het DLL-bestand wordt vertraagd geladen. Het wordt gebruikt voor opslag door de routine die wordt geleverd voor het beheren van vertragingsbelasting. |
12 |
4 |
Importadrestabel uitstellen |
De RVA van de importadrestabel voor vertragingsbelasting. Zie IAT (Import Address Table) uitstellenvoor meer informatie. |
16 |
4 |
Tabel importnaam uitstellen |
De RVA van de tabel met naam van vertragingsbelasting, die de namen bevat van de importbewerkingen die mogelijk moeten worden geladen. Dit komt overeen met de indeling van de tabel importnaam. Zie Hint/Name Tablevoor meer informatie. |
20 |
4 |
Importtabel voor afhankelijke vertraging |
De RVA van de adrestabel voor afhankelijke vertragingsbelasting, indien aanwezig. |
24 |
4 |
Importtabel uitstellen uitstellen |
De RVA van de adrestabel voor het uitladen van vertragingsbelasting, indien aanwezig. Dit is een exacte kopie van de importadrestabel voor vertraging. Als de aanroeper het DLL-bestand ontlaadt, moet deze tabel worden gekopieerd via de importadrestabel voor vertraging, zodat volgende aanroepen naar het DLL-bestand het thunkingmechanisme correct blijven gebruiken. |
28 |
4 |
Tijdstempel |
De tijdstempel van het DLL-bestand waaraan deze afbeelding is gebonden. |
De tabellen waarnaar in deze gegevensstructuur wordt verwezen, worden geordend en gesorteerd, net zoals hun tegenhangers voor traditionele import. Zie De sectie .idatavoor meer informatie.
Kenmerken
Tot nu toe zijn er geen kenmerkvlagmen gedefinieerd. Met de linker wordt dit veld ingesteld op nul in de afbeelding. Dit veld kan worden gebruikt om de record uit te breiden door de aanwezigheid van nieuwe velden aan te geven, of kan worden gebruikt om gedrag aan te geven voor de vertragings- of laadhulpfuncties.
Naam
De naam van het DLL-bestand dat moet worden vertraagd geladen, bevindt zich in de sectie alleen-lezengegevens van de afbeelding. Er wordt naar verwezen via het veld szName.
Modulehandgreep
De ingang van het DLL-bestand dat moet worden vertraagd geladen, bevindt zich in de gegevenssectie van de afbeelding. Het phmod-veld wijst naar de handgreep. De meegeleverde helper voor vertragingsbelasting gebruikt deze locatie om de ingang op te slaan in de geladen DLL.
Importadrestabel uitstellen
Er wordt naar de importadrestabel (IAT) verwezen door de vertragingsdescriptor voor importeren via het pIAT-veld. De helper voor vertragingsbelasting werkt deze aanwijzers bij met de echte ingangspunten, zodat de donks niet meer in de aanroepende lus zitten. De functiepointers worden geopend met behulp van de expressie pINT->u1.Function
.
Tabel importnaam uitstellen
De importnaamtabel (INT) voor vertraging bevat de namen van de importbewerkingen die mogelijk moeten worden geladen. Ze worden op dezelfde manier besteld als de functiepointers in de IAT. Ze bestaan uit dezelfde structuren als de standaard-INT en worden geopend met behulp van de expressie pINT->u1.AddressOfData->Name[0]
.
Vertraging gebonden importadrestabel en tijdstempel
De vertragingsgebonden importadrestabel (BIAT) is een optionele tabel met IMAGE_THUNK_DATA items die samen met het tijdstempelveld van de maptabel met vertragingsbelasting worden gebruikt door een bindingsfase na het proces.
Importadrestabel uitstellen
De UIAT (Import Address Table) is een optionele tabel met IMAGE_THUNK_DATA items die door de ontladingscode worden gebruikt om een expliciete uitladingsaanvraag af te handelen. Het bestaat uit geïnitialiseerde gegevens in de sectie alleen-lezen die een exacte kopie is van de oorspronkelijke IAT die de code naar de vertragingsbelastings-donks heeft verwezen. Bij het uitladen kan de bibliotheek worden vrijgemaakt, de *phmod gewist en de UIAT die via de IAT is geschreven om alles te herstellen naar de status van de preload.
Speciale secties
-
de sectie .debug
- Map voor foutopsporing (alleen installatiekopieën)
- foutopsporingstype
- .debug$F (alleen object)
- .debug$S (alleen object)
- .debug$P (alleen object)
- .debug$T (alleen object)
- Linker-ondersteuning voor microsoft-foutopsporingsgegevens
- de sectie .drectve (alleen object)
- de sectie .edata (alleen afbeelding)
- de sectie .idata
- de sectie .pdata
- de sectie .reloc (alleen afbeelding)
- de sectie .tls
- de loadconfiguratiestructuur (alleen installatiekopieën)
- de sectie .rsrc
- de .cormeta-sectie (alleen object)
- De sectie .sxdata
Typische COFF-secties bevatten code of gegevens die zonder speciale kennis van de inhoud van de sectie worden linkers en Microsoft Win32-loaders verwerkt. De inhoud is alleen relevant voor de toepassing die wordt gekoppeld of uitgevoerd.
Sommige COFF-secties hebben echter speciale betekenissen wanneer ze worden gevonden in objectbestanden of afbeeldingsbestanden. Hulpprogramma's en loaders herkennen deze secties omdat er speciale vlaggen zijn ingesteld in de sectiekoptekst, omdat speciale locaties in de optionele koptekst van de afbeelding ernaar verwijzen of omdat de sectienaam zelf een speciale functie van de sectie aangeeft. (Zelfs als de sectienaam zelf geen speciale functie van de sectie aangeeft, wordt de sectienaam volgens conventie bepaald, zodat de auteurs van deze specificatie in alle gevallen naar een sectienaam kunnen verwijzen.)
De gereserveerde secties en de bijbehorende kenmerken worden beschreven in de onderstaande tabel, gevolgd door gedetailleerde beschrijvingen voor de sectietypen die worden bewaard in uitvoerbare bestanden en de sectietypen die metagegevens voor extensies bevatten.
Sectienaam | Tevreden | Kenmerken |
---|---|---|
.Bss |
Niet-geïnitialiseerde gegevens (vrije indeling) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.cormeta |
CLR-metagegevens die aangeeft dat het objectbestand beheerde code bevat |
IMAGE_SCN_LNK_INFO |
.gegevens |
Geïnitialiseerde gegevens (vrije indeling) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.debug$F |
Gegenereerde FPO-foutopsporingsgegevens (alleen object, alleen x86-architectuur en nu verouderd) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$P |
Vooraf gecompileerde foutopsporingstypen (alleen object) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$S |
Fouten opsporen in symbolen (alleen object) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.debug$T |
Foutopsporingstypen (alleen object) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.drective |
Linkeropties |
IMAGE_SCN_LNK_INFO |
.edata |
Tabellen exporteren |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.idata |
Tabellen importeren |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.idlsym |
Bevat geregistreerde SEH (alleen installatiekopieën) ter ondersteuning van IDL-kenmerken. Zie IDL-kenmerken in Verwijzingen aan het einde van dit onderwerp voor meer informatie. |
IMAGE_SCN_LNK_INFO |
.pdata |
Uitzonderingsinformatie |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.rdata |
Alleen-lezen geïnitialiseerde gegevens |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.reloc |
Verplaatsingen van afbeeldingen |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE |
.rsrc |
Resourcemap |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
.sbss |
NIET-geïnitialiseerde GP-gegevens (vrije indeling) |
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld. |
.sdata |
GP-relatieve geïnitialiseerde gegevens (vrije indeling) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld. |
.srdata |
GP-relatieve alleen-lezen gegevens (vrije indeling) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL De vlag IMAGE_SCN_GPREL moet alleen worden ingesteld voor IA64-architecturen; deze vlag is niet geldig voor andere architecturen. De vlag IMAGE_SCN_GPREL is alleen bedoeld voor objectbestanden; wanneer dit sectietype wordt weergegeven in een afbeeldingsbestand, mag de vlag IMAGE_SCN_GPREL niet worden ingesteld. |
.sxdata |
Geregistreerde gegevens van uitzonderingshandler (alleen vrije indeling en x86/object) |
IMAGE_SCN_LNK_INFO Bevat de symboolindex van elk van de uitzonderingshandlers waarnaar wordt verwezen door de code in dat objectbestand. Het symbool kan zijn voor een UNDEF-symbool of een symbool dat in die module is gedefinieerd. |
.Sms |
Uitvoerbare code (vrije indeling) |
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ |
.tls |
Thread-lokale opslag (alleen object) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.tls$ |
Thread-lokale opslag (alleen object) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.vsdata |
G-relatieve geïnitialiseerde gegevens (alleen gratis indeling en voor ARM-, SH4- en duimarchitecturen) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE |
.xdata |
Uitzonderingsinformatie (vrije indeling) |
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ |
Sommige van de hier vermelde secties zijn gemarkeerd als 'alleen object' of 'alleen afbeelding' om aan te geven dat hun speciale semantiek alleen relevant zijn voor objectbestanden of afbeeldingsbestanden. Een sectie die als 'alleen afbeelding' is gemarkeerd, kan nog steeds worden weergegeven in een objectbestand als een manier om het afbeeldingsbestand in te gaan, maar de sectie heeft geen speciale betekenis voor de linker, alleen voor het laadprogramma voor afbeeldingsbestanden.
De sectie .debug
De sectie .debug wordt gebruikt in objectbestanden om door compiler gegenereerde foutopsporingsgegevens en in afbeeldingsbestanden alle foutopsporingsgegevens te bevatten die worden gegenereerd. In deze sectie wordt de verpakking van foutopsporingsinformatie in object- en afbeeldingsbestanden beschreven.
In de volgende sectie wordt de indeling van de map voor foutopsporing beschreven, die zich overal in de afbeelding kan bevinden. In volgende secties worden de 'groepen' beschreven in objectbestanden die foutopsporingsgegevens bevatten.
De standaardinstelling voor de linker is dat foutopsporingsinformatie niet is toegewezen aan de adresruimte van de afbeelding. Er bestaat alleen een sectie voor foutopsporing wanneer foutopsporingsinformatie is toegewezen in de adresruimte.
Foutopsporingsmap (alleen installatiekopieën)
Afbeeldingsbestanden bevatten een optionele foutopsporingsmap die aangeeft welke vorm van foutopsporingsinformatie aanwezig is en waar deze zich bevindt. Deze map bestaat uit een matrix met foutopsporingsmapvermeldingen waarvan de locatie en grootte worden aangegeven in de optionele afbeeldingskoptekst.
De map voor foutopsporing kan zich in een verwijderbare sectie voor foutopsporing bevinden (indien aanwezig) of kan worden opgenomen in een andere sectie in het afbeeldingsbestand of helemaal niet in een sectie.
Elke foutopsporingsmapvermelding identificeert de locatie en grootte van een blok met foutopsporingsgegevens. De opgegeven RVA kan nul zijn als de foutopsporingsgegevens niet worden gedekt door een sectiekoptekst (dat wil gezegd, deze zich in het afbeeldingsbestand bevindt en niet is toegewezen aan de uitvoeringsadresruimte). Als deze is toegewezen, is de RVA het adres.
Een mapvermelding voor foutopsporing heeft de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Kenmerken |
Gereserveerd, moet nul zijn. |
4 |
4 |
TimeDateStamp |
De tijd en datum waarop de foutopsporingsgegevens zijn gemaakt. |
8 |
2 |
MajorVersion |
Het primaire versienummer van de foutopsporingsgegevensindeling. |
10 |
2 |
MinorVersion |
Het secundaire versienummer van de foutopsporingsgegevensindeling. |
12 |
4 |
Type |
De indeling van foutopsporingsgegevens. Dit veld biedt ondersteuning voor meerdere foutopsporingsprogramma's. Zie Foutopsporingstypevoor meer informatie. |
16 |
4 |
SizeOfData |
De grootte van de foutopsporingsgegevens (niet inclusief de foutopsporingsmap zelf). |
20 |
4 |
AddressOfRawData |
Het adres van de foutopsporingsgegevens wanneer deze worden geladen ten opzichte van de installatiekopieënbasis. |
24 |
4 |
PointerToRawData |
De bestandsaanwijzer naar de foutopsporingsgegevens. |
Foutopsporingstype
De volgende waarden worden gedefinieerd voor het veld Type van de foutopsporingsmapvermelding:
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_DEBUG_TYPE_UNKNOWN |
0 |
Een onbekende waarde die wordt genegeerd door alle hulpprogramma's. |
IMAGE_DEBUG_TYPE_COFF |
1 |
De COFF-foutopsporingsgegevens (regelnummers, symbooltabel en tekenreekstabel). Dit type foutopsporingsinformatie wordt ook verwezen naar velden in de bestandsheaders. |
IMAGE_DEBUG_TYPE_CODEVIEW |
2 |
De foutopsporingsgegevens van Visual C++ zijn beschikbaar. |
IMAGE_DEBUG_TYPE_FPO |
3 |
De informatie over het weglaten van de framepointer (FPO). Deze informatie vertelt het foutopsporingsprogramma hoe u niet-standaard stackframes interpreteert, die het EBP-register gebruiken voor een ander doel dan als frameaanwijzer. |
IMAGE_DEBUG_TYPE_MISC |
4 |
De locatie van HET DBG-bestand. |
IMAGE_DEBUG_TYPE_EXCEPTION |
5 |
Een kopie van de sectie .pdata. |
IMAGE_DEBUG_TYPE_FIXUP |
6 |
Gereserveerd. |
IMAGE_DEBUG_TYPE_OMAP_TO_SRC |
7 |
De toewijzing van een RVA in afbeelding aan een RVA in broninstallatiekopieën. |
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC |
8 |
De toewijzing van een RVA in broninstallatiekopieën aan een RVA in afbeelding. |
IMAGE_DEBUG_TYPE_BORLAND |
9 |
Gereserveerd voor Borland. |
IMAGE_DEBUG_TYPE_RESERVED10 |
10 |
Gereserveerd. |
IMAGE_DEBUG_TYPE_CLSID |
11 |
Gereserveerd. |
IMAGE_DEBUG_TYPE_REPRO |
16 |
PE-determinisme of reproduceerbaarheid. |
Ongedefinieerde |
17 |
Foutopsporingsgegevens worden ingesloten in het PE-bestand op de locatie die is opgegeven door PointerToRawData. |
Ongedefinieerde |
19 |
Slaat crypto-hash op voor de inhoud van het symboolbestand dat wordt gebruikt om het PE/COFF-bestand te bouwen. |
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS | 20 | Uitgebreide DLL-kenmerken bits. |
Als het veld Type is ingesteld op IMAGE_DEBUG_TYPE_FPO, zijn de onbewerkte gegevens voor foutopsporing een matrix waarin elk lid het stackframe van een functie beschrijft. Niet elke functie in het afbeeldingsbestand moet FPO-gegevens hebben gedefinieerd, ook al is het foutopsporingstype FPO. Deze functies die geen FPO-gegevens hebben, worden ervan uitgegaan dat ze normale stackframes hebben. De indeling voor FPO-gegevens is als volgt:
#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;
De aanwezigheid van een vermelding van het type IMAGE_DEBUG_TYPE_REPRO geeft aan dat het PE-bestand is gebouwd op een manier om determinisme of reproduceerbaarheid te bereiken. Als de invoer niet verandert, is het PE-uitvoerbestand gegarandeerd identiek, ongeacht wanneer of waar de PE wordt geproduceerd. Verschillende datum-/tijdstempelvelden in het PE-bestand worden gevuld met een deel of alle bits van een berekende hash-waarde die PE-bestandsinhoud als invoer gebruikt, en vertegenwoordigen daarom niet langer de werkelijke datum en tijd waarop een PE-bestand of gerelateerde specifieke gegevens in de PE worden geproduceerd. De onbewerkte gegevens van deze foutopsporingsvermelding zijn mogelijk leeg of bevatten een berekende hashwaarde die voorafgaat door een vier-bytewaarde die de lengte van de hash-waarde vertegenwoordigt.
Als het veld Type is ingesteld op IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS, bevatten de onbewerkte gegevens voor foutopsporing uitgebreide DLL-kenmerken, naast bits die kunnen worden ingesteld in de optionele header van de afbeelding. Zie DLL-kenmerken in de sectie Optionele koptekst Windows-Specific Velden (alleen afbeelding).
Uitgebreide DLL-kenmerken
De volgende waarden worden gedefinieerd voor de uitgebreide DLL-kenmerken bits.
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT | 0x0001 | Afbeelding is compatibel met Control-flow Enforcement Technology (CET) Shadow Stack. |
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT | 0x0040 | Alle vertakkingsdoelen in alle secties met afbeeldingscode worden geannoteerd met instructies voor de integriteitsbeveiliging van de forward-edge-controlestroom, zoals x86 CET-Indirect Branch Tracking (IBT) of BTI-instructies (ARM Branch Target Identification). Deze bit wordt niet gebruikt door Windows. |
.debug$F (alleen object)
De gegevens in deze sectie zijn vervangen in Visual C++ versie 7.0 en hoger door een uitgebreidere set gegevens die worden verzonden naar een subsectie .debug$S.
Objectbestanden kunnen .debug$F-secties bevatten waarvan de inhoud een of meer FPO_DATA records zijn (informatie over het weglaten van frameaanwijzers). Zie 'IMAGE_DEBUG_TYPE_FPO' in Foutopsporingstype.
De linker herkent deze .debug$F records. Als er foutopsporingsgegevens worden gegenereerd, sorteert de linker de FPO_DATA records op procedure RVA en genereert een foutopsporingsmapvermelding voor deze records.
De compiler mag geen FPO-records genereren voor procedures met een standaardframeindeling.
.debug$S (alleen object)
Deze sectie bevat informatie over foutopsporing in Visual C++ (symbolische informatie).
.debug$P (alleen object)
Deze sectie bevat informatie over foutopsporing in Visual C++ (vooraf gecompileerde informatie). Dit zijn gedeelde typen tussen alle objecten die zijn gecompileerd met behulp van de vooraf gecompileerde header die met dit object is gegenereerd.
.debug$T (alleen object)
Deze sectie bevat informatie over foutopsporing in Visual C++ (type informatie).
Ondersteuning voor Microsoft-foutopsporingsgegevens
De linker voor ondersteuning van foutopsporingsinformatie:
Verzamelt alle relevante foutopsporingsgegevens uit de .debug$F, debug$S, .debug$Pen secties .debug$T.
Verwerkt die gegevens samen met de door de linker gegenereerde foutopsporingsinformatie in het PDB-bestand en maakt een mapvermelding voor foutopsporing om ernaar te verwijzen.
De sectie .drectve (alleen object)
Een sectie is een instructiesectie als de vlag IMAGE_SCN_LNK_INFO is ingesteld in de koptekst van de sectie en de naam van de .drectve sectie heeft. De linker verwijdert een .drectve sectie na het verwerken van de informatie, zodat de sectie niet wordt weergegeven in het afbeeldingsbestand dat wordt gekoppeld.
Een .drectve sectie bestaat uit een tekenreeks met tekst die kan worden gecodeerd als ANSI of UTF-8. Als de UTF-8 bytevolgordemarkering (BOM, een voorvoegsel van drie bytes dat bestaat uit 0xEF, 0xBB en 0xBF) niet aanwezig is, wordt de tekenreeks van de richtlijn geïnterpreteerd als ANSI. De tekenreeks van de instructie is een reeks linkeropties die worden gescheiden door spaties. Elke optie bevat een afbreekstreepje, de naam van de optie en elk geschikt kenmerk. Als een optie spaties bevat, moet de optie tussen aanhalingstekens staan. De sectie .drectve mag geen verplaatsingen of regelnummers hebben.
De .edata-sectie (alleen afbeelding)
De sectie gegevens exporteren, genaamd .edata, bevat informatie over symbolen waartoe andere afbeeldingen toegang hebben via dynamische koppeling. Geëxporteerde symbolen zijn over het algemeen te vinden in DLL's, maar DLL's kunnen ook symbolen importeren.
Hieronder wordt een overzicht van de algemene structuur van de exportsectie beschreven. De beschreven tabellen zijn meestal aaneengesloten in het bestand in de weergegeven volgorde (hoewel dit niet vereist is). Alleen de exportmaptabel en de exportadrestabel zijn vereist voor het exporteren van symbolen als standaard. (Een rangschikken is een export die rechtstreeks wordt geopend door de index van de exportadrestabel.) De naamwijzertabel, de rangteltabel en de exportnaamtabel bestaan allemaal ter ondersteuning van het gebruik van exportnamen.
Tabelnaam | Beschrijving |
---|---|
Maptabel exporteren |
Een tabel met slechts één rij (in tegenstelling tot de map voor foutopsporing). Deze tabel geeft de locaties en grootten van de andere exporttabellen aan. |
Adrestabel exporteren |
Een matrix van RVA's met geëxporteerde symbolen. Dit zijn de werkelijke adressen van de geëxporteerde functies en gegevens in de uitvoerbare code en gegevenssecties. Andere afbeeldingsbestanden kunnen een symbool importeren met behulp van een index in deze tabel (een rangtelwoord) of, optioneel, met behulp van de openbare naam die overeenkomt met het rangnummer als een openbare naam is gedefinieerd. |
Naam aanwijzertabel |
Een matrix met aanwijzers naar de openbare exportnamen, gesorteerd in oplopende volgorde. |
Rangschikktabel |
Een matrix van de rangtelwoorden die overeenkomen met leden van de tabel naamaanwijzer. De correspondentie is per positie; Daarom moeten de tabel met de naamwijzer en de rangschikkertabel hetzelfde aantal leden hebben. Elke rangschikk is een index in de exportadrestabel. |
Naamtabel exporteren |
Een reeks ascii-tekenreeksen die door null zijn beëindigd. Leden van de naam aanwijzertabel wijzen in dit gebied. Deze namen zijn de openbare namen waarmee de symbolen worden geïmporteerd en geëxporteerd; ze zijn niet noodzakelijkerwijs hetzelfde als de privénamen die in het afbeeldingsbestand worden gebruikt. |
Wanneer een ander afbeeldingsbestand een symbool op naam importeert, zoekt het Win32-laadprogramma de tabel met de naamaanwijzer naar een overeenkomende tekenreeks. Als er een overeenkomende tekenreeks wordt gevonden, wordt de bijbehorende rangschikker geïdentificeerd door het bijbehorende lid in de rangteltabel op te zoeken (dat wil gezegd het lid van de rangteltabel met dezelfde index als de tekenreekspointer die in de tabel met de naamwijzer is gevonden). Het resulterende rangnummer is een index in de exportadrestabel, die de werkelijke locatie van het gewenste symbool geeft. Elk exportsymbool kan worden geopend door een rangschikken.
Wanneer een ander afbeeldingsbestand een symbool importeert op rangtelwoord, is het niet nodig om te zoeken in de tabel met de naamwijzer voor een overeenkomende tekenreeks. Direct gebruik van een rangtel is daarom efficiënter. Een exportnaam is echter gemakkelijker te onthouden en vereist niet dat de gebruiker de tabelindex voor het symbool kent.
Maptabel exporteren
De exportsymboolgegevens beginnen met de exportmaptabel, waarin de rest van de exportsymboolgegevens wordt beschreven. De exportmaptabel bevat adresgegevens die worden gebruikt om importbewerkingen naar de toegangspunten in deze afbeelding op te lossen.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Vlaggen exporteren |
Gereserveerd, moet 0 zijn. |
4 |
4 |
Tijd-/datumstempel |
De tijd en datum waarop de exportgegevens zijn gemaakt. |
8 |
2 |
Primaire versie |
Het primaire versienummer. De primaire en secundaire versienummers kunnen door de gebruiker worden ingesteld. |
10 |
2 |
Secundaire versie |
Het secundaire versienummer. |
12 |
4 |
Naam RVA |
Het adres van de ASCII-tekenreeks die de naam van het DLL-bestand bevat. Dit adres is relatief ten opzichte van de basis van de installatiekopieën. |
16 |
4 |
Ranglijnbasis |
Het beginnummer voor export in deze afbeelding. In dit veld wordt het beginnummer voor de exportadrestabel opgegeven. Het is meestal ingesteld op 1. |
20 |
4 |
Adrestabelvermeldingen |
Het aantal vermeldingen in de exportadrestabel. |
24 |
4 |
Aantal aanwijzers voor naam |
Het aantal vermeldingen in de tabel met de naam aanwijzer. Dit is ook het aantal vermeldingen in de rangteltabel. |
28 |
4 |
Adrestabel EXPORTEREN RVA |
Het adres van de exportadrestabel ten opzichte van de basis van de installatiekopieën. |
32 |
4 |
Naam aanwijzer RVA |
Het adres van de tabel exportnaam aanwijzer, ten opzichte van de basis van de installatiekopieën. De tabelgrootte wordt opgegeven door het veld Aantal aanwijzers. |
36 |
4 |
Ordinale tabel RVA |
Het adres van de rangteltabel ten opzichte van de basis van de afbeelding. |
Adrestabel exporteren
De exportadrestabel bevat het adres van geëxporteerde toegangspunten en geëxporteerde gegevens en absolute waarden. Een rangnummer wordt gebruikt als index in de tabel met exportadressen.
Elke vermelding in de exportadrestabel is een veld dat een van de twee indelingen in de volgende tabel gebruikt. Als het opgegeven adres zich niet in de exportsectie bevindt (zoals gedefinieerd door het adres en de lengte die worden aangegeven in de optionele header), is het veld een export RVA, een werkelijk adres in code of gegevens. Anders is het veld een doorstuurserver RVA, die een symbool in een andere DLL noemt.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
RVA exporteren |
Het adres van het geëxporteerde symbool wanneer het in het geheugen wordt geladen ten opzichte van de basis van de installatiekopieën. Bijvoorbeeld het adres van een geëxporteerde functie. |
0 |
4 |
Doorstuurserver RVA |
De aanwijzer naar een ascii-tekenreeks die door null is beëindigd in de exportsectie. Deze tekenreeks moet zich binnen het bereik bevinden dat wordt opgegeven door de gegevensmapvermelding voor de exporttabel. Zie optionele headergegevensmappen (alleen afbeelding). Deze tekenreeks geeft de DLL-naam en de naam van de export (bijvoorbeeld 'MYDLL.expfunc') of de DLL-naam en het rangnummer van de export (bijvoorbeeld 'MYDLL.#27'). |
Een doorstuurserver RVA exporteert een definitie uit een andere afbeelding, waardoor deze lijkt alsof deze door de huidige afbeelding wordt geëxporteerd. Het symbool wordt dus tegelijkertijd geïmporteerd en geëxporteerd.
In Kernel32.dll in Windows XP wordt de export met de naam HeapAlloc bijvoorbeeld doorgestuurd naar de tekenreeks NTDLL. RtlAllocateHeap." Hierdoor kunnen toepassingen gebruikmaken van de windows XP-specifieke module Ntdll.dll zonder dat er daadwerkelijk importverwijzingen naar worden gebruikt. De importtabel van de toepassing verwijst alleen naar Kernel32.dll. Daarom is de toepassing niet specifiek voor Windows XP en kan deze worden uitgevoerd op elk Win32-systeem.
Tabel naam aanwijzer exporteren
De tabel exportnaamaanwijzer is een matrix met adressen (RVA's) in de exportnaamtabel. De aanwijzers zijn elk 32 bits en zijn relatief ten opzichte van de basis van de installatiekopieën. De aanwijzers worden lexisch geordend om binaire zoekopdrachten toe te staan.
Er wordt alleen een exportnaam gedefinieerd als de tabel met de exportnaamaanwijzer een aanwijzer bevat.
Rangschikktabel exporteren
De export ordinale tabel is een matrix van 16-bits ongevoorbeerde indexen in de exportadrestabel. De rangtelwoorden worden bepaald door het ordinale basisveld van de exportmaptabel. Met andere woorden, de ordinale basis moet worden afgetrokken van de ordinalen om werkelijke indexen te verkrijgen in de exportadrestabel.
De tabel met de exportnaam en de exportordinale tabel vormen twee parallelle matrices die zijn gescheiden om uitlijning van natuurlijke velden mogelijk te maken. Deze twee tabellen werken in feite als één tabel, waarin de kolom Export name Pointer verwijst naar een openbare (geëxporteerde) naam en de kolom Export ordinaal geeft de bijbehorende rangschikker voor die openbare naam. Een lid van de tabel exportnaamaanwijzer en een lid van de exportordinale tabel worden gekoppeld door dezelfde positie (index) in hun respectieve matrices te hebben.
Wanneer de tabel met de exportnaamaanwijzer wordt doorzocht en er een overeenkomende tekenreeks wordt gevonden op positie i, is het algoritme voor het vinden van de RVA van het symbool en de vooringenomen rangschikken:
i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];
rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;
Bij het zoeken naar een symbool met (vertekend) rangschikken, is het algoritme voor het vinden van de RVA van het symbool en de naam:
ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);
rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];
Naamtabel exporteren
De tabel met de exportnaam bevat de werkelijke tekenreeksgegevens waarnaar is verwezen door de tabel exportnaam aanwijzer. De tekenreeksen in deze tabel zijn openbare namen die andere afbeeldingen kunnen gebruiken om de symbolen te importeren. Deze openbare exportnamen zijn niet noodzakelijkerwijs hetzelfde als de namen van privésymbolen die de symbolen hebben in hun eigen afbeeldingsbestand en broncode, hoewel dit wel mogelijk is.
Elk geëxporteerd symbool heeft een rangtelwaarde, die alleen de index in de exportadrestabel is. Het gebruik van exportnamen is echter optioneel. Sommige, alle of geen van de geëxporteerde symbolen kunnen exportnamen hebben. Voor geëxporteerde symbolen die wel exportnamen hebben, werken overeenkomstige vermeldingen in de tabel exportnaamaanwijzer en de rangschikkentabel samen om elke naam te koppelen aan een rangtelwoord.
De structuur van de exportnaamtabel is een reeks ascii-tekenreeksen met variabele lengte die null-beëindigd zijn.
De sectie .idata
Alle afbeeldingsbestanden die symbolen importeren, inclusief vrijwel alle uitvoerbare (EXE)-bestanden, hebben een .idata-sectie. Een typische bestandsindeling voor de importgegevens volgt:
Maptabel
Null-mapvermelding
DLL1 Opzoektabel importeren
Nul
DLL2 Opzoektabel importeren
Nul
DLL3 Opzoektabel importeren
Nul
Hint-Name tabel
Maptabel importeren
De importgegevens beginnen met de importmaptabel, waarin de rest van de importgegevens wordt beschreven. De importmaptabel bevat adresgegevens die worden gebruikt om fixupverwijzingen naar de toegangspunten in een DLL-installatiekopieën op te lossen. De importmaptabel bestaat uit een matrix met importmapvermeldingen, één vermelding voor elke DLL waarnaar de afbeelding verwijst. De laatste mapvermelding is leeg (gevuld met null-waarden), wat het einde van de maptabel aangeeft.
Elke importmapvermelding heeft de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Opzoektabel RVA importeren (kenmerken) |
De RVA van de importzoektabel. Deze tabel bevat een naam of rangschikk voor elke import. (De naam 'Kenmerken' wordt gebruikt in Winnt.h, maar beschrijft dit veld niet meer.) |
4 |
4 |
Tijd-/datumstempel |
De stempel die is ingesteld op nul totdat de afbeelding is gebonden. Nadat de afbeelding is gebonden, is dit veld ingesteld op de tijd-/gegevensstempel van het DLL-bestand. |
8 |
4 |
Doorstuurketen |
De index van de eerste doorstuurserverreferentie. |
12 |
4 |
Naam RVA |
Het adres van een ASCII-tekenreeks die de naam van het DLL-bestand bevat. Dit adres is relatief ten opzichte van de basis van de installatiekopieën. |
16 |
4 |
Import Address Table RVA (Thunk Table) |
De RVA van de importadrestabel. De inhoud van deze tabel is identiek aan de inhoud van de opzoektabel importeren totdat de afbeelding is gebonden. |
Opzoektabel importeren
Een opzoektabel importeren is een matrix van 32-bits getallen voor PE32 of een matrix van 64-bits getallen voor PE32+. Elke vermelding maakt gebruik van de bitveldindeling die wordt beschreven in de volgende tabel. In deze indeling is bit 31 de belangrijkste bit voor PE32 en bit 63 is de belangrijkste bit voor PE32+. In de verzameling van deze vermeldingen worden alle importbewerkingen uit een bepaald DLL-bestand beschreven. De laatste vermelding is ingesteld op nul (NULL) om het einde van de tabel aan te geven.
Bit(en) | Grootte | Bitveld | Beschrijving |
---|---|---|---|
31/63 |
1 |
Rangtelwoord/naamvlag |
Als deze bit is ingesteld, importeert u deze op rangtelwoord. Anders importeert u op naam. Bit wordt gemaskeerd als 0x80000000 voor PE32, 0x8000000000000000 voor PE32+. |
15-0 |
16 |
Rangtelwoord |
Een 16-bits rangnummer. Dit veld wordt alleen gebruikt als het bitveld Ordinaal/Name Flag 1 is (import by ordinaal). Bits 30-15 of 62-15 moeten 0 zijn. |
30-0 |
31 |
Hint/naam tabel RVA |
Een 31-bits RVA van een hint-/naamtabelvermelding. Dit veld wordt alleen gebruikt als het bitveld Ordinaal/Naamvlag 0 is (importeren op naam). Voor PE32+ bits moet 62-31 nul zijn. |
Hint-/naamtabel
Eén hint-/naamtabel volstaat voor de hele importsectie. Elke vermelding in de tabel hint/naam heeft de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
2 |
Tip |
Een index in de tabel met de exportnaamaanwijzer. Er wordt eerst geprobeerd een overeenkomst te vinden met deze waarde. Als dit mislukt, wordt een binaire zoekopdracht uitgevoerd in de tabel met exportnamen van het DLL-bestand. |
2 |
veranderlijk |
Naam |
Een ASCII-tekenreeks die de naam bevat die moet worden geïmporteerd. Dit is de tekenreeks die moet worden vergeleken met de openbare naam in het DLL-bestand. Deze tekenreeks is hoofdlettergevoelig en wordt beëindigd door een null-byte. |
* |
0 of 1 |
Opvullen |
Een volg-nul-pad-byte die wordt weergegeven na de afsluitende null-byte, indien nodig, om de volgende vermelding op een even grens uit te lijnen. |
Adrestabel importeren
De structuur en inhoud van de importadrestabel zijn identiek aan die van de importzoektabel totdat het bestand is gebonden. Tijdens de binding worden de vermeldingen in de importadrestabel overschreven met de 32-bits (voor PE32) of 64-bits (voor PE32+) adressen van de symbolen die worden geïmporteerd. Deze adressen zijn de werkelijke geheugenadressen van de symbolen, hoewel ze technisch gezien nog steeds 'virtuele adressen' worden genoemd. Het laadprogramma verwerkt doorgaans de binding.
De sectie .pdata
De sectie .pdata bevat een matrix met functietabelvermeldingen die worden gebruikt voor het verwerken van uitzonderingen. Deze wordt verwezen naar de vermelding in de uitzonderingstabel in de map met afbeeldingsgegevens. De vermeldingen moeten worden gesorteerd op basis van de functieadressen (het eerste veld in elke structuur) voordat ze in de uiteindelijke afbeelding worden verzonden. Het doelplatform bepaalt welke van de drie variaties in de tabelindeling van de functietabel die hieronder worden beschreven, wordt gebruikt.
Voor 32-bits MIPS-installatiekopieën hebben functietabelvermeldingen de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Beginadres |
De VA van de bijbehorende functie. |
4 |
4 |
Eindadres |
De VA van het einde van de functie. |
8 |
4 |
Uitzonderingshandler |
De aanwijzer naar de uitzonderingshandler die moet worden uitgevoerd. |
12 |
4 |
Handlergegevens |
De aanwijzer naar aanvullende informatie die moet worden doorgegeven aan de handler. |
16 |
4 |
Eindadres van Prolog |
De VA van het einde van de prolog van de functie. |
Voor de ARM-, PowerPC-, SH3- en SH4 Windows CE-platforms hebben functietabelvermeldingen de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Beginadres |
De VA van de bijbehorende functie. |
4 |
8 bits |
Lengte van Prolog |
Het aantal instructies in de prolog van de functie. |
4 |
22 bits |
Functielengte |
Het aantal instructies in de functie. |
4 |
1 bits |
32-bits vlag |
Als de functie is ingesteld, bestaat deze uit 32-bits instructies. Indien duidelijk, bestaat de functie uit 16-bits instructies. |
4 |
1 bits |
Uitzonderingsvlag |
Als deze optie is ingesteld, bestaat er een uitzonderingshandler voor de functie. Anders bestaat er geen uitzonderingshandler. |
Voor x64- en Itanium-platforms hebben functietabelvermeldingen de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Beginadres |
De RVA van de overeenkomstige functie. |
4 |
4 |
Eindadres |
De RVA van het einde van de functie. |
8 |
4 |
Informatie tot rust laten komen |
De RVA van de ontspannen informatie. |
De sectie .reloc (alleen afbeelding)
De tabel basisverplaatsing bevat vermeldingen voor alle basisverplaatsingen in de afbeelding. Het veld Tabel basisverplaatsing in de optionele headergegevensmappen geeft het aantal bytes in de basisverplaatsingstabel. Zie Optionele headergegevensmappen (alleen afbeelding)voor meer informatie. De basisverplaatsingstabel is onderverdeeld in blokken. Elk blok vertegenwoordigt de basisverplaatsingen voor een 4K-pagina. Elk blok moet beginnen op een 32-bits grens.
Het laadprogramma is niet vereist voor het verwerken van basisverplaatsingen die worden opgelost door de linker, tenzij de laadinstallatiekopieën niet kunnen worden geladen op de basis van de installatiekopieën die zijn opgegeven in de PE-header.
Basisverplaatsingsblok
Elk basisverplaatsingsblok begint met de volgende structuur:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Pagina RVA |
De afbeeldingsbasis plus de pagina RVA wordt toegevoegd aan elke offset om de VA te maken waar de basisverplaatsing moet worden toegepast. |
4 |
4 |
Blokgrootte |
Het totale aantal bytes in het basisverplaatsingsblok, inclusief de velden Pagina RVA en Blokgrootte en de velden Type/Verschuiving die volgen. |
Het veld Blokgrootte wordt gevolgd door een willekeurig aantal velditems type of verschuiving. Elke vermelding is een WORD (2 bytes) en heeft de volgende structuur:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 bits |
Type |
Opgeslagen in de hoge 4 bits van word, een waarde die aangeeft welk type basisverplaatsing moet worden toegepast. Zie Basisverplaatsingstypenvoor meer informatie. |
0 |
12 bits |
Afstand |
Opgeslagen in de resterende 12 bits van word, een verschuiving van het beginadres dat is opgegeven in het veld Pagina RVA voor het blok. Deze offset geeft aan waar de basisverplaatsing moet worden toegepast. |
Als u een basisverplaatsing wilt toepassen, wordt het verschil berekend tussen het voorkeursbasisadres en de basis waarop de afbeelding daadwerkelijk wordt geladen. Als de installatiekopieën op de voorkeursbasis worden geladen, is het verschil nul en hoeven de basisverplaatsingen dus niet te worden toegepast.
Basisverplaatsingstypen
Constant | Waarde | Beschrijving |
---|---|---|
IMAGE_REL_BASED_ABSOLUTE |
0 |
De basisverplaatsing wordt overgeslagen. Dit type kan worden gebruikt om een blok te kussen. |
IMAGE_REL_BASED_HIGH |
1 |
De basisverplaatsing voegt de hoge 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de hoge waarde van een 32-bits woord. |
IMAGE_REL_BASED_LOW |
2 |
De basisverplaatsing voegt de lage 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de lage helft van een 32-bits woord. |
IMAGE_REL_BASED_HIGHLOW |
3 |
De basisverplaatsing past alle 32 bits van het verschil toe op het 32-bits veld bij verschuiving. |
IMAGE_REL_BASED_HIGHADJ |
4 |
De basisverplaatsing voegt de hoge 16 bits van het verschil toe aan het 16-bits veld bij verschuiving. Het 16-bits veld vertegenwoordigt de hoge waarde van een 32-bits woord. De lage 16 bits van de 32-bits waarde worden opgeslagen in het 16-bits woord dat volgt op deze basisverplaatsing. Dit betekent dat deze basisverplaatsing twee sleuven in beslag neemt. |
IMAGE_REL_BASED_MIPS_JMPADDR |
5 |
De interpretatie van herlocatie is afhankelijk van het machinetype. Wanneer het machinetype MIPS is, is de basisverplaatsing van toepassing op een MIPS-jumpinstructie. |
IMAGE_REL_BASED_ARM_MOV32 |
5 |
Deze verplaatsing is alleen zinvol wanneer het machinetype ARM of Duim is. De basisverplaatsing past het 32-bits adres van een symbool toe op een opeenvolgend MOVW/MOVT instructiepaar. |
IMAGE_REL_BASED_RISCV_HIGH20 |
5 |
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de hoge 20 bits van een 32-bits absoluut adres. |
6 |
Gereserveerd, moet nul zijn. |
|
IMAGE_REL_BASED_THUMB_MOV32 |
7 |
Deze verplaatsing is alleen zinvol wanneer het machinetype Thumb is. De basisverplaatsing past het 32-bits adres van een symbool toe op een opeenvolgend MOVW/MOVT instructiepaar. |
IMAGE_REL_BASED_RISCV_LOW12I |
7 |
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de lage 12 bits van een 32-bits absoluut adres dat is gevormd in RISC-V I-type instructieindeling. |
IMAGE_REL_BASED_RISCV_LOW12S |
8 |
Deze verplaatsing is alleen zinvol wanneer het machinetype RISC-V is. De basisverplaatsing is van toepassing op de lage 12 bits van een 32-bits absoluut adres dat is gevormd in RISC-V S-type instructieindeling. |
IMAGE_REL_BASED_LOONGARCH32_MARK_LA |
8 |
Deze verplaatsing is alleen zinvol wanneer het machinetype LoongArch 32-bits is. De basisverplaatsing is van toepassing op een 32-bits absoluut adres dat is gevormd in twee opeenvolgende instructies. |
IMAGE_REL_BASED_LOONGARCH64_MARK_LA |
8 |
Deze verplaatsing is alleen zinvol wanneer het machinetype LoongArch 64-bits is. De basisverplaatsing is van toepassing op een 64-bits absoluut adres dat is gevormd in vier opeenvolgende instructies. |
IMAGE_REL_BASED_MIPS_JMPADDR16 |
9 |
De verplaatsing is alleen zinvol wanneer het machinetype MIPS is. De basisverplaatsing is van toepassing op een MIPS16-jumpinstructie. |
IMAGE_REL_BASED_DIR64 |
10 |
De basisverplaatsing past het verschil toe op het 64-bits veld bij verschuiving. |
De sectie .tls
De sectie .tls biedt directe PE- en COFF-ondersteuning voor lokale opslag voor statische threads (TLS). TLS is een speciale opslagklasse die door Windows wordt ondersteund, waarbij een gegevensobject geen automatische variabele (stack) is, maar lokaal is voor elke afzonderlijke thread waarmee de code wordt uitgevoerd. Daarom kan elke thread een andere waarde onderhouden voor een variabele die is gedeclareerd met behulp van TLS.
Houd er rekening mee dat elke hoeveelheid TLS-gegevens kan worden ondersteund met behulp van de API-aanroepen TlsAlloc, TlsFree, TlsSetValue en TlsGetValue. De PE- of COFF-implementatie is een alternatieve benadering voor het gebruik van de API en heeft het voordeel dat het eenvoudiger is vanuit het oogpunt van programmeurs op hoog niveau. Met deze implementatie kunnen TLS-gegevens worden gedefinieerd en geïnitialiseerd op dezelfde manier als gewone statische variabelen in een programma. In Visual C++ kan bijvoorbeeld een statische TLS-variabele als volgt worden gedefinieerd, zonder de Windows-API te gebruiken:
__declspec (thread) int tlsFlag = 1;
Ter ondersteuning van deze programmeerconstructie geeft de sectie PE en COFF .tls de volgende informatie op: initialisatiegegevens, callback-routines voor initialisatie en beëindiging per thread en de TLS-index, die worden uitgelegd in de volgende discussie.
Notitie
VoorDat Windows Vista statisch gedeclareerd TLS-gegevensobjecten kan alleen worden gebruikt in statisch geladen afbeeldingsbestanden. Dit maakt het onbetrouwbaar om statische TLS-gegevens in een DLL te gebruiken, tenzij u weet dat het DLL-bestand, of iets dat statisch is gekoppeld, nooit dynamisch wordt geladen met de loadlibrary-API-functie. Vanaf Windows Vista zijn echter verbeteringen aangebracht in het Windows-laadprogramma om het dynamisch laden van DLL's met statische TLS beter te ondersteunen. Deze wijziging betekent dat DLL's met statisch gedeclareerde TLS-gegevensobjecten nu betrouwbaarder kunnen worden gebruikt, zelfs als ze dynamisch worden geladen met behulp van LoadLibrary. Het laadprogramma kan TLS-sleuven toewijzen voor dergelijke DLL's tijdens de laadtijd, waarbij de beperkingen in eerdere versies van Windows worden beperkt.
Notitie
Verwijzingen naar 32-bits offsets en index-vermenigvuldigers van 4 zijn van toepassing op systemen met 32-bits architecturen. Pas deze indien nodig aan in een systeem op basis van 64-bits architecturen.
Uitvoerbare code opent een statisch TLS-gegevensobject via de volgende stappen:
Tijdens het koppelen stelt de linker het veld Adres van index van de TLS-map in. Dit veld verwijst naar een locatie waar het programma verwacht de TLS-index te ontvangen.
De Microsoft-runtimebibliotheek faciliteert dit proces door een geheugenafbeelding van de TLS-directory te definiëren en deze de speciale naam '__tls_used' (Intel x86-platformen) of '_tls_used' (andere platforms) te geven. De linker zoekt naar deze geheugeninstallatiekopieën en gebruikt de gegevens daar om de TLS-map te maken. Andere compilers die TLS ondersteunen en met de Microsoft Linker werken, moeten dezelfde techniek gebruiken.
Wanneer een thread wordt gemaakt, communiceert het laadprogramma het adres van de TLS-matrix van de thread door het adres van het threadomgevingsblok (TEB) in de FS-register (voor x86) of GS (voor x64) te plaatsen. Een aanwijzer naar de TLS-matrix bevindt zich op de verschuiving van 0x2C vanaf het begin van TEB. Dit gedrag is specifiek voor Intel x86.
Het laadprogramma wijst de waarde van de TLS-index toe aan de plaats die is aangegeven door het veld Adres van index.
De uitvoerbare code haalt de TLS-index en ook de locatie van de TLS-matrix op.
De code maakt gebruik van de TLS-index en de TLS-matrixlocatie (waarbij de index wordt vermenigvuldigd met 4 en gebruikt als offset voor de matrix) om het adres van het TLS-gegevensgebied voor het opgegeven programma en de module op te halen. Elke thread heeft een eigen TLS-gegevensgebied, maar dit is transparant voor het programma, dat niet hoeft te weten hoe gegevens worden toegewezen voor afzonderlijke threads.
Een afzonderlijk TLS-gegevensobject wordt geopend als een vaste offset in het TLS-gegevensgebied.
De TLS-matrix is een matrix met adressen die het systeem voor elke thread onderhoudt. Elk adres in deze matrix geeft de locatie van TLS-gegevens voor een bepaalde module (EXE of DLL) in het programma. De TLS-index geeft aan welk lid van de matrix moet worden gebruikt. De index is een getal (alleen zinvol voor het systeem) waarmee de module wordt geïdentificeerd.
De TLS-map
De TLS-map heeft de volgende indeling:
Verschuiving (PE32/ PE32+) | Grootte (PE32/ PE32+) | Veld | Beschrijving |
---|---|---|---|
0 |
4/8 |
Onbewerkte gegevens starten VA |
Het beginadres van de TLS-sjabloon. De sjabloon is een blok met gegevens dat wordt gebruikt om TLS-gegevens te initialiseren. Het systeem kopieert al deze gegevens telkens wanneer een thread wordt gemaakt, zodat deze niet beschadigd mag zijn. Houd er rekening mee dat dit adres geen RVA is; het is een adres waarvoor een basisverplaatsing in de sectie .reloc moet zijn. |
4/8 |
4/8 |
Onbewerkte gegevens einde VA |
Het adres van de laatste byte van de TLS, met uitzondering van de opvulling nul. Net als bij het veld Raw Data Start VA is dit een VA, geen RVA. |
8/16 |
4/8 |
Adres van index |
De locatie voor het ontvangen van de TLS-index, die door het laadprogramma wordt toegewezen. Deze locatie bevindt zich in een gewone gegevenssectie, zodat deze een symbolische naam kan krijgen die toegankelijk is voor het programma. |
12/24 |
4/8 |
Adres van callbacks |
De aanwijzer naar een matrix met TLS-callbackfuncties. De matrix is null-beëindigd, dus als er geen callback-functie wordt ondersteund, verwijst dit veld naar 4 bytes ingesteld op nul. Zie TLS Callback Functionsvoor meer informatie over het prototype voor deze functies. |
16/32 |
4 |
Grootte van nul opvulling |
De grootte in bytes van de sjabloon, naast de geïnitialiseerde gegevens die zijn gescheiden door de velden Begin van onbewerkte gegevens en Einde VA van onbewerkte gegevens. De totale sjabloongrootte moet gelijk zijn aan de totale grootte van TLS-gegevens in het afbeeldingsbestand. De nulvulling is de hoeveelheid gegevens die na de geïnitialiseerde niet-nulgegevens komt. |
20/36 |
4 |
Kenmerken |
De vier bits [23:20] beschrijven uitlijningsgegevens. Mogelijke waarden zijn de waarden die zijn gedefinieerd als IMAGE_SCN_ALIGN_*, die ook worden gebruikt om de uitlijning van secties in objectbestanden te beschrijven. De andere 28 bits zijn gereserveerd voor toekomstig gebruik. |
TLS-callbackfuncties
Het programma kan een of meer TLS-callbackfuncties bieden ter ondersteuning van aanvullende initialisatie en beëindiging voor TLS-gegevensobjecten. Een typisch gebruik voor een dergelijke callback-functie is het aanroepen van constructors en destructors voor objecten.
Hoewel er doorgaans niet meer dan één callback-functie is, wordt een callback geïmplementeerd als een matrix om het mogelijk te maken om indien gewenst extra callbackfuncties toe te voegen. Als er meer dan één callback-functie is, wordt elke functie aangeroepen in de volgorde waarin het adres in de matrix wordt weergegeven. Een null-aanwijzer beëindigt de matrix. Het is perfect geldig om een lege lijst te hebben (geen callback ondersteund), in welk geval de callbackmatrix precies één lid-een null-aanwijzer heeft.
Het prototype voor een callback-functie (die wordt verwezen door een aanwijzer van het type PIMAGE_TLS_CALLBACK) heeft dezelfde parameters als een DLL-invoerpuntfunctie:
typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
PVOID DllHandle,
DWORD Reason,
PVOID Reserved
);
De gereserveerde parameter moet worden ingesteld op nul. De parameter Reason kan de volgende waarden aannemen:
Montuur | Waarde | Beschrijving |
---|---|---|
DLL_PROCESS_ATTACH |
1 |
Er is een nieuw proces gestart, inclusief de eerste thread. |
DLL_THREAD_ATTACH |
2 |
Er is een nieuwe thread gemaakt. Deze melding is verzonden voor alle threads, behalve voor de eerste thread. |
DLL_THREAD_DETACH |
3 |
Een thread staat op het punt om te worden beëindigd. Deze melding is verzonden voor alle threads, behalve voor de eerste thread. |
DLL_PROCESS_DETACH |
0 |
Een proces staat op het punt om te beëindigen, inclusief de oorspronkelijke thread. |
De structuur van de belastingconfiguratie (alleen installatiekopieën)
De belastingconfiguratiestructuur (IMAGE_LOAD_CONFIG_DIRECTORY) werd voorheen gebruikt in zeer beperkte gevallen in het Windows NT-besturingssysteem zelf om verschillende functies te moeilijk of te groot te beschrijven in de bestandskoptekst of optionele header van de afbeelding. Huidige versies van de Microsoft linker en Windows XP en latere versies van Windows gebruiken een nieuwe versie van deze structuur voor 32-bits x86-systemen die gereserveerde SEH-technologie bevatten. Dit biedt een lijst met veilige gestructureerde uitzonderingshandlers die door het besturingssysteem worden gebruikt tijdens het verzenden van uitzonderingen. Als het handleradres zich in het VA-bereik van een afbeelding bevindt en is gemarkeerd als gereserveerde SEH-bewust (dat wil zeggen, is IMAGE_DLLCHARACTERISTICS_NO_SEH duidelijk in het veld DllCharacteristics van de optionele header, zoals eerder beschreven), moet de handler in de lijst met bekende veilige handlers voor die afbeelding staan. Anders beëindigt het besturingssysteem de toepassing. Dit helpt voorkomen dat de exploit 'x86 exception handler hijacking' die in het verleden is gebruikt om de controle over het besturingssysteem te nemen.
De Microsoft Linker biedt automatisch een standaardconfiguratiestructuur voor belasting om de gereserveerde SEH-gegevens op te nemen. Als de gebruikerscode al een configuratiestructuur voor belasting biedt, moet deze de nieuwe gereserveerde SEH-velden bevatten. Anders kan de linker de gereserveerde SEH-gegevens niet bevatten en wordt de afbeelding niet gemarkeerd als met gereserveerde SEH.
Configuratiemap laden
De gegevensmapvermelding voor een vooraf gereserveerde SEH-belastingconfiguratiestructuur moet een bepaalde grootte van de belastingconfiguratiestructuur opgeven, omdat het besturingssysteemlaadprogramma altijd verwacht dat het een bepaalde waarde is. In dat opzicht is de grootte eigenlijk alleen een versiecontrole. Voor compatibiliteit met Windows XP en eerdere versies van Windows moet de grootte 64 zijn voor x86-installatiekopieën.
Indeling van belastingconfiguratie
De structuur van de belastingconfiguratie heeft de volgende indeling voor 32-bits en 64-bits PE-bestanden:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Kenmerken |
Vlaggen die kenmerken van het bestand aangeven, die momenteel niet worden gebruikt. |
4 |
4 |
TimeDateStamp |
Datum- en tijdstempelwaarde. De waarde wordt weergegeven in het aantal seconden dat is verstreken sinds middernacht (00:00:00), 1 januari 1970, Universal Coordinated Time, volgens de systeemklok. De tijdstempel kan worden afgedrukt met behulp van de C Runtime-tijdfunctie (CRT). |
8 |
2 |
MajorVersion |
Primaire versienummer. |
10 |
2 |
MinorVersion |
Secundair versienummer. |
12 |
4 |
GlobalFlags Clear |
De globale laadlaadvlagken die voor dit proces moeten worden gewist wanneer het laadprogramma het proces start. |
16 |
4 |
GlobalFlagsSet |
De globale laadlaadvlagken die voor dit proces moeten worden ingesteld wanneer het laadprogramma het proces start. |
20 |
4 |
CriticalSectionDefaultTimeout |
De standaardtime-outwaarde die moet worden gebruikt voor de kritieke secties van dit proces die worden afgelaten. |
24 |
4/8 |
DeCommitFreeBlockThreshold |
Geheugen dat moet worden vrijgemaakt voordat het wordt geretourneerd naar het systeem, in bytes. |
28/32 |
4/8 |
DeCommitTotalFreeThreshold |
Totale hoeveelheid vrij geheugen, in bytes. |
32/40 |
4/8 |
LockPrefixTable |
[alleen x86] De VA van een lijst met adressen waarin het LOCK-voorvoegsel wordt gebruikt, zodat ze kunnen worden vervangen door NOP op één processorcomputer. |
36/48 |
4/8 |
MaximumAllocationSize |
Maximale toewijzingsgrootte, in bytes. |
40/56 |
4/8 |
VirtualMemoryThreshold |
Maximale grootte van virtueel geheugen, in bytes. |
44/64 |
4/8 |
ProcessAffinityMask |
Het instellen van dit veld op een niet-nulwaarde is gelijk aan het aanroepen van SetProcessAffinityMask met deze waarde tijdens het opstarten van het proces (alleen.exe) |
48/72 |
4 |
ProcessHeapFlags |
Heap-vlaggen verwerken die overeenkomen met het eerste argument van de functie HeapCreate. Deze vlaggen zijn van toepassing op de proces-heap die wordt gemaakt tijdens het opstarten van het proces. |
52/76 |
2 |
CSDVersion |
De versie-id van het servicepack. |
54/78 |
2 |
DependentLoadFlags |
De standaardlaadvlagmen die worden gebruikt wanneer het besturingssysteem de statisch gekoppelde importbewerkingen van een module oplost. |
56/80 |
4/8 |
EditList |
Gereserveerd voor gebruik door het systeem. |
60/88 |
4/8 |
SecurityCookie |
Een aanwijzer naar een cookie die wordt gebruikt door Visual C++ of GS-implementatie. |
64/96 |
4/8 |
SEHandlerTable |
[alleen x86] De VA van de gesorteerde tabel met RVA's van elke geldige, unieke SE-handler in de afbeelding. |
68/104 |
4/8 |
SEHandlerCount |
[alleen x86] Het aantal unieke handlers in de tabel. |
72/112 |
4/8 |
GuardCFCheckFunctionPointer |
De VA waar de controlefunctiepointer van Flow Guard wordt opgeslagen. |
76/120 |
4/8 |
GuardCFDispatchFunctionPointer |
De VA waar de dispatchfunctiepointer van Control Flow Guard wordt opgeslagen. |
80/128 |
4/8 |
GuardCFFunctionTable |
De VA van de gesorteerde tabel met RVA's van elke functie Control Flow Guard in de afbeelding. |
84/136 |
4/8 |
GuardCFFunctionCount |
Het aantal unieke RVA's in de bovenstaande tabel. |
88/144 |
4 |
GuardFlags |
Gerelateerde vlaggen voor Flow Guard beheren. |
92/148 |
12 |
CodeIntegrity |
Informatie over code-integriteit. |
104/160 |
4/8 |
GuardAddressTakenIatEntryTable |
De VA waar het IAT-adres van Control Flow Guard is opgeslagen. |
108/168 |
4/8 |
GuardAddressTakenIatEntryCount |
Het aantal unieke RVA's in de bovenstaande tabel. |
112/176 |
4/8 |
GuardLongJumpTargetTable |
De VA waar de long jump doeltabel van Control Flow Guard wordt opgeslagen. |
116/184 |
4/8 |
GuardLongJumpTargetCount |
Het aantal unieke RVA's in de bovenstaande tabel. |
Het veld GuardFlags bevat een combinatie van een of meer van de volgende vlaggen en subvelden:
Module voert controlestroomintegriteitscontroles uit met behulp van door het systeem geleverde ondersteuning.
#define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100
Module voert controlestroom- en schrijfintegriteitscontroles uit.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200
Module bevat geldige metagegevens van controlestroomdoel.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400
Module maakt geen gebruik van de /GS-beveiligingscooky.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800
Module biedt ondersteuning voor IAT met alleen-lezenvertraging.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000
Importtabel delayload in een eigen .didat-sectie (met niets anders erin) die vrij opnieuw kan worden beveiligd.
#define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000
Module bevat onderdrukte exportgegevens. Dit zorgt er ook voor dat het adres dat de IAT-tabel heeft genomen, ook aanwezig is in de load-configuratie.
#define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000
Module maakt onderdrukking van exports mogelijk.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000
De module bevat longjmp-doelgegevens.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000
Masker voor het subveld dat de onderdrukking van de tabelvermeldingen van de Control Flow Guard-functie bevat (dat wil gezegd het extra aantal bytes per tabelvermelding).
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000
Daarnaast definieert de Windows SDK winnt.h-header deze macro voor de hoeveelheid bits om de GuardFlags-waarde naar rechts te verplaatsen om de functietabel Control Flow Guard rechts uit te sluiten:
#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28
De sectie .rsrc
Resources worden geïndexeerd door een structuur met binaire sortering op meerdere niveaus. Het algemene ontwerp kan 2**31 niveaus bevatten. Volgens de conventie gebruikt Windows echter drie niveaus:
- Typenaamtaal
Een reeks resourcemaptabellen heeft betrekking op alle niveaus op de volgende manier: Elke maptabel wordt gevolgd door een reeks mapvermeldingen die de naam of id (ID) voor dat niveau geven (Type, Naam of Taalniveau) en een adres van een gegevensbeschrijving of een andere maptabel. Als het adres verwijst naar een gegevensbeschrijving, zijn de gegevens een blad in de structuur. Als het adres naar een andere maptabel verwijst, worden in die tabel mapvermeldingen weergegeven op het volgende niveau omlaag.
Het type, de naam en de taal-id's van een blad worden bepaald door het pad dat wordt genomen door maptabellen om het blad te bereiken. De eerste tabel bepaalt type-id, de tweede tabel (waarnaar wordt verwezen door de mapvermelding in de eerste tabel) bepaalt naam-id en de derde tabel bepaalt taal-id.
De algemene structuur van de sectie .rsrc is:
Gegevens | Beschrijving |
---|---|
Resourcemaptabellen (en resourcemapvermeldingen) |
Een reeks tabellen, één voor elke groep knooppunten in de structuur. Alle knooppunten op het hoogste niveau (Type) worden vermeld in de eerste tabel. Vermeldingen in deze tabel verwijzen naar tabellen op het tweede niveau. Elke structuur op het tweede niveau heeft dezelfde type-id, maar verschillende naam-id's. Bomen op het derde niveau hebben dezelfde type- en naam-id's, maar verschillende taal-id's. Elke afzonderlijke tabel wordt onmiddellijk gevolgd door mapvermeldingen, waarin elke vermelding een naam of numerieke id heeft en een aanwijzer naar een gegevensbeschrijving of een tabel op het volgende lagere niveau. |
Resourcemaptekenreeksen |
Twee byte-uitgelijnde Unicode-tekenreeksen, die fungeren als tekenreeksgegevens waarnaar wordt verwezen door mapvermeldingen. |
Beschrijving van resourcegegevens |
Een matrix met records, waarnaar wordt verwezen door tabellen, die de werkelijke grootte en locatie van de resourcegegevens beschrijven. Deze records zijn de bladeren in de structuur van de resourcebeschrijving. |
Resourcegegevens |
Onbewerkte gegevens van de resourcesectie. De grootte en locatiegegevens in het veld Resourcegegevensbeschrijvingen scheiden de afzonderlijke regio's van resourcegegevens. |
Resourcemaptabel
Elke resourcemaptabel heeft de volgende indeling. Deze gegevensstructuur moet worden beschouwd als de kop van een tabel omdat de tabel daadwerkelijk bestaat uit mapvermeldingen (beschreven in sectie 6.9.2, 'Resourcemapvermeldingen') en deze structuur:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Kenmerken |
Resourcevlagmen. Dit veld is gereserveerd voor toekomstig gebruik. Het is momenteel ingesteld op nul. |
4 |
4 |
Tijd-/datumstempel |
Het tijdstip waarop de resourcegegevens zijn gemaakt door de resourcecompilator. |
8 |
2 |
Primaire versie |
Het primaire versienummer, ingesteld door de gebruiker. |
10 |
2 |
Secundaire versie |
Het secundaire versienummer, ingesteld door de gebruiker. |
12 |
2 |
Aantal naamvermeldingen |
Het aantal mapvermeldingen direct na de tabel die tekenreeksen gebruiken om vermeldingen type, naam of taal te identificeren (afhankelijk van het niveau van de tabel). |
14 |
2 |
Aantal id-vermeldingen |
Het aantal mapvermeldingen direct na de naamvermeldingen die numerieke id's gebruiken voor type-, naam- of taalvermeldingen. |
Resourcemapvermeldingen
De mapvermeldingen vormen de rijen van een tabel. Elke resourcemapvermelding heeft de volgende indeling. Of de vermelding een naam of id-vermelding is, wordt aangegeven door de resourcemaptabel, waarmee wordt aangegeven hoeveel naam- en id-vermeldingen er volgen (onthoud dat alle naamvermeldingen voorafgaan aan alle id-vermeldingen voor de tabel). Alle vermeldingen voor de tabel worden in oplopende volgorde gesorteerd: de naamvermeldingen op hoofdlettergevoelige tekenreeks en de id-vermeldingen op numerieke waarde. Verschuivingen zijn relatief ten opzichte van het adres in de IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory. Zie Peering inside the PE: A Tour of the Win32 Portable Executable File Format voor meer informatie.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Naamverschil |
De verschuiving van een tekenreeks die het invoertype, de naam of de taal-id geeft, afhankelijk van het niveau van de tabel. |
0 |
4 |
Geheel getal-id |
Een 32-bits geheel getal dat de vermelding Type, Naam of Taal-id identificeert. |
4 |
4 |
Verschuiving van gegevensinvoer |
Hoge bit 0. Adres van een resourcegegevensinvoer (een leaf). |
4 |
4 |
Verschuiving van submap |
Hoge bit 1. De lagere 31 bits zijn het adres van een andere resourcemaptabel (het volgende niveau lager). |
Resourcemaptekenreeks
Het tekenreeksgebied van de resourcemap bestaat uit Unicode-tekenreeksen, die zijn uitgelijnd op woorden. Deze tekenreeksen worden samen opgeslagen na de laatste resourcemapvermelding en vóór de eerste resourcegegevensvermelding. Dit minimaliseert de impact van deze tekenreeksen met variabele lengte op de uitlijning van de mapvermeldingen met vaste grootte. Elke resourcemaptekenreeks heeft de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
2 |
Lengte |
De grootte van de tekenreeks, niet inclusief lengteveld zelf. |
2 |
veranderlijk |
Unicode-tekenreeks |
De Unicode-tekenreeksgegevens met variabele lengte, uitgelijnd. |
Resourcegegevensinvoer
Elke resourcegegevensvermelding beschrijft een werkelijke eenheid met onbewerkte gegevens in het gebied Resourcegegevens. Een resourcegegevensvermelding heeft de volgende indeling:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Data RVA |
Het adres van een eenheid resourcegegevens in het gebied Resourcegegevens. |
4 |
4 |
Grootte |
De grootte, in bytes, van de resourcegegevens waarnaar wordt verwezen door het veld Data RVA. |
8 |
4 |
Codepagina |
De codepagina die wordt gebruikt voor het decoderen van codepuntwaarden in de resourcegegevens. Normaal gesproken is de codepagina de Unicode-codepagina. |
12 |
4 |
Gereserveerd, moet 0 zijn. |
De .cormeta-sectie (alleen object)
CLR-metagegevens worden opgeslagen in deze sectie. Het wordt gebruikt om aan te geven dat het objectbestand beheerde code bevat. De indeling van de metagegevens wordt niet gedocumenteerd, maar kan worden overgedragen aan de CLR-interfaces voor het verwerken van metagegevens.
De sectie .sxdata
De geldige uitzonderingshandlers van een object worden weergegeven in de sectie .sxdata van dat object. De sectie is gemarkeerd als IMAGE_SCN_LNK_INFO. Het bevat de COFF-symboolindex van elke geldige handler, met 4 bytes per index.
Daarnaast markeert de compiler een COFF-object als geregistreerde SEH door het absolute symbool '@feat.00' te verzenden met de LSB van het waardeveld ingesteld op 1. Een COFF-object zonder geregistreerde SEH-handlers zou het symbool '@feat.00' hebben, maar geen sectie .sxdata.
Archiefbestandsindeling (bibliotheek)
- archiefbestandshandtekening
- kopteksten voor archiefleden
- First Linker Member
- tweede linkerlid
- Lid- lange namen
De COFF-archiefindeling biedt een standaardmechanisme voor het opslaan van verzamelingen objectbestanden. Deze verzamelingen worden vaak bibliotheken genoemd in programmeerdocumentatie.
De eerste 8 bytes van een archief bestaan uit de bestandshandtekening. De rest van het archief bestaat uit een reeks archiefleden, als volgt:
De eerste en tweede leden zijn 'linkerleden'. Elk van deze leden heeft een eigen indeling, zoals beschreven in sectie importnaamtype. Normaal gesproken plaatst een linker informatie in deze archiefleden. De linkerleden bevatten de map van het archief.
Het derde lid is het lid 'longnames'. Dit optionele lid bestaat uit een reeks ascii-tekenreeksen met null-beëindiging waarin elke tekenreeks de naam is van een ander archieflid.
De rest van het archief bestaat uit standaardleden (objectbestand). Elk van deze leden bevat de inhoud van één objectbestand in zijn geheel.
Een koptekst van een archieflid gaat vooraf aan elk lid. In de volgende lijst ziet u de algemene structuur van een archief:
Handtekening :"!<boog>\n" |
---|
Rubriek |
---|
1st Linker Member |
Rubriek |
---|
2nd Linker Member |
Rubriek |
---|
Lid lange namen |
Rubriek |
---|
Inhoud van OBJ-bestand 1 (COFF-indeling) |
Rubriek |
---|
Inhoud van OBJ-bestand 2 (COFF-indeling) |
...
Rubriek |
---|
Inhoud van OBJ-bestand N (COFF-indeling) |
Archiefbestandshandtekening
De handtekening van het archiefbestand identificeert het bestandstype. Elk hulpprogramma (bijvoorbeeld een linker) dat een archiefbestand als invoer gebruikt, kan het bestandstype controleren door deze handtekening te lezen. De handtekening bestaat uit de volgende ASCII-tekens, waarin elk teken hieronder letterlijk wordt weergegeven, met uitzondering van het teken newline (\n):
!<arch>\n
De Windows SDK winnt.h-header definieert de volgende macro's:
#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>/ "
Kopteksten van archieflid
Elk lid (linker, lange namen of objectbestandslid) wordt voorafgegaan door een koptekst. Een koptekst van een archieflid heeft de volgende indeling, waarin elk veld een ASCII-tekenreeks is die is uitgevuld en opgevuld met spaties aan het einde van het veld. Er is geen null-eindteken in een van deze velden.
Elke koptekst van het lid begint op het eerste even adres na het einde van het vorige archieflid, één byte '\n' (IMAGE_ARCHIVE_PAD) kan worden ingevoegd nadat een archieflid het volgende lid op een even adres start.
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
16 |
Naam |
De naam van het archieflid, waaraan een slash (/) is toegevoegd om de naam te beëindigen. Als het eerste teken een slash is, heeft de naam een speciale interpretatie, zoals beschreven in de volgende tabel. |
16 |
12 |
Datum |
De datum en tijd waarop het archieflid is gemaakt: dit is de ASCII-decimale weergave van het aantal seconden sinds 1-1-1970 UCT. |
28 |
6 |
Gebruikersnaam |
Een ASCII-decimale weergave van de gebruikers-id. Dit veld bevat geen zinvolle waarde op Windows-platforms, omdat alle lege waarden door Microsoft-hulpprogramma's worden verzonden. |
34 |
6 |
Groeps-id |
Een ASCII-decimale weergave van de groeps-id. Dit veld bevat geen zinvolle waarde op Windows-platforms, omdat alle lege waarden door Microsoft-hulpprogramma's worden verzonden. |
40 |
8 |
Wijze |
Een ASCII-octale weergave van de bestandsmodus van het lid. Dit is de ST_MODE waarde van de C-runtimefunctie _wstat. |
48 |
10 |
Grootte |
Een ASCII-decimale weergave van de totale grootte van het archieflid, niet inclusief de grootte van de koptekst. |
58 |
2 |
Einde van koptekst |
De twee bytes (0x60 0x0A) in de C-tekenreeks ''\n' (IMAGE_ARCHIVE_END). |
Het veld Naam heeft een van de indelingen die worden weergegeven in de volgende tabel. Zoals eerder vermeld, wordt elk van deze tekenreeksen uitgevuld en opgevuld met volgspaties binnen een veld van 16 bytes:
Inhoud van het veld Naam | Beschrijving |
---|---|
naam/ |
De naam van het archieflid. |
/ |
Het archieflid is een van de twee linkerleden. Beide linkerleden hebben deze naam. |
// |
Het archieflid is het lid longnames, dat bestaat uit een reeks ascii-tekenreeksen die null zijn beëindigd. Het lid longnames is het derde archieflid en is optioneel. |
/n |
De naam van het archieflid bevindt zich op offset n binnen het lid longnames. Het getal n is de decimale weergave van de offset. Bijvoorbeeld: '/26' geeft aan dat de naam van het archieflid zich 26 bytes buiten het begin van de inhoud van het lid lange naam bevindt. |
First Linker Member
De naam van het eerste linkerlid is '/' (IMAGE_ARCHIVE_LINKER_MEMBER). Het eerste linkerlid is opgenomen voor compatibiliteit met eerdere versies. Het wordt niet gebruikt door huidige linkers, maar de indeling moet juist zijn. Dit linkerlid biedt een map met symboolnamen, net als het tweede linkerlid. Voor elk symbool geeft de informatie aan waar het archieflid moet worden gevonden dat het symbool bevat.
Het eerste linkerlid heeft de volgende indeling. Deze informatie wordt weergegeven na de koptekst:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Aantal symbolen |
Niet-ondertekend lang dat het aantal geïndexeerde symbolen bevat. Dit getal wordt opgeslagen in big-endian-indeling. Elk objectbestandslid definieert doorgaans een of meer externe symbolen. |
4 |
4 * n |
Offsets |
Een matrix van bestandsverschuivingen voor archieflidheaders, waarbij n gelijk is aan het veld Aantal symbolen. Elk getal in de matrix is een niet-ondertekend lang opgeslagen in big-endian-indeling. Voor elk symbool dat in de tekenreekstabel wordt genoemd, geeft het bijbehorende element in de offsetmatrix de locatie van het archieflid dat het symbool bevat. |
* |
* |
Tekenreekstabel |
Een reeks null-beëindigde tekenreeksen die alle symbolen in de map een naam geven. Elke tekenreeks begint direct na het null-teken in de vorige tekenreeks. Het aantal tekenreeksen moet gelijk zijn aan de waarde van het veld Aantal symbolen. |
De elementen in de offsetmatrix moeten in oplopende volgorde worden gerangschikt. Dit betekent dat de symbolen in de tekenreekstabel moeten worden gerangschikt op basis van de volgorde van archiefleden. Alle symbolen in het eerste objectbestandslid moeten bijvoorbeeld worden weergegeven vóór de symbolen in het tweede objectbestand.
Second Linker Member
Net als het eerste linkerlid heeft het tweede linkerlid de naam '/' (IMAGE_ARCHIVE_LINKER_MEMBER). Hoewel beide linkerleden een map met symbolen en archiefleden bevatten, wordt het tweede linkerlid in voorkeur gebruikt voor de eerste door alle huidige linkers. Het tweede linkerlid bevat symboolnamen in lexicale volgorde, waardoor sneller op naam kan worden gezocht.
Het tweede lid heeft de volgende indeling. Deze informatie wordt weergegeven na de koptekst:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
4 |
Aantal leden |
Een niet-ondertekende lengte die het aantal archiefleden bevat. |
4 |
4 * m |
Offsets |
Een matrix van bestandsverschuivingen voor archieflidheaders, gerangschikt in oplopende volgorde. Elke offset is een niet-ondertekend lang . Het getal m is gelijk aan de waarde van het veld Aantal leden. |
* |
4 |
Aantal symbolen |
Een niet-ondertekende lengte die het aantal geïndexeerde symbolen bevat. Elk objectbestandslid definieert doorgaans een of meer externe symbolen. |
* |
2 * n |
Indexen |
Een matrix van op 1 gebaseerde indexen (niet-ondertekende korte indexen) die symboolnamen toewijzen aan verschuivingen van archiefleden. Het getal n is gelijk aan het veld Aantal symbolen. Voor elk symbool dat in de tekenreekstabel wordt genoemd, geeft het bijbehorende element in de indexmatrix een index in de offsetmatrix. De offsetmatrix geeft op zijn beurt de locatie van het archieflid dat het symbool bevat. |
* |
* |
Tekenreekstabel |
Een reeks null-beëindigde tekenreeksen die alle symbolen in de map een naam geven. Elke tekenreeks begint direct na de null-byte in de vorige tekenreeks. Het aantal tekenreeksen moet gelijk zijn aan de waarde van het veld Aantal symbolen. Deze tabel bevat alle symboolnamen in oplopende lexicale volgorde. |
Lid lange namen
De naam van het lid longnames is '//' (IMAGE_ARCHIVE_LONGNAMES_MEMBER). Het lid longnames is een reeks tekenreeksen met archieflidnamen. Hier wordt alleen een naam weergegeven als er onvoldoende ruimte is in het veld Naam (16 bytes). Het lid longnames is optioneel. Het kan leeg zijn met alleen een koptekst of het kan volledig afwezig zijn zonder zelfs een koptekst.
De tekenreeksen zijn null-beëindigd. Elke tekenreeks begint direct na de null-byte in de vorige tekenreeks.
Bibliotheekindeling importeren
Traditionele importbibliotheken, d.w.w.v. bibliotheken die de exports uit de ene afbeelding beschrijven voor gebruik door een andere, volgen doorgaans de indeling die wordt beschreven in sectie 7, archiefbestandsindeling (bibliotheek). Het belangrijkste verschil is dat importbibliotheekleden pseudoobjectbestanden bevatten in plaats van echte bestanden, waarin elk lid de sectiebijdragen bevat die nodig zijn om de importtabellen te maken die worden beschreven in sectie 6.4, De sectie .idata De linker genereert dit archief tijdens het bouwen van de exporttoepassing.
De sectiebijdragen voor een import kunnen worden afgeleid van een kleine set informatie. De linker kan de volledige, uitgebreide informatie genereren in de importbibliotheek voor elk lid op het moment dat de bibliotheek is gemaakt of alleen de canonieke informatie naar de bibliotheek schrijven en de toepassing die later gebruikt, de benodigde gegevens laten genereren.
In een importbibliotheek met de lange indeling bevat één lid de volgende informatie:
- Koptekst archieflid
- Bestandskoptekst
- Sectiekoppen
- Gegevens die overeenkomen met elk van de sectiekoppen
- Tabel met COFF-symbool
- Tekenreeksen
Een korte importbibliotheek wordt daarentegen als volgt geschreven:
- Koptekst archieflid
- Koptekst importeren
- Tekenreeks met niet-beëindigde importnaam
- Tekenreeks met null-beëindigde DLL-naam
Dit is voldoende informatie om de volledige inhoud van het lid op het moment van gebruik nauwkeurig te reconstrueren.
Koptekst importeren
De importheader bevat de volgende velden en offsets:
Afstand | Grootte | Veld | Beschrijving |
---|---|---|---|
0 |
2 |
Sig1 |
Moet IMAGE_FILE_MACHINE_UNKNOWN zijn. Zie Machinetypenvoor meer informatie. |
2 |
2 |
Sig2 |
Moet 0xFFFF zijn. |
4 |
2 |
Versie |
De structuurversie. |
6 |
2 |
Machine |
Het getal dat het type doelmachine aangeeft. Zie Machinetypenvoor meer informatie. |
8 |
4 |
Time-Date stempel |
De tijd en datum waarop het bestand is gemaakt. |
12 |
4 |
Grootte van gegevens |
De grootte van de tekenreeksen die de koptekst volgen. |
16 |
2 |
Rangtelwoord/hint |
De ordinale waarde of de hint voor het importeren, bepaald door de waarde in het veld Naamtype. |
18 |
2 bits |
Type |
Het importtype. Zie importtypevoor specifieke waarden en beschrijvingen. |
3 bits |
Naamtype |
Het type importnaam. Zie importnaamtypevoor meer informatie. |
|
11 bits |
Gereserveerd |
Gereserveerd, moet 0 zijn. |
Deze structuur wordt gevolgd door twee null-beëindigde tekenreeksen die de naam van het geïmporteerde symbool en het DLL-bestand beschrijven waaruit het is gekomen.
Importtype
De volgende waarden worden gedefinieerd voor het veld Type in de importheader:
Constant | Waarde | Beschrijving |
---|---|---|
IMPORT_OBJECT_CODE |
0 |
Uitvoerbare code. |
IMPORT_OBJECT_DATA |
1 |
Gegevens. |
IMPORT_OBJECT_CONST |
2 |
Opgegeven als CONST in het .def-bestand. |
Deze waarden worden gebruikt om te bepalen welke sectiebijdragen moeten worden gegenereerd door het hulpprogramma dat gebruikmaakt van de bibliotheek als deze toegang moet hebben tot die gegevens.
Type importnaam
De naam van het importsymbool met null-beëindiging volgt onmiddellijk de bijbehorende importheader. De volgende waarden worden gedefinieerd voor het veld Naamtype in de importheader. Ze geven aan hoe de naam moet worden gebruikt om de juiste symbolen te genereren die de import vertegenwoordigen:
Constant | Waarde | Beschrijving |
---|---|---|
IMPORT_OBJECT_ORDINAL | 0 | De import is per rangschikkelijk. Dit geeft aan dat de waarde in het veld Ordinaal/Hint van de importheader het rangtelwoord van de import is. Als deze constante niet is opgegeven, moet het veld Rangschikken/Hint altijd worden geïnterpreteerd als de hint van het importeren. |
IMPORT_OBJECT_NAME | 1 | De importnaam is identiek aan de naam van het openbare symbool. |
IMPORT_OBJECT_NAME_NOPREFIX | 2 | De importnaam is de naam van het openbare symbool, maar de voorloopnaam wordt overgeslagen?, @of optioneel _. |
IMPORT_OBJECT_NAME_UNDECORATE | 3 | De importnaam is de naam van het openbare symbool, maar slaat de voorloop ?, @, of optioneel _, over en kapt af bij de eerste @. |
Bijlage A: Authenticode PE-afbeeldingshash berekenen
- Wat is een Authenticode PE-installatiekopieënhash?
- Wat wordt behandeld in een Authenticode PE-installatiekopieënhash?
Er worden naar verwachting verschillende kenmerkcertificaten gebruikt om de integriteit van de installatiekopieën te verifiëren. De meest voorkomende is Authenticode-handtekening. Een Authenticode-handtekening kan worden gebruikt om te controleren of de relevante secties van een PE-afbeeldingsbestand op geen enkele manier zijn gewijzigd vanuit het oorspronkelijke formulier van het bestand. Om deze taak uit te voeren, bevatten Authenticode-handtekeningen iets wat een PE-afbeeldingshash wordt genoemd
Wat is een Authenticode PE-installatiekopieënhash?
De hash van de Authenticode PE-installatiekopieën of bestands-hash is vergelijkbaar met een bestandscontrolesom, omdat deze een kleine waarde produceert die betrekking heeft op de integriteit van een bestand. Een controlesom wordt geproduceerd door een eenvoudig algoritme en wordt voornamelijk gebruikt om geheugenfouten te detecteren. Dat wil gezegd, het wordt gebruikt om te detecteren of een blok geheugen op schijf is beschadigd en de waarden die daar zijn opgeslagen, zijn beschadigd. Een bestandshash is vergelijkbaar met een controlesom omdat ook bestandsbeschadiging wordt gedetecteerd. In tegenstelling tot de meeste controlesomalgoritmen is het echter erg moeilijk om een bestand te wijzigen, zodat het dezelfde bestands-hash heeft als het oorspronkelijke (ongewijzigde) formulier. Dat wil zeggen, een controlesom is bedoeld om eenvoudige geheugenfouten te detecteren die leiden tot beschadiging, maar een bestands-hash kan worden gebruikt om opzettelijke en zelfs subtiele wijzigingen in een bestand te detecteren, zoals die zijn geïntroduceerd door virussen, hackers of Trojaanse paardenprogramma's.
In een Authenticode-handtekening wordt de bestandshash digitaal ondertekend met behulp van een persoonlijke sleutel die alleen bekend is bij de ondertekenaar van het bestand. Een softwaregebruiker kan de integriteit van het bestand controleren door de hashwaarde van het bestand te berekenen en deze te vergelijken met de waarde van ondertekende hash in de digitale handtekening Authenticode. Als de bestandshashes niet overeenkomen, is een deel van het bestand dat wordt gedekt door de PE-installatiekopieënhash gewijzigd.
Wat is gedekt in een Authenticode PE-installatiekopieënhash?
Het is niet mogelijk of wenselijk om alle afbeeldingsbestandsgegevens op te nemen in de berekening van de PE-afbeeldingshash. Soms worden er gewoon ongewenste kenmerken weergegeven (bijvoorbeeld foutopsporingsgegevens kunnen niet worden verwijderd uit openbaar vrijgegeven bestanden); soms is het gewoon onmogelijk. Het is bijvoorbeeld niet mogelijk om alle informatie in een afbeeldingsbestand op te nemen in een Authenticode-handtekening, en vervolgens de Authenticode-handtekening die die PE-afbeeldingshash bevat in de PE-afbeelding, in te voegen en later een identieke PE-afbeeldingshash te genereren door alle afbeeldingsbestandsgegevens in de berekening opnieuw op te nemen, omdat het bestand nu de Authenticode-handtekening bevat die niet oorspronkelijk aanwezig was.
Proces voor het genereren van de Authenticode PE-installatiekopieënhash
In deze sectie wordt beschreven hoe een PE-afbeeldingshash wordt berekend en welke onderdelen van de PE-installatiekopieën kunnen worden gewijzigd zonder de Authenticode-handtekening te ongeldig te maken.
Notitie
De PE-installatiekopieënhash voor een specifiek bestand kan worden opgenomen in een afzonderlijk catalogusbestand zonder een kenmerkcertificaat in het gehashte bestand op te nemen. Dit is relevant, omdat het mogelijk wordt om de PE-installatiekopie-hash ongeldig te maken in een authenticode-catalogusbestand door een PE-installatiekopie te wijzigen die geen Authenticode-handtekening bevat.
Alle gegevens in secties van de PE-installatiekopie die zijn opgegeven in de sectietabel, worden in hun geheel gehasht, met uitzondering van de volgende uitsluitingsbereiken:
Het veld CheckSum van het bestand van de Windows-specifieke velden van de optionele koptekst. Deze controlesom bevat het hele bestand (inclusief eventuele kenmerkcertificaten in het bestand). In alle waarschijnlijkheid is de controlesom anders dan de oorspronkelijke waarde na het invoegen van de Authenticode-handtekening.
informatie met betrekking tot kenmerkcertificaten. De gebieden van de PE-afbeelding die zijn gerelateerd aan de Authenticode-handtekening, worden niet opgenomen in de berekening van de PE-afbeeldingshash omdat Authenticode-handtekeningen kunnen worden toegevoegd aan of verwijderd uit een afbeelding zonder dat dit van invloed is op de algehele integriteit van de afbeelding. Dit is geen probleem, omdat er gebruikersscenario's zijn die afhankelijk zijn van het opnieuw ondertekenen van PE-afbeeldingen of het toevoegen van een tijdstempel. Authenticode sluit de volgende informatie uit van de hashberekening:
Het veld Certificaattabel van de optionele headergegevensmappen.
De certificaattabel en de bijbehorende certificaten waarnaar wordt verwezen door het veld Certificaattabel dat direct hierboven wordt vermeld.
Als u de PE-afbeeldingshash wilt berekenen, worden de secties die zijn opgegeven in de sectietabel op adresbereik, georderd en vervolgens de resulterende reeks bytes gehasht, waarbij de uitsluitingsbereiken worden doorgegeven.
Informatie verleden van het einde van de laatste sectie. Het gebied voorbij de laatste sectie (gedefinieerd door de hoogste offset) wordt niet gehasht. Dit gebied bevat meestal informatie over foutopsporing. Foutopsporingsinformatie kan over het algemeen worden beschouwd als advies voor foutopsporingsprogramma's; dit heeft geen invloed op de werkelijke integriteit van het uitvoerbare programma. Het is vrij letterlijk mogelijk om foutopsporingsinformatie uit een afbeelding te verwijderen nadat een product is geleverd en niet van invloed is op de functionaliteit van het programma. In feite wordt dit soms gedaan als een schijfbesparende meting. Het is belangrijk te vermelden dat foutopsporingsgegevens in de opgegeven secties van de PE-installatiekopieën niet kunnen worden verwijderd zonder de Authenticode-handtekening te ongeldig te maken.
U kunt de makecert- en signtool-hulpprogramma's in de Windows Platform SDK gebruiken om te experimenteren met het maken en verifiëren van Authenticode-handtekeningen. Zie Naslaginformatie hieronder voor meer informatie.
Verwijzingen
Downloads en hulpprogramma's voor Windows (bevat de Windows SDK)
certificaten maken, weergeven en beheren
Kernel-Mode walkthrough voor ondertekening van programmacode (.doc)
Windows Authenticode Portable Executable Signature Format (.docx)