Megosztás:


PE formátum

Ez a specifikáció a végrehajtható (kép) fájlok és objektumfájlok szerkezetét ismerteti a Windows operációs rendszerek családjában. Ezeket a fájlokat hordozható végrehajtható (PE) és Common Object File Format (COFF) fájloknak nevezzük.

Megjegyzés:

Ez a dokumentum segítséget nyújt a Windowshoz készült eszközök és alkalmazások fejlesztéséhez, de nem garantált, hogy minden tekintetben teljes specifikáció. A Microsoft fenntartja a jogot a dokumentum előzetes értesítés nélküli módosítására.

A Microsoft Portable Executable és a Common Object File Format Specification ezen változata a specifikáció összes korábbi változatát felülírja.

Általános fogalmak

Ez a dokumentum a végrehajtható (kép) fájlok és objektumfájlok szerkezetét határozza meg a Microsoft Windows operációs rendszerek családjában. Ezeket a fájlokat hordozható végrehajtható (PE) és Common Object File Format (COFF) fájloknak nevezzük. A "Portable Executable" név arra utal, hogy a formátum nem architektúraspecifikus.

Az ebben a specifikációban megjelenő egyes fogalmakat az alábbi táblázat ismerteti:

Név Leírás
attribútumtanúsítvány
Egy tanúsítvány, amely ellenőrizhető utasítások képpel való társítására szolgál. Egy fájlhoz számos különböző ellenőrizhető utasítás társítható; az egyik legkedvezőbb egy szoftvergyártó nyilatkozata, amely jelzi, hogy a rendszerkép üzenete várhatóan milyen lesz. Az üzenetkivonatok hasonlóak az ellenőrzőösszegekhez, kivéve, hogy rendkívül nehéz kovácsolni. Ezért nagyon nehéz úgy módosítani egy fájlt, hogy ugyanazzal az üzenetkivonatzal rendelkezzen, mint az eredeti fájl. Az utasítást úgy ellenőrizheti, hogy a gyártó nyilvános vagy titkos kulcsú titkosítási sémákat használ. Ez a dokumentum az attribútumtanúsítványok részleteit ismerteti, és nem teszi lehetővé a képfájlokba való beszúrást.
dátum-/időbélyeg
Egy pe- vagy COFF-fájlban több helyen különböző célokra használt bélyegző. A legtöbb esetben az egyes bélyegek formátuma megegyezik a C futásidejű kódtár időfüggvényei által használt formátummal. Kivételeket a hibakeresési típus IMAGE_DEBUG_TYPE_REPRO leírójában talál. Ha a bélyeg értéke 0 vagy 0xFFFFFFFF, az nem jelent valós vagy értelmezhető dátum-/időbélyeget.
fájlmutató
Az elem helye magában a fájlban, mielőtt a hivatkozás (objektumfájlok esetén) vagy a betöltő (képfájlok esetén) feldolgozta őket. Más szóval ez a lemezen tárolt fájlon belüli pozíció.
szerkesztő
Hivatkozás a Microsoft Visual Studio által biztosított hivatkozásra.
objektumfájl
A linker bemeneteként megadott fájl. A linker létrehoz egy képfájlt, amelyet a betöltő bemenetként használ. Az "object file" kifejezés nem feltétlenül jelent semmilyen kapcsolatot az objektumorientált programozással.
fenntartott, 0-nak kell lennie
Egy mező leírása, amely azt jelzi, hogy a mező értékének nullának kell lennie a generátorok számára, és a fogyasztóknak figyelmen kívül kell hagyniuk a mezőt.
Relatív virtuális cím (RVA)
Egy képfájlban ez egy elem címe, miután betöltötte a memóriába, és a képfájl alapcímét kivonták belőle. Egy elem RVA-ja szinte mindig eltér a lemezen lévő fájlban elfoglalt helyétől (a fájlmutatótól).
Egy objektumfájlban az RVA kevésbé értelmezhető, mert a memóriahelyek nincsenek hozzárendelve. Ebben az esetben az RVA egy szakaszon belüli cím (amelyet a táblázat későbbi részében ismertetünk), amelyre a csatolás során a rendszer később áthelyezést alkalmaz. Az egyszerűség kedvéért a fordítónak az egyes szakaszok első RVA-jának nullára kell állítania.
szakasz
A PE- vagy COFF-fájlban lévő kód vagy adatok alapegysége. Egy objektumfájl összes kódját kombinálhatja például egyetlen szakaszon belül, vagy (a fordító viselkedésétől függően) minden függvény elfoglalhatja a saját szakaszát. További szakaszok esetén nagyobb a fájlterhelés, de a hivatkozáskezelő képes szelektívebben hivatkozni a kódban. A szakaszok hasonlóak az Intel 8086 architektúra egy szegmenséhez. A szakasz összes nyers adatát egybefüggően kell betölteni. Emellett a képfájlok több szakaszt is tartalmazhatnak, például .tlset vagy .relocot, amelyek speciális célokat szolgálnak.
Virtuális cím (VA)
Ugyanaz, mint az RVA, kivéve, hogy a képfájl alapcíme nincs kivonva. A címet VA-nak nevezzük, mert a Windows minden folyamathoz külön VA-helyet hoz létre, a fizikai memóriától függetlenül. A virtuális VA-t szinte minden esetben csak egy címnek kell tekinteni. A VA nem olyan kiszámítható, mint egy RVA, mert előfordulhat, hogy a betöltő nem tölti be a képet az előnyben részesített helyen.

Áttekintés

Az alábbi lista a Microsoft PE végrehajtható formátumát ismerteti, felül pedig a képfejléc alapja látható. A MS-DOS 2.0 kompatibilis EXE-fejléctől a pe-fejléc előtti nem használt szakaszig a MS-DOS 2.0-s szakasz, és csak MS-DOS kompatibilitásra szolgál.

  • MS-DOS 2.0-s kompatibilis EXE-fejléc

  • Használatlan

  • OEM-azonosító

    OEM-információk

    Eltolás a PE-fejléchez

  • MS-DOS 2.0 Stub Program and Relocation Table

  • Használatlan

  • PE-fejléc (8 bájtos határhoz igazítva)

  • Szakaszfejlécek

  • Képoldalak:

    adatok importálása

    adatok exportálása

    bázisáthelyezések

    erőforrás-információk

Az alábbi lista a Microsoft COFF objektummodul formátumát ismerteti:

  • Microsoft COFF-fejléc

  • Szakaszfejlécek

  • Nyers adatok:

    kód

    adatok

    hibakeresési információk

    áthelyezések

Fájlfejlécek

A PE-fájlfejléc egy Microsoft MS-DOS-csonkból, a PE-aláírásból, a COFF-fájlfejlécből és egy opcionális fejlécből áll. A COFF-objektumfájl fejléce egy COFF-fájlfejlécből és egy opcionális fejlécből áll. Mindkét esetben a fájlfejléceket azonnal szakaszfejlécek követik.

MS-DOS csonk (csak kép)

A MS-DOS csonk egy érvényes alkalmazás, amely az MS-DOS alatt fut. Az EXE-rendszerkép elejére kerül. A linker ide helyez egy alapértelmezett csonkot, amely a "Ez a program nem futtatható DOS módban" üzenet jelenik meg, amikor a rendszerkép MS-DOS-ban fut. A felhasználó a /STUB linker beállítással megadhat egy másik csonkot.

A 0x3c helyen a csonk fájleltolása a PE-aláíráshoz tartozik. Ezek az információk lehetővé teszik a Windows számára a képfájl megfelelő végrehajtását, annak ellenére, hogy MS-DOS csonkgal rendelkezik. Ez a fájleltolás a csatolás során 0x3c helyre kerül.

Aláírás (csak kép)

A MS-DOS csonk után, a 0x3c eltoláskor megadott fájleltolásnál egy 4 bájtos aláírás, amely a fájlt PE formátumú képfájlként azonosítja. Ez az aláírás a "PE\0\0" (a "P" és az "E" betű, amelyet két null bájt követ).

COFF-fájlfejléc (objektum és kép)

Egy objektumfájl elején vagy közvetlenül a képfájl aláírása után egy szabványos COFF-fájlfejléc a következő formátumban. Vegye figyelembe, hogy a Windows-betöltő a szakaszok számát 96-ra korlátozza.

Kiegyenlít Méret Terület Leírás
0
2
Gép
A célgép típusát azonosító szám. További információ: Géptípusok.
2
2
NumberOfSections
A szakaszok száma. Ez a szakasztábla méretét jelzi, amely azonnal követi a fejléceket.
4
4
TimeDateStamp
Az 1970. január 1-jei 00:00 óta eltelt másodpercek alacsony 32 bitje (egy C futásidejű time_t érték), amely a fájl létrehozását jelzi.
8
4
PointerToSymbolTable
A COFF szimbólumtábla fájleltolása, vagy nulla, ha nincs coFF szimbólumtábla. Ennek az értéknek nullának kell lennie egy kép esetében, mert a COFF hibakeresési információ elavult.
12
4
NumberOfSymbols
A szimbólumtáblában lévő bejegyzések száma. Ezekkel az adatokkal megkeresheti a sztringtáblát, amely azonnal követi a szimbólumtáblát. Ennek az értéknek nullának kell lennie egy kép esetében, mert a COFF hibakeresési információ elavult.
16
2
SizeOfOptionalHeader
Az opcionális fejléc mérete, amely végrehajtható fájlokhoz szükséges, objektumfájlok esetében azonban nem. Ennek az értéknek nullának kell lennie egy objektumfájl esetében. A fejléc formátumának leírását az Opcionális fejléc (Csak kép) című témakörben találhatja meg.
18
2
Jellemzők
A fájl attribútumait jelző jelzők. Konkrét jelzőértékeket a Jellemzők című témakörben talál.

Géptípusok

A Gép mező a következő értékek egyikével rendelkezik, amelyek megadják a cpu típusát. Egy képfájl csak a megadott gépen vagy a megadott gépet emuláló rendszeren futtatható.

Állandó Érték Leírás
IMAGE_FILE_MACHINE_UNKNOWN
0x0
Ennek a mezőnek a tartalma minden géptípusra alkalmazható
IMAGE_FILE_MACHINE_ALPHA
0x184
Alfa AXP, 32 bites címtér
IMAGE_FILE_MACHINE_ALPHA64
0x284
Alfa 64, 64 bites címtér
IMAGE_FILE_MACHINE_AM33
0x1d3
Matsushita AM33
IMAGE_FILE_MACHINE_AMD64
0x8664
x64
IMAGE_FILE_MACHINE_ARM
0x1c0
ARM kis endian
IMAGE_FILE_MACHINE_ARM64
0xaa64
ARM64 kis endian
IMAGE_FILE_MACHINE_ARMNT
0x1c4
ARM Thumb-2 kis endian
IMAGE_FILE_MACHINE_AXP64
0x284
AXP 64 (ugyanaz, mint az Alpha 64)
IMAGE_FILE_MACHINE_EBC
0xebc
EFI bájtkód
IMAGE_FILE_MACHINE_I386
0x14c
Intel 386 vagy újabb processzorok és kompatibilis processzorok
IMAGE_FILE_MACHINE_IA64
0x200
Intel Itanium processzorcsalád
IMAGE_FILE_MACHINE_LOONGARCH32
0x6232
LoongArch 32 bites processzorcsalád
IMAGE_FILE_MACHINE_LOONGARCH64
0x6264
LoongArch 64 bites processzorcsalád
IMAGE_FILE_MACHINE_M32R
0x9041
Mitsubishi M32R kis endian
IMAGE_FILE_MACHINE_MIPS16
0x266
MIPS16
IMAGE_FILE_MACHINE_MIPSFPU
0x366
MIPS FPU-val
IMAGE_FILE_MACHINE_MIPSFPU16
0x466
MIPS16 FPU-val
IMAGE_FILE_MACHINE_POWERPC
0x1f0
Power PC kis endian
IMAGE_FILE_MACHINE_POWERPCFP
0x1f1
Power PC lebegőpontos támogatással
IMAGE_FILE_MACHINE_R3000BE
0x160
MIPS I-kompatibilis 32 bites big endian
IMAGE_FILE_MACHINE_R3000
0x162
MIPS I kompatibilis 32 bites kis endian
IMAGE_FILE_MACHINE_R4000
0x166
MIPS III kompatibilis 64 bites kis endian
IMAGE_FILE_MACHINE_R10000
0x168
MIPS IV kompatibilis 64 bites kis endian
IMAGE_FILE_MACHINE_RISCV32
0x5032
RISC-V 32 bites címtér
IMAGE_FILE_MACHINE_RISCV64
0x5064
RISC-V 64 bites címtér
IMAGE_FILE_MACHINE_RISCV128
0x5128
RISC-V 128 bites címtér
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
Hüvelykujj
IMAGE_FILE_MACHINE_WCEMIPSV2
0x169
MIPS kis endian WCE v2

Jellemzők

A Jellemzők mező az objektum vagy a képfájl attribútumait jelző jelzőket tartalmaz. Jelenleg a következő jelzők vannak definiálva:

Zászló Érték Leírás
IMAGE_FILE_RELOCS_STRIPPED
0x0001
Csak a rendszerkép, a Windows CE és a Microsoft Windows NT és újabb verziók. Ez azt jelzi, hogy a fájl nem tartalmaz alapáthelyezéseket, ezért az elsődleges alapcímre kell betölteni. Ha az alapcím nem érhető el, a betöltő hibát jelez. A linker alapértelmezett viselkedése az, hogy eltávolítja az alapáthelyezéseket a végrehajtható (EXE) fájlokból.
IMAGE_FILE_EXECUTABLE_IMAGE
0x0002
Csak kép. Ez azt jelzi, hogy a képfájl érvényes és futtatható. Ha ez a jelző nincs beállítva, hivatkozási hibát jelez.
IMAGE_FILE_LINE_NUMS_STRIPPED
0x0004
A COFF-sorok száma el lett távolítva. Ez a jelző elavult, és nullának kell lennie.
IMAGE_FILE_LOCAL_SYMS_STRIPPED
0x0008
A COFF szimbólumtábla bejegyzései el lettek távolítva a helyi szimbólumokhoz. Ez a jelző elavult, és nullának kell lennie.
IMAGE_FILE_AGGRESSIVE_WS_TRIM
0x0010
Elavult. A munkakészlet agresszív vágása. Ez a jelző elavult a Windows 2000 és újabb verziókban, és nullának kell lennie.
IMAGE_FILE_LARGE_ADDRESS_AWARE
0x0020
Az alkalmazás 2 GB-os címeket képes kezelni > .
0x0040
Ez a jelző jövőbeli használatra van fenntartva.
IMAGE_FILE_BYTES_REVERSED_LO
0x0080
Kis endian: a legkisebb jelentős bit (LSB) megelőzi a memória legjelentősebb bitét (MSB). Ez a jelző elavult, és nullának kell lennie.
IMAGE_FILE_32BIT_MACHINE
0x0100
A gép egy 32 bites szavas architektúrán alapul.
IMAGE_FILE_DEBUG_STRIPPED
0x0200
A hibakeresési információk törlődnek a képfájlból.
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
0x0400
Ha a kép cserélhető adathordozón van, töltse be teljesen, és másolja a felcserélési fájlba.
IMAGE_FILE_NET_RUN_FROM_SWAP
0x0800
Ha a rendszerkép hálózati adathordozón van, töltse be teljesen, és másolja a felcserélési fájlba.
IMAGE_FILE_SYSTEM
0x1000
A képfájl egy rendszerfájl, nem pedig egy felhasználói program.
IMAGE_FILE_DLL
0x2000
A képfájl egy dinamikus csatolású kódtár (DLL). Az ilyen fájlok szinte minden célra végrehajtható fájloknak minősülnek, bár közvetlenül nem futtathatók.
IMAGE_FILE_UP_SYSTEM_ONLY
0x4000
A fájlt csak egyprocesszoros gépen szabad futtatni.
IMAGE_FILE_BYTES_REVERSED_HI
0x8000
Big endian: az MSB megelőzi az LSB-t a memóriában. Ez a jelző elavult, és nullának kell lennie.

Nem kötelező fejléc (csak kép)

Minden képfájlhoz tartozik egy nem kötelező fejléc, amely információkat biztosít a betöltő számára. Ez a fejléc nem kötelező abban az értelemben, hogy egyes fájlok (pontosabban az objektumfájlok) nem rendelkeznek vele. Képfájlok esetén ez a fejléc szükséges. Az objektumfájlok tartalmazhatnak nem kötelező fejlécet, de általában ennek az élőfejnek nincs függvénye egy objektumfájlban, csak a méret növeléséhez.

Vegye figyelembe, hogy az opcionális fejléc mérete nincs javítva. A COFF fejlécBen található SizeOfOptionalHeader mezőt kell használni annak ellenőrzéséhez, hogy egy adott adatkönyvtárban lévő mintavétel nem lép-e túl a SizeOfOptionalHeaderen. További információ: COFF-fájlfejléc (objektum és kép).

Az opcionális fejléc NumberOfRvaAndSizes mezőjét is használni kell annak biztosítására, hogy egy adott adatkönyvtár-bejegyzés mintavételezése ne lépje túl az opcionális fejlécet. Emellett fontos ellenőrizni az opcionális fejlécvarázslás számát a formátumkompatibilitás érdekében.

Az opcionális fejlécvarázslási szám határozza meg, hogy egy kép PE32 vagy PE32+ végrehajtható-e.

Varázsszám PE formátum
0x10b
PE32
0x20b
PE32+

A PE32+ képek 64 bites címteret engedélyeznek, a képméretet pedig 2 gigabájtra korlátozzák. Az egyéb PE32+ módosításokat a megfelelő szakaszokban tárgyaljuk.

Maga az opcionális fejléc három fő részből áll.

Eltolás (PE32/PE32+) Méret (PE32/PE32+) Fejlécrész Leírás
0
28/24
Standard mezők
A COFF minden implementációjára definiált mezők, beleértve a UNIX-ot is.
28/24
68/88
Windows-specifikus mezők
További mezők a Windows adott funkcióinak (például alrendszereknek) támogatásához.
96/112
Változó
Adatkönyvtárak
A képfájlban található és az operációs rendszer által használt speciális táblák cím- és méretpárjai (például az importálási tábla és az exportálási tábla).

Nem kötelező fejléc szabványos mezői (csak kép)

Az opcionális fejléc első nyolc mezője szabványos mezők, amelyek a COFF minden implementációjára vannak definiálva. Ezek a mezők olyan általános információkat tartalmaznak, amelyek a végrehajtható fájlok betöltéséhez és futtatásához hasznosak. A PE32+ formátum esetében nem változnak.

Kiegyenlít Méret Terület Leírás
0
2
Mágia
A képfájl állapotát azonosító aláíratlan egész szám. A leggyakoribb szám a 0x10B, amely normál végrehajtható fájlként azonosítja. 0x107 ROM-rendszerképként azonosítja, és 0x20B PE32+ végrehajthatóként azonosítja.
2
1
MajorLinkerVersion
A linker főverziószáma.
3
1
MinorLinkerVersion
A linker alverziószáma.
4
4
SizeOfCode
A kódszakasz (szöveg) mérete vagy az összes kódszakasz összege, ha több szakasz is van.
8
4
SizeOfInitializedData
Az inicializált adatszakasz mérete vagy az összes ilyen szakasz összege, ha több adatszakasz van.
12
4
SizeOfUninitializedData
A nem inicializált adatszakasz (BSS) mérete vagy az összes ilyen szakasz összege, ha több BSS-szakasz van.
16
4
AddressOfEntryPoint
A belépési pont címe a képbázishoz képest, amikor a végrehajtható fájl betöltődik a memóriába. Programképek esetén ez a kezdőcím. Az eszközillesztők esetében ez az inicializálási függvény címe. A DLL-k esetében nem kötelező belépési pont. Ha nincs belépési pont, ennek a mezőnek nullának kell lennie.
20
4
BaseOfCode
A kód elejének szakasz képbázisához viszonyított cím, amikor betölti a memóriába.

A PE32 tartalmazza ezt a további mezőt, amely hiányzik a PE32+-ban, a BaseOfCode után.

Kiegyenlít Méret Terület Leírás
24
4
BaseOfData
Az adatok elejének szakasz képbázisához viszonyított cím, amikor betöltődik a memóriába.

Nem kötelező fejléc Windows-Specific mezők (csak kép)

A következő 21 mező a COFF opcionális fejlécformátumának kiterjesztése. Ezek további információkat tartalmaznak, amelyeket a linker és a betöltő igényel a Windowsban.

Eltolás (PE32/ PE32+) Méret (PE32/ PE32+) Terület Leírás
28/24
4/8
ImageBase
A rendszerkép első bájtjának elsődleges címe a memóriába való betöltésekor; 64 K többszörösének kell lennie. A DLL-ek alapértelmezett értéke 0x10000000. A Windows CE EXES alapértelmezett értéke 0x00010000. A Windows NT, a Windows 2000, a Windows XP, a Windows 95, a Windows 98 és a Windows Me alapértelmezett 0x00400000.
32/32
4
SectionAlignment
A szakaszok igazítása (bájtban) a memóriába való betöltésekor. A Fájlalignment értéknél nagyobbnak vagy egyenlőnek kell lennie. Az alapértelmezett érték az architektúra oldalmérete.
36/36
4
FileAlignment
A képfájlban lévő szakaszok nyers adatainak igazításához használt igazítási tényező (bájtban kifejezve). Az értéknek 2,512 és 64 K közötti hatványnak kell lennie, beleértve a 64 K értéket is. Az alapértelmezett érték 512. Ha a SectionAlignment kisebb, mint az architektúra oldalmérete, akkor a FileAlignmentnek meg kell egyeznie a SectionAlignment fájllal.
40/40
2
MajorOperatingSystemVersion
A szükséges operációs rendszer főverziószáma.
42/42
2
MinorOperatingSystemVersion
A szükséges operációs rendszer alverziószáma.
44/44
2
MajorImageVersion
A kép főverziószáma.
46/46
2
MinorImageVersion
A kép alverziószáma.
48/48
2
MajorSubsystemVersion
Az alrendszer főverziószáma.
50/50
2
MinorSubsystemVersion
Az alrendszer alverziószáma.
52/52
4
Win32VersionValue
Fenntartott, nullának kell lennie.
56/56
4
SizeOfImage
A kép mérete (bájtban), beleértve az összes fejlécet is, mivel a rendszerkép betöltődik a memóriába. A SectionAlignment többszörösének kell lennie.
60/60
4
SizeOfHeaders
A MS-DOS csonkok, PE-fejlécek és szakaszfejlécek együttes mérete a FileAlignment többszörösére kerekítve.
64/64
4
Ellenőrzőösszeg
A képfájl ellenőrzőösszege. Az ellenőrzőösszeg számítási algoritmusa be van építve a IMAGHELP.DLL. A rendszer a következő ellenőrzéseket ellenőrzi a betöltési időpontban: az összes illesztőprogramot, a rendszerindításkor betöltött DLL-t és a kritikus Windows-folyamatba betöltött DLL-eket.
68/68
2
Alrendszer
A rendszerkép futtatásához szükséges alrendszer. További információ: Windows-alrendszer.
70/70
2
DllCharacteristics
További információ: DLL-jellemzők a specifikáció későbbi részében.
72/72
4/8
SizeOfStackReserve
A lefoglalni kívánt verem mérete. Csak a SizeOfStackCommit van véglegesített; a többi lap egyszerre egy oldalon érhető el, amíg el nem éri a tartalék méretét.
76/80
4/8
SizeOfStackCommit
A véglegesíteni kívánt verem mérete.
80/88
4/8
SizeOfHeapReserve
A lefoglalni kívánt helyi halomterület mérete. Csak a SizeOfHeapCommit van véglegesített; a többi lap egyszerre egy oldalon érhető el, amíg el nem éri a tartalék méretét.
84/96
4/8
SizeOfHeapCommit
A véglegesítendő helyi halomterület mérete.
88/104
4
LoaderFlags
Fenntartott, nullának kell lennie.
92/108
4
NumberOfRvaAndSizes
Az opcionális fejléc fennmaradó részében lévő adatkönyvtár-bejegyzések száma. Mindegyik egy helyet és méretet ír le.
Windows-alrendszer

Az opcionális fejléc Alrendszer mezőjéhez definiált alábbi értékek határozzák meg, hogy melyik Windows-alrendszer (ha van ilyen) szükséges a rendszerkép futtatásához.

Állandó Érték Leírás
IMAGE_SUBSYSTEM_UNKNOWN
0
Ismeretlen alrendszer
IMAGE_SUBSYSTEM_NATIVE
1
Eszközillesztők és natív Windows-folyamatok
IMAGE_SUBSYSTEM_WINDOWS_GUI
2
A Windows grafikus felhasználói felület (GUI) alrendszere
IMAGE_SUBSYSTEM_WINDOWS_CUI
3
A Windows karakteralrendszere
IMAGE_SUBSYSTEM_OS2_CUI
5
Az OS/2 karakteralrendszer
IMAGE_SUBSYSTEM_POSIX_CUI
7
A Posix karakteralrendszer
IMAGE_SUBSYSTEM_NATIVE_WINDOWS
8
Natív Win9x-illesztőprogram
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
9
Windows CE
IMAGE_SUBSYSTEM_EFI_APPLICATION
10
Bővíthető belső vezérlőprogram-interfész (EFI) alkalmazás
IMAGE_SUBSYSTEM_EFI_BOOT_ SERVICE_DRIVER
11
EFI-illesztőprogram rendszerindítási szolgáltatásokkal
IMAGE_SUBSYSTEM_EFI_RUNTIME_ ILLESZTŐPROGRAM
12
EFI-illesztőprogram futásidejű szolgáltatásokkal
IMAGE_SUBSYSTEM_EFI_ROM
13
EFI ROM-rendszerkép
IMAGE_SUBSYSTEM_XBOX
14
XBOX
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION
16
Windows rendszerindító alkalmazás.
DLL-jellemzők

Az opcionális fejléc DllCharacteristics mezőjéhez a következő értékek vannak definiálva.

Állandó Érték Leírás
0x0001
Fenntartott, nullának kell lennie.
0x0002
Fenntartott, nullának kell lennie.
0x0004
Fenntartott, nullának kell lennie.
0x0008
Fenntartott, nullának kell lennie.
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA
0x0020
A kép képes kezelni a nagy entrópia 64 bites virtuális címterét.
IMAGE_DLLCHARACTERISTICS_
DYNAMIC_BASE
0x0040
A DLL áthelyezhető a betöltési időben.
IMAGE_DLLCHARACTERISTICS_
FORCE_INTEGRITY
0x0080
A kódintegritási ellenőrzések kényszerítve vannak.
IMAGE_DLLCHARACTERISTICS_
NX_COMPAT
0x0100
A kép NX-kompatibilis.
IMAGE_DLLCHARACTERISTICS_ NO_ISOLATION
0x0200
Az elkülönítés tudatában van, de ne különítse el a képet.
IMAGE_DLLCHARACTERISTICS_ NO_SEH
0x0400
Nem használ strukturált kivételkezelést (SE). Ezen a képen nem lehet SE-kezelőt hívni.
IMAGE_DLLCHARACTERISTICS_ NO_BIND
0x0800
Ne kösse össze a képet.
IMAGE_DLLCHARACTERISTICS_APPCONTAINER
0x1000
A rendszerképnek egy AppContainerben kell futnia.
IMAGE_DLLCHARACTERISTICS_ WDM_DRIVER
0x2000
WDM-illesztő.
IMAGE_DLLCHARACTERISTICS_GUARD_CF
0x4000
A rendszerkép támogatja a Control Flow Guardot.
IMAGE_DLLCHARACTERISTICS_ TERMINAL_SERVER_AWARE
0x8000
A terminálkiszolgáló tisztában van vele.

Nem kötelező fejlécadat-könyvtárak (csak kép)

Minden adatkönyvtár megadja a Windows által használt tábla vagy sztring címét és méretét. Ezek az adatkönyvtár-bejegyzések mind betöltődnek a memóriába, hogy a rendszer futásidőben használhassa őket. Az adatkönyvtár egy 8 bájtos mező, amely a következő deklarációval rendelkezik:

typedef struct _IMAGE_DATA_DIRECTORY {
    DWORD   VirtualAddress;
    DWORD   Size;
} IMAGE_DATA_DIRECTORY, *PIMAGE_DATA_DIRECTORY;

Az első mező, a VirtualAddress valójában a tábla RVA-jának számít. Az RVA a tábla címe a rendszerkép alapcíméhez viszonyítva a táblázat betöltésekor. A második mező bájtban adja meg a méretet. Az opcionális fejléc utolsó részét képező adatkönyvtárak az alábbi táblázatban találhatók.

Vegye figyelembe, hogy a könyvtárak száma nincs rögzítve. Mielőtt egy adott könyvtárat keres, ellenőrizze a NumberOfRvaAndSizes mezőt az opcionális fejlécben.

Ne feltételezze azt sem, hogy a táblázatban szereplő RVA-k egy szakasz elejére mutatnak, vagy hogy az adott táblákat tartalmazó szakaszoknak konkrét neveik vannak.

Eltolás (PE/PE32+) Méret Terület Leírás
96/112
8
Táblázat exportálása
Az exportálási tábla címe és mérete. További információ: .edata section (Csak kép).
104/120
8
Tábla importálása
Az importálási tábla címe és mérete. További információ: The .idata section.
112/128
8
Erőforrástábla
Az erőforrástábla címe és mérete. További információ: The .rsrc Section.
120/136
8
Kivételtábla
A kivételtábla címe és mérete. További információ: The .pdata section.
128/144
8
Tanúsítványtábla
Az attribútumtanúsítvány táblacíme és mérete. További információ: Az attribútumtanúsítvány táblája (csak kép).
136/152
8
Alapáthelyezés táblázat
Az alapáthelyezés táblacíme és mérete. További információ: .reloc section (Csak kép).
144/160
8
Debug
A hibakeresési adatok kezdőcíme és mérete. További információ: A .debug szakasz.
152/168
8
Építészet
Fenntartott, 0-nak kell lennie
160/176
8
Globális Ptr
A globális mutatóregisztrálásban tárolandó érték RVA-értéke. Ennek a struktúrának a méretét nullára kell állítani.
168/184
8
TLS-tábla
A szál helyi tárolójának (TLS) táblacíme és mérete. További információ: The .tls section.
176/192
8
Konfigurációs tábla betöltése
A terheléskonfigurációs tábla címe és mérete. További információt a Terheléskonfigurációs struktúra (csak kép) című témakörben talál.
184/200
8
Kötött importálás
A kötött importálási tábla címe és mérete.
192/208
8
IAT
Az importálási címtábla címe és mérete. További információ: Címtábla importálása.
200/216
8
Importálási leíró késleltetése
A késleltetett importálás leírójának címe és mérete. További információ: Delay-Load Táblák importálása (csak kép).
208/224
8
CLR futtatókörnyezet fejléce
A CLR futtatókörnyezet fejlécének címe és mérete. További információ: The .cormeta section (Only Object).
216/232
8
Fenntartott, nullának kell lennie

A Tanúsítványtábla bejegyzés egy attribútumtanúsítvány-táblára mutat. Ezek a tanúsítványok nem töltődnek be a memóriába a rendszerkép részeként. Ennek a bejegyzésnek az első mezője, amely általában RVA, inkább egy fájlmutató.

Szakasztábla (Szakaszfejlécek)

A szakasztábla minden sora tulajdonképpen egy szakaszfejléc. Ez a táblázat azonnal követi az opcionális fejlécet, ha van ilyen. Ez a helymeghatározás azért szükséges, mert a fájlfejléc nem tartalmaz közvetlen mutatót a szakasztáblához. Ehelyett a szakasztábla helyét a fejlécek utáni első bájt helyének kiszámításával határozzuk meg. Ügyeljen arra, hogy a fájlfejlécben megadott méretet használja az opcionális fejlécnek.

A szakasztábla bejegyzéseinek számát a fájlfejléc NumberOfSections mezője adja meg. A szakasztábla bejegyzései egy (1) számmal kezdődnek. A kód és az adatmemória szakasz bejegyzései a hivatkozás által kiválasztott sorrendben vannak.

Egy képfájlban a szakaszok VA-ját a hivatkozásnak kell hozzárendelnie, hogy növekvő sorrendben és szomszédosak legyenek, és az opcionális fejlécben a SectionAlignment érték többszörösének kell lenniük.

Minden szakaszfejléc (szakasztábla-bejegyzés) a következő formátumú, bejegyzésenként összesen 40 bájt.

Kiegyenlít Méret Terület Leírás
0
8
Név
Egy 8 bájtos, null-padded UTF-8 kódolású sztring. Ha a sztring pontosan 8 karakter hosszú, nincs null értékű végződés. Hosszabb nevek esetén ez a mező egy perjelet (/) tartalmaz, amelyet egy tizedes tört ASCII-ábrázolása követ, amely eltolás a sztringtáblába. A végrehajtható képek nem használnak sztringtáblát, és nem támogatják a 8 karakternél hosszabb szakaszneveket. Az objektumfájlok hosszú nevei csonkulnak, ha végrehajtható fájlba kerülnek.
8
4
VirtualSize
A szakasz teljes mérete a memóriába való betöltésekor. Ha ez az érték nagyobb, mint a SizeOfRawData, a szakasz nulla párnázott. Ez a mező csak végrehajtható képekre érvényes, és az objektumfájlok esetében nullára kell állítani.
12
4
VirtualAddress
Végrehajtható képek esetén a szakasz első bájtjának címe a képbázishoz viszonyítva, amikor a szakasz betöltődik a memóriába. Objektumfájlok esetén ez a mező az áthelyezés alkalmazása előtt az első bájt címe; az egyszerűség kedvéért a fordítóknak nullára kell állítaniuk. Ellenkező esetben ez egy tetszőleges érték, amely az áthelyezés során kivonódik az eltolásokból.
16
4
SizeOfRawData
A szakasz mérete (objektumfájlok esetén) vagy az inicializált adatok mérete a lemezen (képfájlok esetén). Végrehajtható képek esetén ennek a FileAlignment többszörösének kell lennie az opcionális fejlécből. Ha ez kisebb, mint a VirtualSize, a szakasz többi része nulla kitöltésű. Mivel a SizeOfRawData mező kerekítve van, de a VirtualSize mező nem, a SizeOfRawData is nagyobb lehet, mint a VirtualSize. Ha egy szakasz csak nem inicializált adatokat tartalmaz, ennek a mezőnek nullának kell lennie.
20
4
PointerToRawData
A fájlmutató a COFF-fájlon belüli szakasz első oldalára mutat. Végrehajtható képek esetén ennek a FileAlignment többszörösének kell lennie az opcionális fejlécből. Objektumfájlok esetén az értéket egy 4 bájtos határvonalon kell igazítani a legjobb teljesítmény érdekében. Ha egy szakasz csak nem inicializált adatokat tartalmaz, ennek a mezőnek nullának kell lennie.
24
4
PointerToRelocations
A fájlmutató a szakasz áthelyezési bejegyzéseinek elejére mutat. Ez a beállítás a végrehajtható rendszerképek esetében nullára van állítva, vagy ha nincsenek áthelyezések.
28
4
PointerToLinenumbers
A fájlmutató a szakasz sorszám bejegyzéseinek elejére mutat. Ez nulla értékre van állítva, ha nincs COFF-sorszám. Ennek az értéknek nullának kell lennie egy kép esetében, mert a COFF hibakeresési információ elavult.
32
2
NumberOfRelocations
A szakasz áthelyezési bejegyzéseinek száma. Ez a végrehajtható képek esetében nulla értékre van állítva.
34
2
NumberOfLinenumbers
A szakasz sorszám bejegyzéseinek száma. Ennek az értéknek nullának kell lennie egy kép esetében, mert a COFF hibakeresési információ elavult.
36
4
Jellemzők
A szakasz jellemzőit leíró jelzők. További információ: Szakaszjelzők.

 

Szakaszjelzők

A szakaszfejléc Tulajdonságok mezőjében lévő szakaszjelzők a szakasz jellemzőit jelzik.

Zászló Érték Leírás
0x00000000
Jövőbeli használatra fenntartva.
0x00000001
Jövőbeli használatra fenntartva.
0x00000002
Jövőbeli használatra fenntartva.
0x00000004
Jövőbeli használatra fenntartva.
IMAGE_SCN_TYPE_NO_PAD
0x00000008
A szakaszt nem szabad a következő határhoz kipárnázni. Ez a jelző elavult, és IMAGE_SCN_ALIGN_1BYTES váltja fel. Ez csak objektumfájlokra érvényes.
0x00000010
Jövőbeli használatra fenntartva.
IMAGE_SCN_CNT_CODE
0x00000020
A szakasz végrehajtható kódot tartalmaz.
IMAGE_SCN_CNT_INITIALIZED_DATA
0x00000040
A szakasz inicializált adatokat tartalmaz.
IMAGE_SCN_CNT_UNINITIALIZED_ ADATOK
0x00000080
A szakasz nem inicializált adatokat tartalmaz.
IMAGE_SCN_LNK_OTHER
0x00000100
Jövőbeli használatra fenntartva.
IMAGE_SCN_LNK_INFO
0x00000200
A szakasz megjegyzéseket vagy egyéb információkat tartalmaz. A .drectve szakasz ilyen típusú. Ez csak objektumfájlokra érvényes.
0x00000400
Jövőbeli használatra fenntartva.
IMAGE_SCN_LNK_REMOVE
0x00000800
A szakasz nem lesz a kép része. Ez csak objektumfájlokra érvényes.
IMAGE_SCN_LNK_COMDAT
0x00001000
A szakasz COMDAT-adatokat tartalmaz. További információ: COMDAT-szakaszok (csak objektum). Ez csak objektumfájlokra érvényes.
IMAGE_SCN_GPREL
0x00008000
A szakasz a globális mutatón (GP) keresztül hivatkozott adatokat tartalmazza.
IMAGE_SCN_MEM_PURGEABLE
0x00020000
Jövőbeli használatra fenntartva.
IMAGE_SCN_MEM_16BIT
0x00020000
Jövőbeli használatra fenntartva.
IMAGE_SCN_MEM_LOCKED
0x00040000
Jövőbeli használatra fenntartva.
IMAGE_SCN_MEM_PRELOAD
0x00080000
Jövőbeli használatra fenntartva.
IMAGE_SCN_ALIGN_1BYTES
0x00100000
1 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_2BYTES
0x00200000
2 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_4BYTES
0x00300000
4 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_8BYTES
0x00400000
8 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_16BYTES
0x00500000
16 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_32BYTES
0x00600000
32 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_64BYTES
0x00700000
64 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_128BYTES
0x00800000
128 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_256BYTES
0x00900000
256 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_512BYTES
0x00A00000
512 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_1024BYTES
0x00B00000
1024 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_2048BYTES
0x00C00000
Adatok igazítása egy 2048 bájtos határhoz. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_4096BYTES
0x00D00000
4096 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_ALIGN_8192BYTES
0x00E00000
8192 bájtos határvonalon lévő adatok igazítása. Csak objektumfájlokra érvényes.
IMAGE_SCN_LNK_NRELOC_OVFL
0x01000000
A szakasz kiterjesztett áthelyezéseket tartalmaz.
IMAGE_SCN_MEM_DISCARDABLE
0x02000000
A szakasz szükség szerint elvethető.
IMAGE_SCN_MEM_NOT_CACHED
0x04000000
A szakasz nem gyorsítótárazható.
IMAGE_SCN_MEM_NOT_PAGED
0x08000000
A szakasz nem lapozható.
IMAGE_SCN_MEM_SHARED
0x10000000
A szakasz megosztható a memóriában.
IMAGE_SCN_MEM_EXECUTE
0x20000000
A szakasz kódként végrehajtható.
IMAGE_SCN_MEM_READ
0x40000000
A szakasz olvasható.
IMAGE_SCN_MEM_WRITE
0x80000000
A szakaszt meg lehet írni.

 

IMAGE_SCN_LNK_NRELOC_OVFL azt jelzi, hogy a szakasz áthelyezéseinek száma meghaladja a szakasz fejlécében a számára fenntartott 16 bitet. Ha a bit be van állítva, és a szakaszfejléc NumberOfRelocations mezője 0xffff, a tényleges áthelyezések száma az első áthelyezés 32 bites VirtualAddress mezőjében lesz tárolva. Hiba, ha IMAGE_SCN_LNK_NRELOC_OVFL van beállítva, és a szakaszban kevesebb, mint 0xffff áthelyezés van.

Csoportosított szakaszok (csak objektum)

A "$" karakter (dollárjel) speciális értelmezést ad az objektumfájlok szakaszneveiben.

Az objektumszakasz tartalmát tartalmazó képszakasz meghatározásakor a csatoló elveti a "$" karaktert és az azt követő összes karaktert. Így egy objektumszakasz neve . A text$X ténylegesen hozzájárul a kép .text szakaszához.

A "$" karaktert követő karakterek azonban meghatározzák a képszakaszhoz tartozó hozzájárulások sorrendjét. Az azonos objektumszakasznévvel rendelkező összes hozzájárulást a rendszer egybefüggően foglalja le a képen, a hozzájárulások blokkjait pedig lexikális sorrendbe rendezi az objektumszakasz neve szerint. Ezért a .text$X szakasznévvel rendelkező objektumfájlokban a .text$W közreműködések és a .text$Y közreműködések után minden együtt lesz.

A képfájl szakaszneve soha nem tartalmaz "$" karaktert.

A fájl egyéb tartalma

Az eddig leírt adatstruktúrák a választható fejlécet is beleértve rögzített eltolásban találhatók a fájl elejétől (vagy a PE fejléctől, ha a fájl egy MS-DOS csonkot tartalmazó kép).

A COFF-objektum vagy képfájl fennmaradó része olyan adatblokkokat tartalmaz, amelyek nem feltétlenül egy adott fájleltolásnál vannak. Ehelyett a helyeket az opcionális fejléc vagy szakaszfejléc mutatói határozzák meg.

Kivételt képeznek az architektúra oldalméreténél kisebb SectionAlignment értékkel rendelkező képek (Intel x86 és MIPS esetén 4 K, Itanium esetén 8 K). A SectionAlignment leírását lásd: Opcionális fejléc (csak kép). Ebben az esetben a szakaszadatok fájleltolásának korlátozásai vannak az 5.1. Egy másik kivétel az, hogy az attribútumtanúsítványt és a hibakeresési információkat egy képfájl végén kell elhelyezni, az attribútumtanúsítvány táblázatával közvetlenül a hibakeresési szakasz előtt, mert a betöltő nem képezi le ezeket a memóriába. Az attribútumtanúsítványra és a hibakeresési információkra vonatkozó szabály azonban nem vonatkozik az objektumfájlokra.

Szakaszadatok

A szakasz inicializált adatai egyszerű bájtblokkokból állnak. Az összes nullát tartalmazó szakaszok esetében azonban a szakaszadatokat nem kell belefoglalni.

Az egyes szakaszok adatai a szakaszfejléc PointerToRawData mezőjében megadott fájleltoláson találhatók. A fájlban lévő adatok méretét a SizeOfRawData mező jelzi. Ha a SizeOfRawData kisebb, mint a VirtualSize, a fennmaradó rész nullákkal van kipárnázva.

Egy képfájlban a szakaszadatokat az opcionális fejléc FileAlignment mezőjében megadott határvonalhoz kell igazítani. A szakaszadatoknak a megfelelő szakaszok RVA-értékeinek sorrendjében kell megjelennie (ahogyan a szakasztábla egyes szakaszfejlécei is).

A képfájlokra további korlátozások vonatkoznak, ha az opcionális fejléc SectionAlignment értéke kisebb, mint az architektúra oldalmérete. Ilyen fájlok esetén a fájlban a szakaszadatok helyének meg kell egyeznie a memóriabeli helyével a kép betöltésekor, hogy a szakaszadatok fizikai eltolása megegyezik az RVA-val.

COFF-áthelyezések (csak objektum)

Az objektumfájlok COFF-áthelyezéseket tartalmaznak, amelyek meghatározzák, hogyan kell módosítani a szakaszadatokat, amikor a képfájlba helyezik, majd betöltik a memóriába.

A képfájlok nem tartalmaznak COFF-áthelyezéseket, mert az összes hivatkozott szimbólum már ki van rendelve címekhez egy lapos címtérben. A rendszerkép a .reloc szakaszban lévő alapáthelyezések formájában tartalmaz áthelyezési információkat (kivéve, ha a kép IMAGE_FILE_RELOCS_STRIPPED attribútummal rendelkezik). További információ: .reloc section (Csak kép).

Egy objektumfájl minden szakaszában rögzített hosszúságú rekordok tömbje tartalmazza a szakasz COFF-áthelyezéseit. A tömb pozícióját és hosszát a szakaszfejléc határozza meg. A tömb minden eleme a következő formátummal rendelkezik.

Kiegyenlít Méret Terület Leírás
0
4
VirtualAddress
Annak az elemnek a címe, amelyre az áthelyezést alkalmazza. Ez a szakasz elejéről származó eltolás, valamint a szakasz RVA/Eltolás mezőjének értéke. Lásd : Szakasztábla (Szakaszfejlécek). Ha például a szakasz első bájtja 0x10 címmel rendelkezik, a harmadik bájt címe 0x12.
4
4
SymbolTableIndex
Nulla alapú index a szimbólumtáblában. Ez a szimbólum az áthelyezéshez használandó címet adja meg. Ha a megadott szimbólum szakasztároló osztálysal rendelkezik, akkor a szimbólum címe az azonos nevű első szakaszt tartalmazó cím.
8
2
Típus
A végrehajtandó áthelyezés típusát jelző érték. Az érvényes áthelyezési típusok a gép típusától függenek. Lásd : Típusjelzők.

 

Ha a SymbolTableIndex mező által hivatkozott szimbólum IMAGE_SYM_CLASS_SECTION tárolási osztálysal rendelkezik, a szimbólum címe a szakasz kezdete. A szakasz általában ugyanabban a fájlban található, kivéve, ha az objektumfájl egy archívum (tár) része. Ebben az esetben a szakasz az archívum bármely olyan objektumfájljában található, amelynek az archív tag neve megegyezik az aktuális objektumfájl nevével. (Az archivált tag nevével való kapcsolatot az importálási táblák, vagyis az .idata szakasz összekapcsolásakor használjuk.)

Típusjelzők

Az áthelyezési rekord Típus mezőjében látható, hogy milyen típusú áthelyezést kell végrehajtani. Az egyes géptípusokhoz különböző áthelyezési típusok vannak definiálva.

x64 processzorok

Az x64-es és a kompatibilis processzorokhoz az alábbi áthelyezési típusjelzők vannak definiálva.

Állandó Érték Leírás
IMAGE_REL_AMD64_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_AMD64_ADDR64
0x0001
Az áthelyezési cél 64 bites VA-ja.
IMAGE_REL_AMD64_ADDR32
0x0002
Az áthelyezési cél 32 bites VA-ja.
IMAGE_REL_AMD64_ADDR32NB
0x0003
A 32 bites cím képbázis (RVA) nélkül.
IMAGE_REL_AMD64_REL32
0x0004
A 32 bites relatív cím az áthelyezést követő bájtból.
IMAGE_REL_AMD64_REL32_1
0x0005
A 32 bites cím az áthelyezéstől való 1 bájt távolsághoz viszonyítva.
IMAGE_REL_AMD64_REL32_2
0x0006
A 32 bites cím a 2 bájt távolsághoz képest az áthelyezéstől.
IMAGE_REL_AMD64_REL32_3
0x0007
A 32 bites cím a 3 bájt távolsághoz képest az áthelyezéstől.
IMAGE_REL_AMD64_REL32_4
0x0008
A 32 bites cím a 4 bájt távolsághoz képest az áthelyezéstől.
IMAGE_REL_AMD64_REL32_5
0x0009
A 32 bites cím az áthelyezéstől való 5 bájt távolsághoz viszonyítva.
IMAGE_REL_AMD64_SECTION
0x000A
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_AMD64_SECREL
0x000B
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_AMD64_SECREL7
0x000C
7 bites, alá nem írt eltolás a célt tartalmazó szakasz aljáról.
IMAGE_REL_AMD64_TOKEN
0x000D
CLR-jogkivonatok.
IMAGE_REL_AMD64_SREL32
0x000E
Az objektumba kibocsátott 32 bites aláírt span-dependens érték.
IMAGE_REL_AMD64_PAIR
0x000F
Egy pár, amelyeknek azonnal követnie kell minden span-függő értéket.
IMAGE_REL_AMD64_SSPAN32
0x0010
Egy 32 bites aláírt span-dependens érték, amelyet a kapcsolat időpontjában alkalmazunk.

 

ARM-processzorok

Az ARM-processzorok esetében az alábbi áthelyezési típusjelzők vannak definiálva.

Állandó Érték Leírás
IMAGE_REL_ARM_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_ARM_ADDR32
0x0001
A cél 32 bites VA-ja.
IMAGE_REL_ARM_ADDR32NB
0x0002
A cél 32 bites RVA-ja.
IMAGE_REL_ARM_BRANCH24
0x0003
A célhoz viszonyított 24 bites relatív elmozdulás.
IMAGE_REL_ARM_BRANCH11
0x0004
Alroutine-hívásra való hivatkozás. A hivatkozás két 16 bites utasításból áll, 11 bites eltolásokkal.
IMAGE_REL_ARM_REL32
0x000A
A 32 bites relatív cím az áthelyezést követő bájtból.
IMAGE_REL_ARM_SECTION
0x000E
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_ARM_SECREL
0x000F
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_ARM_MOV32
0x0010
A cél 32 bites VA-ja. Ezt az áthelyezést az alacsony 16 bites MOVW utasítással, a magas 16 bithez pedig egy MOVT-tal alkalmazza a rendszer.
IMAGE_REL_THUMB_MOV32
0x0011
A cél 32 bites VA-ja. Ezt az áthelyezést az alacsony 16 bites MOVW utasítással, a magas 16 bithez pedig egy MOVT-tal alkalmazza a rendszer.
IMAGE_REL_THUMB_BRANCH20
0x0012
Az utasítás rögzítette a 21 bites relatív elmozdulást a 2 bájtos igazított célhoz. Az elmozdulás legkisebb jelentős része mindig nulla, és nincs tárolva. Ez az áthelyezés egy Thumb-2 32 bites feltételes B utasításnak felel meg.
Használatlan
0x0013
IMAGE_REL_THUMB_BRANCH24
0x0014
Az utasítás rögzítette a 25 bites relatív elmozdulást a 2 bájtos igazított célhoz. Az elmozdulás legkisebb jelentős része nulla, és nincs tárolva. Ez az áthelyezés egy Thumb-2 B utasításnak felel meg.
IMAGE_REL_THUMB_BLX23
0x0015
Az utasítás rögzítette a 25 bites relatív elmozdulást a 4 bájtos igazított célhoz. Az eltolódás alacsony 2 bitje nulla, és nincs tárolva.
Ez az áthelyezés egy Thumb-2 BLX utasításnak felel meg.
IMAGE_REL_ARM_PAIR
0x0016
Az áthelyezés csak akkor érvényes, ha azonnal követ egy ARM_REFHI vagy THUMB_REFHI. A SymbolTableIndex a szimbólumtáblába való elmozdulást és nem indexet tartalmaz.

 

ARM64 processzorok

Az ARM64-processzorokhoz az alábbi áthelyezési típusjelzők vannak definiálva.

Állandó Érték Leírás
IMAGE_REL_ARM64_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_ARM64_ADDR32
0x0001
A cél 32 bites VA-ja.
IMAGE_REL_ARM64_ADDR32NB
0x0002
A cél 32 bites RVA-ja.
IMAGE_REL_ARM64_BRANCH26
0x0003
A célhoz viszonyított 26 bites relatív elmozdulás a B és a BL utasításokhoz.
IMAGE_REL_ARM64_PAGEBASE_REL21
0x0004
A cél oldalbázisa az ADRP-utasításhoz.
IMAGE_REL_ARM64_REL21
0x0005
A cél 12 bites relatív elmozdulása az ADR utasításhoz
IMAGE_REL_ARM64_PAGEOFFSET_12A
0x0006
A cél 12 bites oldaleltolása az ADD/ADDS (azonnali) utasításhoz nulla eltolással.
IMAGE_REL_ARM64_PAGEOFFSET_12L
0x0007
A cél 12 bites oldaleltolása az LDR utasításhoz (indexelt, nem aláírt azonnali).
IMAGE_REL_ARM64_SECREL
0x0008
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_ARM64_SECREL_LOW12A
0x0009
A cél szakaszeltolásának 0:11-es bitje az ADD/ADDS (azonnali) utasításhoz nulla eltolással.
IMAGE_REL_ARM64_SECREL_HIGH12A
0x000A
A cél szakaszeltolásának 12:23.bitje az ADD/ADDS (azonnali) utasításhoz nulla eltolással.
IMAGE_REL_ARM64_SECREL_LOW12L
0x000B
A cél szakaszeltolásának 0:11 bitje az LDR utasításhoz (indexelt, nem aláírt azonnali).
IMAGE_REL_ARM64_TOKEN
0x000C
CLR-jogkivonat.
IMAGE_REL_ARM64_SECTION
0x000D
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_ARM64_ADDR64
0x000E
Az áthelyezési cél 64 bites VA-ja.
IMAGE_REL_ARM64_BRANCH19
0x000F
Az áthelyezési cél 19 bites eltolása feltételes B utasítás esetén.
IMAGE_REL_ARM64_BRANCH14
0x0010
Az áthelyezési cél 14 bites eltolása a TBZ és a TBNZ utasításokhoz.
IMAGE_REL_ARM64_REL32
0x0011
A 32 bites relatív cím az áthelyezést követő bájtból.
Hitachi SuperH processzorok

Az SH3- és SH4-processzorokhoz az alábbi áthelyezési típusjelzők vannak definiálva. Az SH5-specifikus áthelyezéseket SHM (SH Media) néven jegyezzük fel.

Állandó Érték Leírás
IMAGE_REL_SH3_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_SH3_DIRECT16
0x0001
Hivatkozás a célszimbólum VA-ját tartalmazó 16 bites helyre.
IMAGE_REL_SH3_DIRECT32
0x0002
A célszimbólum 32 bites VA-ja.
IMAGE_REL_SH3_DIRECT8
0x0003
Hivatkozás a célszimbólum VA-ját tartalmazó 8 bites helyre.
IMAGE_REL_SH3_DIRECT8_WORD
0x0004
Hivatkozás a célszimbólum érvényes 16 bites VA-ját tartalmazó 8 bites utasításra.
IMAGE_REL_SH3_DIRECT8_LONG
0x0005
Hivatkozás a célszimbólum érvényes 32 bites VA-ját tartalmazó 8 bites utasításra.
IMAGE_REL_SH3_DIRECT4
0x0006
Hivatkozás arra a 8 bites helyre, amelynek alacsony 4 bitje a célszimbólum VA-ját tartalmazza.
IMAGE_REL_SH3_DIRECT4_WORD
0x0007
Hivatkozás arra a 8 bites utasításra, amelynek alacsony 4 bitje tartalmazza a célszimbólum érvényes 16 bites VA-ját.
IMAGE_REL_SH3_DIRECT4_LONG
0x0008
Hivatkozás arra a 8 bites utasításra, amelynek alacsony 4 bitje tartalmazza a célszimbólum érvényes 32 bites VA-ját.
IMAGE_REL_SH3_PCREL8_WORD
0x0009
Hivatkozás a célszimbólum tényleges 16 bites relatív eltolását tartalmazó 8 bites utasításra.
IMAGE_REL_SH3_PCREL8_LONG
0x000A
Hivatkozás a célszimbólum tényleges 32 bites relatív eltolását tartalmazó 8 bites utasításra.
IMAGE_REL_SH3_PCREL12_WORD
0x000B
Hivatkozás arra a 16 bites utasításra, amelynek alacsony 12 bitje a célszimbólum tényleges 16 bites relatív eltolását tartalmazza.
IMAGE_REL_SH3_STARTOF_SECTION
0x000C
A célszimbólumot tartalmazó szakasz VA-jának 32 bites helyére mutató hivatkozás.
IMAGE_REL_SH3_SIZEOF_SECTION
0x000D
Hivatkozás a célszimbólumot tartalmazó szakasz méretének 32 bites helyére.
IMAGE_REL_SH3_SECTION
0x000E
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_SH3_SECREL
0x000F
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_SH3_DIRECT32_NB
0x0010
A célszimbólum 32 bites RVA-ja.
IMAGE_REL_SH3_GPREL4_LONG
0x0011
GP relatív.
IMAGE_REL_SH3_TOKEN
0x0012
CLR-jogkivonat.
IMAGE_REL_SHM_PCRELPT
0x0013
Az aktuális utasítás eltolása a longwordsben. Ha a NOMODE bit nincs beállítva, szúrja be az alacsony bit inverzét a 32. bitnél a PTA vagy a PTB kiválasztásához.
IMAGE_REL_SHM_REFLO
0x0014
A 32 bites cím alacsony 16 bitje.
IMAGE_REL_SHM_REFHALF
0x0015
A 32 bites cím magas 16 bitje.
IMAGE_REL_SHM_RELLO
0x0016
A relatív cím alacsony 16 bitje.
IMAGE_REL_SHM_RELHALF
0x0017
A relatív cím 16 bites csúcsa.
IMAGE_REL_SHM_PAIR
0x0018
Az áthelyezés csak akkor érvényes, ha azonnal követi a REFHALF, a RELHALF vagy az RELLO áthelyezést. Az áthelyezés SymbolTableIndex mezője nem indexet, hanem áthelyezést tartalmaz a szimbólumtáblába.
IMAGE_REL_SHM_NOMODE
0x8000
Az áthelyezés figyelmen kívül hagyja a szakasz módot.

 

IBM PowerPC processzorok

A PowerPC-processzorok esetében az alábbi áthelyezési típusjelzők vannak definiálva.

Állandó Érték Leírás
IMAGE_REL_PPC_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_PPC_ADDR64
0x0001
A cél 64 bites VA-ja.
IMAGE_REL_PPC_ADDR32
0x0002
A cél 32 bites VA-ja.
IMAGE_REL_PPC_ADDR24
0x0003
A cél VA-jának alacsony 24 bitje. Ez csak akkor érvényes, ha a cél szimbólum abszolút, és az eredeti értékére is kiterjeszthető.
IMAGE_REL_PPC_ADDR16
0x0004
A cél VA-jának alacsony 16 bitje.
IMAGE_REL_PPC_ADDR14
0x0005
A cél VA-jának alacsony 14 bitje. Ez csak akkor érvényes, ha a cél szimbólum abszolút, és az eredeti értékére is kiterjeszthető.
IMAGE_REL_PPC_REL24
0x0006
24 bites pc-relatív eltolás a szimbólum helyével.
IMAGE_REL_PPC_REL14
0x0007
14 bites pc-relatív eltolás a szimbólum helyével.
IMAGE_REL_PPC_ADDR32NB
0x000A
A cél 32 bites RVA-ja.
IMAGE_REL_PPC_SECREL
0x000B
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_PPC_SECTION
0x000C
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_PPC_SECREL16
0x000F
A cél 16 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_PPC_REFHI
0x0010
A cél 32 bites VA-jának magas 16 bitje. Ez egy teljes címet betöltő kétutas sorozat első utasításához használatos. Ezt az áthelyezést azonnal követnie kell egy PÁR áthelyezésnek, amelynek SymbolTableIndexe egy aláírt 16 bites áthelyezést tartalmaz, amelyet a rendszer hozzáad a felső 16 bithez, amelyet az áthelyezett helyről vettek át.
IMAGE_REL_PPC_REFLO
0x0011
A cél VA-jának alacsony 16 bitje.
IMAGE_REL_PPC_PAIR
0x0012
Olyan áthelyezés, amely csak akkor érvényes, ha azonnal követi a REFHI vagy a SECRELHI áthelyezést. A SymbolTableIndex a szimbólumtáblába való elmozdulást és nem indexet tartalmaz.
IMAGE_REL_PPC_SECRELLO
0x0013
A cél 32 bites eltolásának alacsony 16 bitje a szakasz elejétől.
IMAGE_REL_PPC_GPREL
0x0015
A cél 16 bites aláírt elmozdulása a gpregisztrációhoz képest.
IMAGE_REL_PPC_TOKEN
0x0016
A CLR-jogkivonat.

 

Intel 386 processzorok

Az Intel 386 és a kompatibilis processzorok esetében az alábbi áthelyezési típusjelzők vannak meghatározva.

Állandó Érték Leírás
IMAGE_REL_I386_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_I386_DIR16
0x0001
Nem támogatott.
IMAGE_REL_I386_REL16
0x0002
Nem támogatott.
IMAGE_REL_I386_DIR32
0x0006
A cél 32 bites VA.
IMAGE_REL_I386_DIR32NB
0x0007
A cél 32 bites RVA.
IMAGE_REL_I386_SEG12
0x0009
Nem támogatott.
IMAGE_REL_I386_SECTION
0x000A
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_I386_SECREL
0x000B
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_I386_TOKEN
0x000C
A CLR-jogkivonat.
IMAGE_REL_I386_SECREL7
0x000D
7 bites eltolás a célszakasz alapjától.
IMAGE_REL_I386_REL32
0x0014
A cél 32 bites relatív elmozdulása. Ez támogatja az x86 relatív ágat és a hívási utasításokat.

 

Intel Itanium processzorcsalád (IPF)

Az Intel Itanium processzorcsalád és a kompatibilis processzorok esetében az alábbi áthelyezési típusjelzők vannak meghatározva. Vegye figyelembe, hogy az utasításokban szereplő áthelyezések a csomag eltolását és pontszámát használják az áthelyezési eltoláshoz.

Állandó Érték Leírás
IMAGE_REL_IA64_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_IA64_IMM14
0x0001
Az utasításáthelyezést követheti egy ADDEND-áthelyezés, amelynek értéke hozzáadódik a célcímhez, mielőtt beszúrja az IMM14 csomag megadott pontjába. Az áthelyezési célnak abszolútnak kell lennie, vagy a rendszerképet rögzíteni kell.
IMAGE_REL_IA64_IMM22
0x0002
Az utasításáthelyezést követheti egy ADDEND-áthelyezés, amelynek értéke hozzáadódik a célcímhez, mielőtt beszúrják az IMM22 csomag megadott pontjába. Az áthelyezési célnak abszolútnak kell lennie, vagy a rendszerképet rögzíteni kell.
IMAGE_REL_IA64_IMM64
0x0003
Az áthelyezés pontszámának egynek (1) kell lennie. Az áthelyezést követheti egy ADDEND-áthelyezés, amelynek értéke hozzáadódik a célcímhez, mielőtt az az IMM64-csomag mindhárom tárolóhelyén tárolva lenne.
IMAGE_REL_IA64_DIR32
0x0004
A cél 32 bites VA. Ez csak a /LARGEADDRESSAWARE:NO rendszerképekhez támogatott.
IMAGE_REL_IA64_DIR64
0x0005
A cél 64 bites VA.
IMAGE_REL_IA64_PCREL21B
0x0006
Az utasítás kijavítva a 25 bites relatív elmozdulással a 16 bites igazított célhoz. Az eltolódás alacsony 4 bitje nulla, és nincs tárolva.
IMAGE_REL_IA64_PCREL21M
0x0007
Az utasítás kijavítva a 25 bites relatív elmozdulással a 16 bites igazított célhoz. Az eltolódás alacsony 4 bitje, amely nulla, nincs tárolva.
IMAGE_REL_IA64_PCREL21F
0x0008
Az áthelyezés eltolásának LSB-jeinek tartalmazniuk kell a pontszámot, míg a többi a köteg címét. A csomag a 25 bites relatív elmozdulással a 16 bites igazított célhoz van javítva. Az eltolódás alacsony 4 bitje nulla, és nincs tárolva.
IMAGE_REL_IA64_GPREL22
0x0009
Az utasításáthelyezést követheti egy ADDEND-áthelyezés, amelynek értéke hozzáadódik a célcímhez, majd egy 22 bites GP-relatív eltolás, amelyet a GPREL22 csomagra számítunk ki és alkalmazunk.
IMAGE_REL_IA64_LTOFF22
0x000A
Az utasítás a célszimbólum konstans táblabejegyzéséhez tartozó 22 bites GP-relatív eltolással van javítva. A linker létrehozza ezt a szó szerinti táblabejegyzést az áthelyezés és az azt követő ADDEND-áthelyezés alapján.
IMAGE_REL_IA64_SECTION
0x000B
A szakasz 16 bites szakaszindexe tartalmazza a célt. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_IA64_SECREL22
0x000C
Az utasítás a cél 22 bites eltolásával van javítva a szakasz elejétől. Ezt az áthelyezést azonnal követheti egy ADDEND-áthelyezés, amelynek Érték mezőjében a cél 32 bites, alá nem írt eltolása található a szakasz elejétől.
IMAGE_REL_IA64_SECREL64I
0x000D
Az áthelyezés pontszámának egynek (1) kell lennie. Az utasítás a cél 64 bites eltolásával van javítva a szakasz elejétől. Ezt az áthelyezést azonnal követheti egy ADDEND-áthelyezés, amelynek Érték mezőjében a cél 32 bites, alá nem írt eltolása található a szakasz elejétől.
IMAGE_REL_IA64_SECREL32
0x000E
A javítandó adatok címe a cél 32 bites eltolásával a szakasz elejétől.
IMAGE_REL_IA64_DIR32NB
0x0010
A cél 32 bites RVA.
IMAGE_REL_IA64_SREL14
0x0011
Ez egy aláírt 14 bites azonnali példányra lesz alkalmazva, amely két áthelyezhető cél közötti különbséget tartalmazza. Ez a hivatkozás egy deklaratív mezője, amely azt jelzi, hogy a fordító már kibocsátotta ezt az értéket.
IMAGE_REL_IA64_SREL22
0x0012
Ez egy aláírt 22 bites azonnali példányra lesz alkalmazva, amely két áthelyezhető cél közötti különbséget tartalmazza. Ez a hivatkozás egy deklaratív mezője, amely azt jelzi, hogy a fordító már kibocsátotta ezt az értéket.
IMAGE_REL_IA64_SREL32
0x0013
Ez egy aláírt 32 bites azonnalira van alkalmazva, amely két áthelyezhető érték közötti különbséget tartalmazza. Ez a hivatkozás egy deklaratív mezője, amely azt jelzi, hogy a fordító már kibocsátotta ezt az értéket.
IMAGE_REL_IA64_UREL32
0x0014
Ez egy nem aláírt, 32 bites azonnali értékre lesz alkalmazva, amely két áthelyezhető érték közötti különbséget tartalmazza. Ez a hivatkozás egy deklaratív mezője, amely azt jelzi, hogy a fordító már kibocsátotta ezt az értéket.
IMAGE_REL_IA64_PCREL60X
0x0015
Egy 60 bites PC-relatív javítás, amely mindig az MLX-csomag BRL utasításaként marad.
IMAGE_REL_IA64_PCREL60B
0x0016
60 bites pc-relatív javítás. Ha a célhelyeltérés egy aláírt 25 bites mezőben elfér, konvertálja a teljes csomagot MBB-csomagmá NOP-vel. B az 1. pontban és egy 25 bites BR utasítás (a 4 legalacsonyabb bittel, mind a nullával, mind eldobott) a 2. pontban.
IMAGE_REL_IA64_PCREL60F
0x0017
60 bites pc-relatív javítás. Ha a célhelyeltérés egy aláírt 25 bites mezőben elfér, konvertálja a teljes csomagot MFB-köteggé NOP-vel. F az 1. pontban, és egy 25 bites (4 legalacsonyabb bit az összes nulla és elvetett) BR utasítás a 2. pontban.
IMAGE_REL_IA64_PCREL60I
0x0018
60 bites pc-relatív javítás. Ha a célhelyhely elfér egy aláírt 25 bites mezőben, konvertálja a teljes csomagot EGY NOP-vel rendelkező MIB-csomaggá. Én az 1. pontban és egy 25 bites (4 legalacsonyabb bit az összes nulla és elvetett) BR utasításban a 2. pontban.
IMAGE_REL_IA64_PCREL60M
0x0019
60 bites pc-relatív javítás. Ha a célhelyeltérés egy aláírt 25 bites mezőben elfér, konvertálja a teljes csomagot egy NOP-vel rendelkező MMB-csomaggá. M az 1. pontban, és egy 25 bites (4 legalacsonyabb bit az összes nulla és elvetett) BR utasítás a 2. pontban.
IMAGE_REL_IA64_IMMGPREL64
0x001a
Egy 64 bites GP-relatív javítás.
IMAGE_REL_IA64_TOKEN
0x001b
EGY CLR-jogkivonat.
IMAGE_REL_IA64_GPREL32
0x001c
Egy 32 bites GP-relatív javítás.
IMAGE_REL_IA64_ADDEND
0x001F
Az áthelyezés csak akkor érvényes, ha azonnal követi az alábbi áttelepítések egyikét: IMM14, IMM22, IMM64, GPREL22, LTOFF22, LTOFF64, SECREL22, SECREL64I vagy SECREL32. Az érték a csomagon belüli utasításokra alkalmazandó bővítményt tartalmazza, nem pedig az adatokra.

 

MIPS-processzorok

A MIPS-processzorok esetében az alábbi áthelyezési típusjelzők vannak definiálva.

Állandó Érték Leírás
IMAGE_REL_MIPS_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_MIPS_REFHALF
0x0001
A cél 32 bites VA-jának magas 16 bitje.
IMAGE_REL_MIPS_REFWORD
0x0002
A cél 32 bites VA.
IMAGE_REL_MIPS_JMPADDR
0x0003
A cél VA-jának alacsony 26 bitje. Ez támogatja a MIPS J- és JAL-utasításokat.
IMAGE_REL_MIPS_REFHI
0x0004
A cél 32 bites VA-jának magas 16 bitje. Ez egy teljes címet betöltő kétutas sorozat első utasításához használatos. Ezt az áthelyezést azonnal követnie kell egy PÁR áthelyezésnek, amelynek SymbolTableIndexe egy aláírt 16 bites áthelyezést tartalmaz, amelyet a rendszer hozzáad a felső 16 bithez, amelyet az áthelyezett helyről vesznek át.
IMAGE_REL_MIPS_REFLO
0x0005
A cél VA-jának alacsony 16 bitje.
IMAGE_REL_MIPS_GPREL
0x0006
A cél 16 bites aláírt elmozdulása a gpregisztrációhoz képest.
IMAGE_REL_MIPS_LITERAL
0x0007
Ugyanaz, mint IMAGE_REL_MIPS_GPREL.
IMAGE_REL_MIPS_SECTION
0x000A
A szakasz 16 bites szakaszindexe tartalmazza a célt. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_MIPS_SECREL
0x000B
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_MIPS_SECRELLO
0x000C
A cél 32 bites eltolásának alacsony 16 bitje a szakasz elejétől.
IMAGE_REL_MIPS_SECRELHI
0x000D
A cél 32 bites eltolásának magas 16 bitje a szakasz elejétől. A IMAGE_REL_MIPS_PAIR áthelyezésnek azonnal követnie kell ezt. A PÁR áthelyezésének SymbolTableIndexe egy aláírt 16 bites elmozdulást tartalmaz, amelyet a rendszer hozzáad a felső 16 bithez, amelyet az áthelyezett helyről vesznek fel.
IMAGE_REL_MIPS_JMPADDR16
0x0010
A cél VA-jának alacsony 26 bitje. Ez támogatja a MIPS16 JAL utasítást.
IMAGE_REL_MIPS_REFWORDNB
0x0022
A cél 32 bites RVA.
IMAGE_REL_MIPS_PAIR
0x0025
Az áthelyezés csak akkor érvényes, ha azonnal követi a REFHI vagy a SECRELHI áthelyezést. A SymbolTableIndex a szimbólumtáblába való elmozdulást és nem indexet tartalmaz.

 

Mitsubishi M32R

A Mitsubishi M32R processzorokhoz az alábbi áthelyezési típusjelzők vannak meghatározva.

Állandó Érték Leírás
IMAGE_REL_M32R_ABSOLUTE
0x0000
A rendszer figyelmen kívül hagyja az áthelyezést.
IMAGE_REL_M32R_ADDR32
0x0001
A cél 32 bites VA.
IMAGE_REL_M32R_ADDR32NB
0x0002
A cél 32 bites RVA.
IMAGE_REL_M32R_ADDR24
0x0003
A cél 24 bites VA.
IMAGE_REL_M32R_GPREL16
0x0004
A cél 16 bites eltolása a GP-nyilvántartásból.
IMAGE_REL_M32R_PCREL24
0x0005
A cél 24 bites eltolása a programszámlálótól (PC), balra 2 bittel eltolva és kiterjesztett jellel
IMAGE_REL_M32R_PCREL16
0x0006
A cél 16 bites eltolása a PC-ről, balra 2 biteltolva és jelekkel bővítve
IMAGE_REL_M32R_PCREL8
0x0007
A cél 8 bites eltolása a PC-ről, balra 2 biteltolva és jelekkel bővítve
IMAGE_REL_M32R_REFHALF
0x0008
A cél VA 16 MSB-je.
IMAGE_REL_M32R_REFHI
0x0009
A cél VA 16 MSB-je, az LSB-jelbővítményhez igazítva. Ez egy 32 bites teljes címet betöltő kétutas sorozat első utasításához használatos. Ezt az áthelyezést azonnal követnie kell egy PÁR áthelyezésnek, amelynek SymbolTableIndexe egy aláírt 16 bites áthelyezést tartalmaz, amelyet a rendszer hozzáad a felső 16 bithez, amelyet az áthelyezett helyről vesznek át.
IMAGE_REL_M32R_REFLO
0x000A
A cél VA 16 LSB-je.
IMAGE_REL_M32R_PAIR
0x000B
Az áthelyezésnek a REFHI áthelyezést kell követnie. A SymbolTableIndex a szimbólumtáblába való elmozdulást és nem indexet tartalmaz.
IMAGE_REL_M32R_SECTION
0x000C
A célt tartalmazó szakasz 16 bites szakaszindexe. Ez a hibakeresési információk támogatására szolgál.
IMAGE_REL_M32R_SECREL
0x000D
A cél 32 bites eltolása a szakasz elejétől. Ez a hibakeresési információk és a statikus szál helyi tárolóinak támogatására szolgál.
IMAGE_REL_M32R_TOKEN
0x000E
A CLR-jogkivonat.

 

COFF-sorszámok (elavult)

A COFF-sorok számai már nem termelődnek, és a jövőben nem lesznek felhasználva.

A COFF-sorszámok a forrásfájlokban lévő kód és vonalszámok közötti kapcsolatot jelzik. A COFF-sorok microsoftos formátuma hasonló a normál COFF-hoz, de ki lett terjesztve, hogy egyetlen szakasz több forrásfájlban lévő sorszámokhoz kapcsolódjon.

A COFF-sorok száma rögzített hosszúságú rekordokból álló tömbből áll. A tömb helyét (fájleltolását) és méretét a szakaszfejléc határozza meg. Minden sorszámrekord a következő formátumú.

Kiegyenlít Méret Terület Leírás
0
4
Típus (*)
Ez két mezőből áll: SymbolTableIndex és VirtualAddress. A SymbolTableIndex vagy az RVA használata a Linenumber értékétől függ.
4
2
Linenumber
Ha nem, ez a mező egy egy-alapú sorszámot ad meg. Nulla esetén a Típus mező egy függvény szimbólumtábla-indexeként lesz értelmezve.

 

A Típus mező két 4 bájtos mező egysége: SymbolTableIndex és VirtualAddress.

Kiegyenlít Méret Terület Leírás
0
4
SymbolTableIndex
Akkor használatos, ha a Linenumber értéke nulla: egy függvény táblabejegyzésének indexe. Ez a formátum azt a függvényt jelzi, amelyre a sorszámrekordok egy csoportja hivatkozik.
0
4
VirtualAddress
Akkor használatos, ha a Linenumber nem nulla: a futtatható kód RVA-értéke, amely megfelel a megadott forrásvonalnak. Egy objektumfájlban ez a szakaszon belüli VA-t tartalmazza.

 

A sorszámrekordok nullára állíthatják a Linenumber mezőt, és a szimbólumtáblában egy függvénydefinícióra mutathatnak, vagy normál sorszámbejegyzésként is működhetnek, ha pozitív egész számot (vonalszámot) és az objektumkód megfelelő címét adják meg.

A sorszámbejegyzések csoportja mindig az első formátummal kezdődik: egy függvényszimbólum indexével. Ha ez a szakasz első sorszámrekordja, akkor a comDAT szimbólum neve is a függvénynek, ha be van állítva a szakasz COMDAT jelölője. Lásd : COMDAT-szakaszok (csak objektum). A függvény segédrekordja a szimbólumtáblában a Linenumber mezőre mutató mutatóval rendelkezik, amely ugyanarra a sorszámrekordra mutat.

Egy függvényt azonosító rekordot a tényleges sorszámadatokat (azaz a nulla értéknél nagyobb sorszámmal rendelkező bejegyzéseket) tartalmazó sorszámbejegyzések száma követi. Ezek a bejegyzések egy-alapúak a függvény elejéhez képest, és az első sor kivételével a függvény minden forrássorát képviselik.

Az alábbi példa első sorszámrekordja például a ReverseSign függvényt adja meg (a ReverseSign szimbólumtáblázata és a linenumber értéke nulla). Ezután az 1, 2 és 3 sorszámú rekordok következnek, a forrásvonalaknak megfelelően, az ábrán látható módon:

// some code precedes ReverseSign function
int ReverseSign(int i)
1: {
2:  return -1 * i;
3: }

COFF szimbólumtábla

A szakasz szimbólumtáblája a hagyományos COFF formátumtól öröklődik. Ez eltér a Microsoft Visual C++ hibakeresési adataitól. A fájlok a COFF szimbólumtáblát és a Visual C++ hibakeresési információkat is tartalmazhatják, és a kettő külön marad. Egyes Microsoft-eszközök korlátozott, de fontos célokra használják a szimbólumtáblát, például COMDAT-információk továbbítását a hivatkozáskezelőnek. A szakasznevek és fájlnevek, valamint a kód- és adatszimbólumok szerepelnek a szimbólumtáblában.

A szimbólumtábla helye a COFF fejlécben van feltüntetve.

A szimbólumtábla egy rekordtömb, amely egyenként 18 bájt hosszú. Minden rekord egy szabványos vagy kiegészítő szimbólumtábla rekord. A standard rekord egy szimbólumot vagy nevet határoz meg, és a következő formátummal rendelkezik.

Kiegyenlít Méret Terület Leírás
0
8
Név (*)
A szimbólum neve, amelyet három szerkezetből álló unió jelöl. A rendszer 8 bájtból álló tömböt használ, ha a név nem hosszabb 8 bájtnál. További információ: Szimbólumnév-ábrázolás.
8
4
Érték
A szimbólumhoz társított érték. A mező értelmezése a SectionNumber és a StorageClass függvénytől függ. A tipikus jelentés az áthelyezhető cím.
12
2
SectionNumber
A szakaszt azonosító aláírt egész szám egy egy-alapú index használatával a szakasztáblában. Egyes értékek különleges jelentéssel bírnak az 5.4.2.
14
2
Típus
Típust jelképező szám. A Microsoft-eszközök ezt a mezőt 0x20 (függvény) vagy 0x0 (nem függvény) értékre állítják be. További információ: Típusábrázolás.
16
1
StorageClass
A tárosztályt jelképező számbavételi érték. További információ: Storage Class.
17
1
NumberOfAuxSymbols
A rekordot követő kiegészítő szimbólumtábla-bejegyzések száma.

 

Nulla vagy több kiegészítő szimbólumtáblázat-rekord azonnal követi az egyes szabványos szimbólumtáblázat-rekordokat. Azonban általában legfeljebb egy kiegészítő szimbólumtáblázat-rekord követi a szabványos szimbólumtábla rekordot (kivéve a hosszú fájlneveket tartalmazó .file rekordokat). Minden kiegészítő rekord mérete megegyezik a normál szimbólumtáblázat rekordéval (18 bájt), de új szimbólum definiálása helyett a kiegészítő rekord további információt ad az utolsó megadott szimbólumról. A különböző formátumok közül a StorageClass mezőtől függ. A segédjeltáblák rekordjainak jelenleg definiált formátumai az 5.5. szakaszban, a "Kiegészítő szimbólumrekordok" szakaszban jelennek meg.

A COFF-szimbólumtáblákat olvasó eszközöknek figyelmen kívül kell hagyniuk az ismeretlen értelmezésű kiegészítő szimbólumrekordokat. Ez lehetővé teszi a szimbólumtábla formátumának kiterjesztését új kiegészítő rekordok hozzáadásához, a meglévő eszközök feltörése nélkül.

Szimbólumnév-ábrázolás

A szimbólumtábla ShortName mezője 8 bájtból áll, amely magában a névben szerepel, ha nem hosszabb 8 bájtnál, vagy a ShortName mező eltolást ad a sztringtáblába. Annak megállapításához, hogy a név vagy az eltolás meg van-e adva, tesztelje az első 4 bájtot a nullára való egyenlőség érdekében.

Konvenció szerint a nevek nulla végződésű UTF-8 kódolt sztringként vannak kezelve.

Kiegyenlít Méret Terület Leírás
0
8
ShortName
Egy 8 bájtból álló tömb. Ha a név kisebb, mint 8 bájt hosszú, a tömb jobb oldalán null érték van beállítva.
0
4
Nullák
Olyan mező, amely minden nullára van állítva, ha a név hosszabb, mint 8 bájt.
4
4
Ellensúlyoz
Eltolás a sztringtáblába.

 

Szakaszszámértékek

A szimbólumtábla-bejegyzés Szakaszérték mezője általában egy egy-alapú index a szakasztáblában. Ez a mező azonban aláírt egész szám, és negatív értékeket vehet fel. Az alábbi értékek, amelyek egynél kisebbek, speciális jelentéssel bírnak.

Állandó Érték Leírás
IMAGE_SYM_UNDEFINED
0
A szimbólumrekord még nincs hozzárendelve szakaszhoz. A nulla érték azt jelzi, hogy egy külső szimbólumra mutató hivatkozás máshol van definiálva. A nem nulla értékek az érték által megadott mérettel rendelkező közös szimbólumok.
IMAGE_SYM_ABSOLUTE
-1
A szimbólum abszolút (nem áthelyezhető) értékkel rendelkezik, és nem cím.
IMAGE_SYM_DEBUG
-2
A szimbólum általános típus- vagy hibakeresési információkat tartalmaz, de nem felel meg egy szakasznak. A Microsoft-eszközök ezt a beállítást a .file rekordokkal (FILE tárolási osztály) együtt használják.

 

Típusábrázolás

A szimbólumtábla-bejegyzés Típus mezője 2 bájtot tartalmaz, ahol minden bájt típusinformációt jelöl. Az LSB az egyszerű (alap) adattípust, az MSB pedig az összetett típust jelöli, ha van ilyen:

MSB LSB
Összetett típus: nincs, mutató, függvény, tömb.
Alaptípus: egész szám, lebegőpontos stb.

 

Az alaptípushoz a következő értékek vannak definiálva, bár a Microsoft-eszközök általában nem használják ezt a mezőt, és az LSB értékét 0 értékre állítják. Ehelyett a Visual C++ hibakeresési információi típusok jelzésére szolgálnak. A lehetséges COFF-értékek azonban itt szerepelnek a teljesség érdekében.

Állandó Érték Leírás
IMAGE_SYM_TYPE_NULL
0
Nincs típusinformáció vagy ismeretlen alaptípus. A Microsoft-eszközök ezt a beállítást használják
IMAGE_SYM_TYPE_VOID
1
Nincs érvényes típus; üres mutatókkal és függvényekkel használva
IMAGE_SYM_TYPE_CHAR
2
Egy karakter (aláírt bájt)
IMAGE_SYM_TYPE_SHORT
3
2 bájtos aláírt egész szám
IMAGE_SYM_TYPE_INT
4
Természetes egész számtípus (Windows rendszerben általában 4 bájt)
IMAGE_SYM_TYPE_LONG
5
4 bájtos aláírt egész szám
IMAGE_SYM_TYPE_FLOAT
6
4 bájtos lebegőpontos szám
IMAGE_SYM_TYPE_DOUBLE
7
8 bájtos lebegőpontos szám
IMAGE_SYM_TYPE_STRUCT
8
Egy struktúra
IMAGE_SYM_TYPE_UNION
9
Egy unió
IMAGE_SYM_TYPE_ENUM
10
Számbavételi típus
IMAGE_SYM_TYPE_MOE
11
Az enumerálás tagja (egy adott érték)
IMAGE_SYM_TYPE_BYTE
12
Bájt; aláíratlan 1 bájt egész szám
IMAGE_SYM_TYPE_WORD
13
Egy szó; aláíratlan 2 bájtos egész szám
IMAGE_SYM_TYPE_UINT
14
Természetes méretű aláíratlan egész szám (általában 4 bájt)
IMAGE_SYM_TYPE_DWORD
15
Aláíratlan 4 bájtos egész szám

 

A legjelentősebb bájt azt határozza meg, hogy a szimbólum az LSB-ben megadott alaptípus mutatója, függvénye vagy tömbje. A Microsoft-eszközök ezt a mezőt csak arra használják, hogy jelezzék, hogy a szimbólum függvény-e, így az eredményként kapott két érték 0x0 és 0x20 a Típus mezőhöz. Más eszközök azonban ezt a mezőt további információk közlésére használhatják.

Nagyon fontos, hogy helyesen adja meg a függvényattribútumot. Ez az információ a növekményes csatolás megfelelő működéséhez szükséges. Egyes architektúrák esetében előfordulhat, hogy az információk más célokra is szükségesek.

Állandó Érték Leírás
IMAGE_SYM_DTYPE_NULL
0
Nincs származtatott típus; a szimbólum egy egyszerű skaláris változó.
IMAGE_SYM_DTYPE_POINTER
1
A szimbólum az alaptípusra mutató mutató.
IMAGE_SYM_DTYPE_FUNCTION
2
A szimbólum egy olyan függvény, amely egy alaptípust ad vissza.
IMAGE_SYM_DTYPE_ARRAY
3
A szimbólum egy alaptípusú tömb.

 

Tárolási osztály

A szimbólumtábla StorageClass mezője azt jelzi, hogy egy szimbólum milyen definíciót jelöl. Az alábbi táblázat a lehetséges értékeket mutatja be. Vegye figyelembe, hogy a StorageClass mező egy aláíratlan 1 bájtos egész szám. Az -1 különleges értéket ezért úgy kell figyelembe venni, hogy az az aláírás nélküli egyenértékűségét jelenti, 0xFF.

Bár a hagyományos COFF formátum számos tárolási osztályértéket használ, a Microsoft-eszközök a legtöbb szimbolikus információhoz a Visual C++ hibakeresési formátumot használják, és általában csak négy tárolási osztályértéket használnak: KÜLSŐ (2), STATIKUS (3), FÜGGVÉNY (101) és FILE (103). Az alábbi második oszlopfejléc kivételével az "Érték" a szimbólumrekord Érték mezőjét jelenti (amelynek értelmezése a tárolási osztályként talált számtól függ).

Állandó Érték Az Érték mező leírása/értelmezése
IMAGE_SYM_CLASS_END_OF_FUNCTION
-1 (0xFF)
Egy speciális szimbólum, amely a függvény végét jelöli hibakeresési célokra.
IMAGE_SYM_CLASS_NULL
0
Nincs hozzárendelt tárolási osztály.
IMAGE_SYM_CLASS_AUTOMATIC
1
Az automatikus (verem) változó. Az Érték mező a veremkeret eltolását határozza meg.
IMAGE_SYM_CLASS_EXTERNAL
2
A Microsoft eszközei által külső szimbólumokhoz használt érték. Az Érték mező azt a méretet jelzi, ha a szakaszszám IMAGE_SYM_UNDEFINED (0). Ha a szakaszszám nem nulla, akkor az Érték mező megadja a szakaszon belüli eltolást.
IMAGE_SYM_CLASS_STATIC
3
A szimbólum eltolása a szakaszon belül. Ha az Érték mező nulla, akkor a szimbólum egy szakasznevet jelöl.
IMAGE_SYM_CLASS_REGISTER
4
Egy regisztrációs változó. Az Érték mező megadja a regisztrációs számot.
IMAGE_SYM_CLASS_EXTERNAL_DEF
5
Külsőleg definiált szimbólum.
IMAGE_SYM_CLASS_LABEL
6
A modulban definiált kódfelirat. Az Érték mező a szimbólum eltolását adja meg a szakaszon belül.
IMAGE_SYM_CLASS_UNDEFINED_LABEL
7
Nem definiált kódcímkére mutató hivatkozás.
IMAGE_SYM_CLASS_MEMBER_OF_STRUCT
8
A struktúratag. Az Érték mező az n. tagot adja meg.
IMAGE_SYM_CLASS_ARGUMENT
9
Egy függvény formális argumentuma (paramétere). Az Érték mező az n. argumentumot adja meg.
IMAGE_SYM_CLASS_STRUCT_TAG
10
A struktúracímke-név bejegyzése.
IMAGE_SYM_CLASS_MEMBER_OF_UNION
11
Szakszervezeti tag. Az Érték mező az n. tagot adja meg.
IMAGE_SYM_CLASS_UNION_TAG
12
Az Unió címkenév bejegyzése.
IMAGE_SYM_CLASS_TYPE_DEFINITION
13
Typedef bejegyzés.
IMAGE_SYM_CLASS_UNDEFINED_STATIC
14
Statikus adatdeklaráció.
IMAGE_SYM_CLASS_ENUM_TAG
15
Enumerált típusú címkenév bejegyzés.
IMAGE_SYM_CLASS_MEMBER_OF_ENUM
16
Egy enumerálás tagja. Az Érték mező az n. tagot adja meg.
IMAGE_SYM_CLASS_REGISTER_PARAM
17
Egy regisztrációs paraméter.
IMAGE_SYM_CLASS_BIT_FIELD
18
Egy bitmezőre mutató hivatkozás. Az Érték mező a bitmező n. bitét adja meg.
IMAGE_SYM_CLASS_BLOCK
100
.bb (a blokk kezdete) vagy .eb (blokk vége) rekord. Az Érték mező a kód helyének áthelyezhető címe.
IMAGE_SYM_CLASS_FUNCTION
101
A Microsoft eszközei által a függvények mértékét meghatározó szimbólumrekordokhoz használt érték: a kezdő függvény (.bf), a végfüggvény ( .ef) és a függvény sorai ( .lf ). A .lf rekordok esetében az Érték mező a függvény forrássorainak számát adja meg. .ef rekordok esetén az Érték mező adja meg a függvénykód méretét.
IMAGE_SYM_CLASS_END_OF_STRUCT
102
A struktúra vége bejegyzés.
IMAGE_SYM_CLASS_FILE
103
A Microsoft által használt érték, valamint a hagyományos COFF formátum a forrás-fájl szimbólumrekordhoz. A szimbólumot kiegészítő rekordok követik, amelyek a fájlt nevezik el.
IMAGE_SYM_CLASS_SECTION
104
Szakasz definíciója (a Microsoft-eszközök ehelyett STATIKUS tárolási osztályt használnak).
IMAGE_SYM_CLASS_WEAK_EXTERNAL
105
Gyenge külső. További információ: 3. segédformátum: Gyenge külsők.
IMAGE_SYM_CLASS_CLR_TOKEN
107
CLR-jogkivonat szimbóluma. A név egy ASCII-sztring, amely a jogkivonat hexadecimális értékéből áll. További információ: CLR-tokendefiníció (csak objektum).

 

Kiegészítő szimbólumrekordok

A kiegészítő szimbólumtáblarekordok mindig követik és alkalmazzák a szabványos szimbólumtáblarekordokat. A segédrekordok bármilyen formátummal rendelkezhetnek, amelyet az eszközök felismerhetnek, de 18 bájtot kell lefoglalni hozzájuk, hogy a szimbólumtáblát normál méretű tömbként lehessen fenntartani. A Microsoft eszközei jelenleg a következő típusú rekordok kiegészítő formátumait ismerik fel: függvénydefiníciók, függvények kezdő és záró szimbólumai (.bf és .ef), gyenge külsők, fájlnevek és szakaszdefiníciók.

A hagyományos COFF-kialakítás magában foglalja a tömbök és struktúrák kiegészítő rekordformátumait is. A Microsoft-eszközök ezeket nem használják, hanem a szimbolikus információkat Visual C++ hibakeresési formátumban helyezik el a hibakeresési szakaszokban.

Segédformátum 1: Függvénydefiníciók

A szimbólumtáblarekordok a függvénydefiníció elejét jelzik, ha az összes következővel rendelkezik: külső (2) tárolási osztály, egy típusérték, amely azt jelzi, hogy függvény (0x20) és egy nullánál nagyobb szakaszszám. Vegye figyelembe, hogy a nem definiált (0) szakaszszámú szimbólumtáblarekord nem határozza meg a függvényt, és nem rendelkezik segédrekorddal. A függvénydefiníciós szimbólumrekordokat egy kiegészítő rekord követi az alábbi formátumban:

Kiegyenlít Méret Terület Leírás
0
4
TagIndex
A megfelelő .bf (kezdő függvény) szimbólumrekord szimbólumtábla-indexe.
4
4
TotalSize
A függvény végrehajtható kódjának mérete. Ha a függvény a saját szakaszában található, a szakaszfejléc SizeOfRawData értéke az igazítási szempontoktól függően nagyobb vagy egyenlő ezzel a mezővel.
8
4
PointerToLinenumber
A függvény első COFF-sorszám bejegyzésének fájleltolása, vagy nulla, ha nincs ilyen. További információ: COFF Line Numbers (Elavult).
12
4
PointerToNextFunction
A következő függvény rekordjának szimbólumtáblázat-indexe. Ha a függvény az utolsó a szimbólumtáblában, akkor ez a mező nullára van állítva.
16
2
Használatlan

 

2. segédformátum: .bf és .ef szimbólumok

A szimbólumtábla minden függvénydefiníciója esetében három elem írja le a sorok kezdetét, végét és számát. Ezek a szimbólumok mindegyike rendelkezik a FUNCTION (101) tárolási osztálysal:

.bf (begin függvény) nevű szimbólumrekord. Az Érték mező nincs használatban.

.lf (függvény sorai) nevű szimbólumrekord. Az Érték mező a függvény sorainak számát adja meg.

.ef (függvény vége) nevű szimbólumrekord. Az Érték mező száma megegyezik a függvénydefiníció szimbólumrekordJának Teljes méret mezőjével.

A .bf és .ef szimbólumrekordokat (de .lf rekordokat nem) egy kiegészítő rekord követi a következő formátumban:

Kiegyenlít Méret Terület Leírás
0
4
Használatlan
4
2
Linenumber
A forrásfájl tényleges sorszáma (1, 2, 3 stb.) a .bf vagy .ef rekordnak megfelelően.
6
6
Használatlan
12
4
PointerToNextFunction (csak .bf)
A következő .bf szimbólumrekord szimbólumtáblázat-indexe. Ha a függvény az utolsó a szimbólumtáblában, akkor ez a mező nullára van állítva. .ef rekordokhoz nem használható.
16
2
Használatlan

 

Segédformátum 3: Gyenge külsők

A "gyenge külsők" az objektumfájlok olyan mechanizmusai, amelyek lehetővé teszik a rugalmasságot a kapcsolódási időben. A modulok tartalmazhatnak megoldatlan külső szimbólumot (sym1), de tartalmazhatnak egy kiegészítő rekordot is, amely azt jelzi, hogy ha a sym1 nem jelenik meg a hivatkozási időpontban, egy másik külső szimbólumot (sym2) használnak a hivatkozások feloldására.

Ha a szim1 definíciója csatolva van, akkor a rendszer a szimbólumra mutató külső hivatkozást normál módon oldja fel. Ha a sym1 definíciója nincs összekapcsolva, akkor a sym1 gyenge külsőre mutató összes hivatkozás a sym2-ra hivatkozik. A külső szimbólumot (sym2) mindig összekapcsolni kell; általában a modulban van definiálva, amely a sym1 gyenge hivatkozását tartalmazza.

A gyenge külsőket egy külső tárolóosztályt, UNDEF szakaszszámot és nulla értéket tartalmazó szimbólumtábla-rekord jelöli. A gyenge külső szimbólumrekordot egy kiegészítő rekord követi a következő formátummal:

Kiegyenlít Méret Terület Leírás
0
4
TagIndex
A sym2 szimbólumtáblázat indexe, amely akkor csatolandó, ha a sym1 nem található.
4
4
Jellemzők
A IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY értéke azt jelzi, hogy nem szabad könyvtárban keresni a sym1-et.
A IMAGE_WEAK_EXTERN_SEARCH_LIBRARY értéke azt jelzi, hogy a könyvtárban sym1-et kell keresni.
A IMAGE_WEAK_EXTERN_SEARCH_ALIAS értéke azt jelzi, hogy a sym1 a sym2 aliasa.
8
10
Használatlan

 

Vegye figyelembe, hogy a Jellemzők mező nincs definiálva a WINNT-ben. H; helyett a Total Size (Teljes méret) mezőt használja a program.

4. segédformátum: Fájlok

Ez a formátum a FILE (103) tárosztályú szimbólumtábla rekordot követi. Magának a szimbólumnak a neve .file, az azt követő segédrekord pedig egy forráskódfájl nevét adja.

Kiegyenlít Méret Terület Leírás
0
18
Fájlnév
Egy ANSI-sztring, amely megadja a forrásfájl nevét. Ez null értékekkel van elválasztva, ha kisebb, mint a maximális hossz.

 

Segédformátum 5: Szakaszdefiníciók

Ez a formátum egy szakaszt definiáló szimbólumtábla rekordot követ. Egy ilyen rekordnak van egy szimbólumneve, amely egy szakasz neve (például .text vagy .drectve), és statikus tárolási osztálysal (3) rendelkezik. A kiegészítő rekord információt nyújt arról a szakaszról, amelyre hivatkozik. Így a szakaszfejlécben szereplő információk egy részét duplikálja.

Kiegyenlít Méret Terület Leírás
0
4
Hosszúság
A szakaszadatok mérete; ugyanaz, mint a SizeOfRawData a szakasz fejlécében.
4
2
NumberOfRelocations
A szakasz áthelyezési bejegyzéseinek száma.
6
2
NumberOfLinenumbers
A szakasz sorszám bejegyzéseinek száma.
8
4
Ellenőrzőösszeg
A kommunális adatok ellenőrzőösszege. Akkor alkalmazható, ha a szakaszfejlécben be van állítva a IMAGE_SCN_LNK_COMDAT jelző. További információ: COMDAT-szakaszok (csak objektum).
12
2
Szám
Egy-alapú index a társított szakasz szakasztáblájába. Ezt akkor használja a rendszer, ha a COMDAT kijelölési beállítása 5.
14
1
Szelekció
A COMDAT kijelölési száma. Ez akkor alkalmazható, ha a szakasz COMDAT-szakasz.
15
3
Használatlan

 

COMDAT-szakaszok (csak objektum)

A szakaszdefiníció segédformátumának kijelölési mezője akkor alkalmazható, ha a szakasz COMDAT szakasz. A COMDAT-szakaszok olyan szakaszok, amelyek több objektumfájllal is meghatározhatók. (A IMAGE_SCN_LNK_COMDAT jelző a szakaszfejléc Szakaszjelölők mezőjében van beállítva.) A Kijelölés mező határozza meg, hogy a hivatkozás hogyan oldja fel a COMDAT-szakaszok több definícióját.

A COMDAT szakasz szakaszértékét tartalmazó első szimbólumnak a szakaszszimbólumnak kell lennie. Ennek a szimbólumnak a neve a szakasz, az Érték mező nulla, a kérdéses COMDAT szakasz szakaszszáma, a IMAGE_SYM_TYPE_NULL egyenlő Típus mező, a IMAGE_SYM_CLASS_STATIC egyenlő Osztály mező és egy kiegészítő rekord. A második szimbólum neve "COMDAT szimbólum", amelyet a hivatkozás a Kijelölés mezővel együtt használ.

A Kijelölés mező értékei alább láthatók.

Állandó Érték Leírás
IMAGE_COMDAT_SELECT_NODUPLICATES
1
Ha ez a szimbólum már definiálva van, a hivatkozás "megszorozva definiált szimbólumot" hibaüzenetet ad ki.
IMAGE_COMDAT_SELECT_ANY
2
Bármely szakasz, amely ugyanazt a COMDAT-szimbólumot definiálja, csatolható; a többi el lesz távolítva.
IMAGE_COMDAT_SELECT_SAME_SIZE
3
A hivatkozás egy tetszőleges szakaszt választ a szimbólum definíciói között. Ha az összes definíció nem azonos méretű, a rendszer "szorzatként definiált szimbólum" hibaüzenetet ad ki.
IMAGE_COMDAT_SELECT_EXACT_MATCH
4
A hivatkozás egy tetszőleges szakaszt választ a szimbólum definíciói között. Ha az összes definíció nem egyezik meg pontosan, a "szorzás által definiált szimbólum" hibaüzenet jelenik meg.
IMAGE_COMDAT_SELECT_ASSOCIATIVE
5
A szakasz csatolva van, ha egy másik COMDAT-szakasz van csatolva. Ezt a másik szakaszt a szakaszdefiníció segédjelrekordjának Szám mezőjében jelölik. Ez a beállítás olyan definíciók esetében hasznos, amelyek több szakaszban (például az egyikben lévő kódban és egy másikban lévő adatokban) lévő összetevőkkel rendelkeznek, de ahol az összeset össze kell kapcsolni vagy el kell vetni készletként. A szakasz másik szakaszának COMDAT-szakasznak kell lennie, amely lehet egy másik asszociatív COMDAT-szakasz. Az asszociatív COMDAT-szakasz szakasztársítási lánca nem tud hurkot alkotni. A szakasztársítási láncnak végül olyan COMDAT-szakaszra kell érkeznie, amely nem rendelkezik IMAGE_COMDAT_SELECT_ASSOCIATIVE beállítással.
IMAGE_COMDAT_SELECT_LARGEST
6
A linker a szimbólum összes definíciója közül a legnagyobb definíciót választja ki. Ha több definíció is ilyen méretű, a kettő közötti választás tetszőleges.

 

CLR-jogkivonat definíciója (csak objektum)

Ez a kiegészítő szimbólum általában a IMAGE_SYM_CLASS_CLR_TOKEN követi. A rendszer egy jogkivonatot társít a COFF szimbólumtábla névteréhez.

Kiegyenlít Méret Terület Leírás
0
1
bAuxType
IMAGE_AUX_SYMBOL_TYPE_TOKEN_DEF (1) kell lennie.
1
1
bReserved
Fenntartott, nullának kell lennie.
2
4
SymbolTableIndex
Annak a COFF-szimbólumnak a szimbólumindexe, amelyre ez a CLR-tokendefiníció hivatkozik.
6
12
Fenntartott, nullának kell lennie.

 

COFF sztringtábla

A COFF szimbólumtáblát közvetlenül követve a COFF sztringtábla látható. A táblázat helye a COFF fejlécben található szimbólumtábla címének megadásával és a szimbólum méretével megszorzott szimbólumok számának hozzáadásával található.

A COFF-sztringtábla elején 4 bájt található, amely a sztringtábla többi részének teljes méretét (bájtban) tartalmazza. Ez a méret magában foglalja magát a méretmezőt, így a hely értéke 4 lenne, ha nincsenek sztringek.

A méret után null értékű sztringek jelennek meg, amelyekre a COFF szimbólumtáblában lévő szimbólumok mutatnak.

Az attribútumtanúsítvány táblája (csak kép)

Az attribútumtanúsítványok attribútumtanúsítvány-táblázat hozzáadásával társíthatók egy képhez. Az attribútumtanúsítvány-tábla egy folytonos, négyszóval igazított attribútumtanúsítvány-bejegyzésekből áll. A fájl eredeti vége és az attribútumtanúsítvány-tábla eleje között nulla kitöltés van beszúrva az igazítás eléréséhez. Minden attribútumtanúsítvány-bejegyzés a következő mezőket tartalmazza.

Kiegyenlít Méret Terület Leírás
0
4
dwLength
Az attribútumtanúsítvány-bejegyzés hosszát adja meg.
4
2
wRevision
A tanúsítvány verziószámát tartalmazza. A részletekért tekintse meg a következő szöveget.
6
2
wCertificateType
A bCertificate tartalomtípusát adja meg. A részletekért tekintse meg a következő szöveget.
8
Lásd:
bCertificate
Tanúsítványt, például Authenticode-aláírást tartalmaz. A részletekért tekintse meg a következő szöveget.

 

Az Opcionális fejlécadattár Tanúsítványtábla bejegyzésének virtuális címértéke az első attribútumtanúsítvány-bejegyzés fájleltolása. A következő bejegyzésekhez a rendszer úgy fér hozzá, hogy az aktuális attribútumtanúsítvány-bejegyzés kezdetétől kezdve egy 8 bájtos többszörösre kerekíti a bejegyzés dwLength bájtjait. Ez addig folytatódik, amíg a lekerekített dwLength értékek összege nem egyenlő a Tanúsítvány tábla bejegyzés méretével a Választható fejlécadattárban. Ha a kerekített dwLength értékek összege nem egyenlő a Méret értékkel, akkor az attribútumtanúsítvány táblája vagy a Méret mező sérült.

Ha például a nem kötelező fejlécadattár tanúsítványtábla-bejegyzése a következőket tartalmazza:

virtual address = 0x5000
size = 0x1000

Az első tanúsítvány a lemezen lévő fájl kezdetétől 0x5000 eltoláskor kezdődik. Az attribútumtanúsítvány-bejegyzések végiglépése:

  1. Adja hozzá az első attribútumtanúsítvány dwLength értékét a kezdő eltoláshoz.
  2. A második attribútumtanúsítvány-bejegyzés eltolásának megkereséséhez kerekítse az 1. lépés értékét a legközelebbi 8 bájtos többszörösre.
  3. Adja hozzá a 2. lépés eltolási értékét a második attribútumtanúsítvány-bejegyzés dwLength értékéhez, és kerekítsen fel a legközelebbi 8 bájtos többszörösre a harmadik attribútumtanúsítvány-bejegyzés eltolásának meghatározásához.
  4. Ismételje meg a 3. lépést minden egymást követő tanúsítvány esetében, amíg a számított eltolás nem egyenlő 0x6000 (0x5000 kezdet + 0x1000 teljes méret), ami azt jelzi, hogy végigjárta a teljes táblát.

Másik lehetőségként a tanúsítványbejegyzések számbavételéhez meghívhatja a Win32 ImageEnumerateCertificates függvényt egy hurokban. A függvény referenciaoldalára mutató hivatkozásért lásd: Hivatkozások.

Az attribútumtanúsítványtáblák bejegyzései bármilyen tanúsítványtípust tartalmazhatnak, amennyiben a bejegyzés a megfelelő dwLength értékkel, egyedi wRevision értékkel és egyedi wCertificateType értékkel rendelkezik. A tanúsítványtábla bejegyzésének leggyakoribb típusa egy WIN_CERTIFICATE-struktúra, amely a Wintrust.h-ban van dokumentálva, és amelyet a szakasz további részében tárgyalunk.

A WIN_CERTIFICATE wRevision-tag beállításai közé tartoznak (de nem csak) a következők.

Érték Név Jegyzetek
0x0100
WIN_CERT_REVISION_1_0
1. verzió, a Win_Certificate-struktúra örökölt verziója. Csak az örökölt Authenticode-aláírások ellenőrzése céljából támogatott.
0x0200
WIN_CERT_REVISION_2_0
A 2. verzió a Win_Certificate struktúra aktuális verziója.

 

A WIN_CERTIFICATE wCertificateType tag beállításai közé tartoznak (de nem csak) az alábbi táblázat elemei. Vegye figyelembe, hogy egyes értékek jelenleg nem támogatottak.

Érték Név Jegyzetek
0x0001
WIN_CERT_TYPE_X509
a bCertificate X.509-tanúsítványt tartalmaz
Nem támogatott
0x0002
WIN_CERT_TYPE_PKCS_SIGNED_DATA
a bCertificate egy PKCS#7 SignedData struktúrát tartalmaz
0x0003
WIN_CERT_TYPE_RESERVED_1
Tartózkodó
0x0004
WIN_CERT_TYPE_TS_STACK_SIGNED
Terminálkiszolgálói protokoll veremtanúsítvány aláírása
Nem támogatott

 

A WIN_CERTIFICATE struktúra bCertificate tagja egy változó hosszúságú bájttömböt tartalmaz a wCertificateType által megadott tartalomtípussal. Az Authenticode által támogatott típus a WIN_CERT_TYPE_PKCS_SIGNED_DATA, egy PKCS#7 SignedData struktúra. Az Authenticode digitális aláírás formátumával kapcsolatos részletekért lásd: Windows Authenticode Portable Végrehajtható aláírás formátum.

Ha a bCertificate-tartalom nem egy négyszós határon végződik, az attribútumtanúsítvány-bejegyzés nullákkal van elválasztva a bCertificate végétől a következő négyszós határig.

A dwLength érték a véglegesített WIN_CERTIFICATE struktúra hossza, és a következőképpen van kiszámítva:

dwLength = offsetof(WIN_CERTIFICATE, bCertificate) + (size of the variable-length binary array contained within bCertificate)

Ennek a hossznak tartalmaznia kell az egyes WIN_CERTIFICATE szerkezetek négyszóval igazítására vonatkozó követelmény teljesítéséhez használt padding méretét:

dwLength += (8 - (dwLength & 7)) & 7;

Az Opcionális fejléc adatkönyvtárak tanúsítványtábla bejegyzésében megadott tanúsítványtáblaméret (csak kép) tartalmazza a kitöltést.

Az ImageHlp API-val kapcsolatos további információk a tanúsítványok pe-fájlokból való számbavételéről, hozzáadásáról és eltávolításáról: ImageHlp Functions.

Tanúsítványadatok

Az előző szakaszban leírtaknak megfelelően az attribútumtanúsítványtáblában szereplő tanúsítványok bármilyen tanúsítványtípust tartalmazhatnak. Azok a tanúsítványok, amelyek biztosítják a PE-fájlok integritását, pe-lemezkép kivonatot tartalmazhatnak.

A PE-rendszerkép kivonata (vagy fájlkivonata) hasonló a fájl ellenőrzőösszegéhez, mert a kivonatoló algoritmus olyan üzenetkivonatot hoz létre, amely egy fájl integritásához kapcsolódik. Az ellenőrzőösszegeket azonban egy egyszerű algoritmus hozza létre, és elsősorban annak észlelésére szolgál, hogy a lemezen lévő memóriablokk hibás lett-e, és az ott tárolt értékek sérültek-e. A fájlkivonatok hasonlóak az ellenőrzőösszeghez, mivel a fájlsérülést is észleli. A legtöbb ellenőrzőösszeg-algoritmussal ellentétben azonban nagyon nehéz úgy módosítani egy fájlt, hogy nem módosítja a fájlkivonatot az eredeti módosítatlan értékről. A fájlkivonatok így képesek észlelni a fájlok szándékos és még finom módosításait is, például a vírusok, hackerek vagy trójai programok által bevezetett módosításokat.

Ha a tanúsítvány tartalmazza, a rendszerkép-kivonatnak ki kell zárnia a PE-rendszerkép bizonyos mezőit, például az Ellenőrzőösszeget és a Tanúsítványtábla bejegyzést az opcionális fejlécadat-könyvtárakban. Ennek az az oka, hogy a tanúsítvány hozzáadása módosítja ezeket a mezőket, és más kivonatértéket eredményezne.

A Win32 ImageGetDigestStream függvény egy cél PE-fájlból származó adatfolyamot biztosít, amellyel kivonatolási függvényeket használhat. Ez az adatfolyam konzisztens marad, ha tanúsítványokat ad hozzá vagy távolít el egy PE-fájlból. Az ImageGetDigestStreamnek átadott paraméterek alapján a PE-rendszerképből származó egyéb adatok kihagyhatók a kivonatszámításból. A függvény referenciaoldalára mutató hivatkozásért lásd: Hivatkozások.

Delay-Load Táblák importálása (csak kép)

Ezeket a táblákat hozzáadtuk a rendszerképhez, hogy egységes mechanizmust biztosítsunk az alkalmazások számára, amely késlelteti a DLL betöltését az adott DLL-be való első hívásig. A táblák elrendezése megegyezik a 6.4. Itt csak néhány részletet ismertetünk.

A Delay-Load címtártábla

A késleltetett betöltési könyvtártábla az importálási címtártábla megfelelője. Lekérhető az opcionális fejlécadat-könyvtárak listájában (200. eltolás) található Késleltető importálás leíró bejegyzésével. A táblázat a következőképpen van elrendezve:

Kiegyenlít Méret Terület Leírás
0
4
Attribútumok
Nullának kell lennie.
4
4
Név
A betöltendő DLL nevének RVA-je. A név a kép írásvédett adatszakaszában található.
8
4
Modulfogópont
A modul RVA-jának leírója (a kép adatszakaszában) késleltetni szeretné a DLL-t. A késleltetési terhelés kezelésére szolgáló rutin a tároláshoz használja.
12
4
Címtábla importálásának késleltetése
A késleltetett betöltési importálási címtábla RVA-ja. További információ: Késleltetett importálási címtábla (IAT).
16
4
Névtábla importálásának késleltetése
A delay-load névtábla RVA-ja, amely tartalmazza a betöltendő importálások nevét. Ez megegyezik az importálási névtábla elrendezésével. További információ: Tipp/Névtábla.
20
4
Kötött késleltetésű importálási táblázat
A kötött késleltetési-betöltési címtábla RVA-ja, ha létezik.
24
4
Késési importálási tábla eltávolítása
Ha létezik, a késési terhelés címtáblájának RVA-ja. Ez a késés importálási címtáblájának pontos másolata. Ha a hívó eltávolítja a DLL-t, ezt a táblát vissza kell másolni a késés importálási címtáblája fölé, hogy a DLL-be irányuló későbbi hívások továbbra is helyesen használják a csonkítási mechanizmust.
28
4
Időbélyegző
Annak a DLL-nek az időbélyege, amelyhez a rendszerkép hozzá lett kötve.

 

Az ebben az adatstruktúrában hivatkozott táblák ugyanúgy vannak rendszerezve és rendezve, mint a hagyományos importok esetében. További részletekért lásd az .idata szakaszt.

Tulajdonságok

Egyelőre nincsenek definiálva attribútumjelölők. A hivatkozás nullára állítja ezt a mezőt a képen. Ez a mező az új mezők jelenlétének jelzésével bővíthető a rekorddal, vagy viselkedést jelezhet a késleltetési vagy a kiürítési segédfüggvényekre.

Név

A késleltetni kívánt DLL neve a kép írásvédett adatszakaszában található. A hivatkozás az szName mezőn keresztül történik.

Modulfogópont

A késleltetni kívánt DLL leírója a kép adatszakaszában található. A phmod mező a fogópontra mutat. A megadott késleltetés-betöltési segéd ezen a helyen tárolja a leírót a betöltött DLL-ben.

Címtábla importálásának késleltetése

A késleltetett importálási címtáblára (IAT) a késés importálási leírója hivatkozik a pIAT mezőn keresztül. A késleltetési-betöltési segéd frissíti ezeket a mutatókat a valós belépési pontokkal, így a csonkok már nem szerepelnek a hívási ciklusban. A függvénymutatók a kifejezéssel pINT->u1.Functionérhetők el.

Névtábla importálásának késleltetése

A késés importálási névtáblája (INT) tartalmazza a betöltést igénylő importálások nevét. Ezek ugyanúgy vannak rendezve, mint az IAT függvénymutatói. Ezek ugyanazokból a struktúrákból állnak, mint a standard INT, és a kifejezéssel pINT->u1.AddressOfData->Name[0]érhetők el.

Késleltetett importálási címtábla és időbélyeg

A késleltetett importálási címtábla (BIAT) IMAGE_THUNK_DATA elemekből álló választható táblázat, amelyet a folyamat utáni kötési fázis a késleltetett betöltési címtártábla időbélyegmezőjével együtt használ.

Importálási címtábla késleltetése

A késleltetési eltávolítás importálási címtáblája (UIAT) IMAGE_THUNK_DATA elemekből álló választható táblázat, amelyet a kiürítési kód egy explicit eltávolítási kérelem kezelésére használ. Inicializált adatokból áll az írásvédett szakaszban, amely az eredeti IAT pontos másolata, amely a kódot a késleltetési terhelési hibákra hivatkozott. A törlési kérelemben a kódtár felszabadítható, a *phmod törlődik, és a felhasználói felület az IAT-en keresztül íródott, hogy mindent visszaállítson az előzetes betöltési állapotba.

Speciális szakaszok

A tipikus COFF-szakaszok olyan kódot vagy adatokat tartalmaznak, amelyek összekapcsolják és a Microsoft Win32-betöltők a szakasz tartalmának speciális ismerete nélkül dolgoznak fel. A tartalom csak a csatolt vagy végrehajtott alkalmazásra vonatkozik.

Egyes COFF-szakaszok azonban speciális jelentéssel rendelkeznek, ha objektumfájlokban vagy képfájlokban találhatók. Az eszközök és a betöltők azért ismerik fel ezeket a szakaszokat, mert speciális jelölők vannak beállítva a szakaszfejlécben, mert a kép speciális helyei nem kötelező fejlécpontként rájuk mutatnak, vagy mert maga a szakasznév a szakasz egy speciális funkcióját jelzi. (Még akkor is, ha maga a szakasznév nem jelzi a szakasz speciális függvényét, a szakasz nevét konvenciók határozzák meg, így a specifikáció szerzői minden esetben hivatkozhatnak egy szakasznévre.)

A fenntartott szakaszok és attribútumaik leírását az alábbi táblázat ismerteti, majd részletes leírást talál a végrehajtható szakaszokban megmaradó szakasztípusokról, valamint a bővítmények metaadatait tartalmazó szakasztípusokról.

Szakasz neve Tartalom Jellemzők
.Bss
Nem inicializált adatok (ingyenes formátum)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.cormeta
CLR-metaadatok, amelyek azt jelzik, hogy az objektumfájl felügyelt kódot tartalmaz
IMAGE_SCN_LNK_INFO
.adat
Inicializált adatok (ingyenes formátum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.debug$F
Létrehozott FPO hibakeresési információk (csak objektum, csak x86-architektúra, és elavult)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$P
Előre lefordított hibakeresési típusok (csak objektum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$S
Hibakeresési szimbólumok (csak objektum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.debug$T
Hibakeresési típusok (csak objektum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.drective
Linker beállításai
IMAGE_SCN_LNK_INFO
.edata
Táblák exportálása
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.idata
Táblák importálása
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.idlsym
Tartalmazza a regisztrált SEH-t (csak kép) az IDL-attribútumok támogatásához. További információ: "IDL-attribútumok" a témakör végén található hivatkozásokban .
IMAGE_SCN_LNK_INFO
.pdata
Kivételadatok
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.rdata
Írásvédett inicializált adatok
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.reloc
Képáthelyezések
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
.rsrc
Erőforráskönyvtár
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ
.sbss
GP-relatív nemiializált adatok (ingyenes formátum)
IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL A IMAGE_SCN_GPREL jelzőt csak IA64-architektúrákhoz kell beállítani; ez a jelző más architektúrákra nem érvényes. A IMAGE_SCN_GPREL jelző csak objektumfájlokra vonatkozik; ha ez a szakasztípus megjelenik egy képfájlban, a IMAGE_SCN_GPREL jelzőt nem szabad beállítani.
.sdata
GP-relatív inicializált adatok (ingyenes formátum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | IMAGE _SCN_GPREL A IMAGE_SCN_GPREL jelzőt csak IA64-architektúrákhoz kell beállítani; ez a jelző más architektúrákra nem érvényes. A IMAGE_SCN_GPREL jelző csak objektumfájlokra vonatkozik; ha ez a szakasztípus megjelenik egy képfájlban, a IMAGE_SCN_GPREL jelzőt nem szabad beállítani.
.srdata
GP-relatív írásvédett adatok (ingyenes formátum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE _SCN_GPREL A IMAGE_SCN_GPREL jelzőt csak IA64-architektúrákhoz kell beállítani; ez a jelző más architektúrákra nem érvényes. A IMAGE_SCN_GPREL jelző csak objektumfájlokra vonatkozik; ha ez a szakasztípus megjelenik egy képfájlban, a IMAGE_SCN_GPREL jelzőt nem szabad beállítani.
.sxdata
Regisztrált kivételkezelő adatok (csak ingyenes formátum és csak x86/object)
IMAGE_SCN_LNK_INFO Az objektumfájlban lévő kód által hivatkozott kivételkezelők szimbólumindexét tartalmazza. A szimbólum lehet egy UNDEF szimbólum vagy egy, az adott modulban definiált szimbólum.
.SMS
Végrehajtható kód (ingyenes formátum)
IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ
.tls
Szálalapú tárolás (csak objektum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.tls$
Szálalapú tárolás (csak objektum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.vsdata
GP-relatív inicializált adatok (ingyenes formátum és csak ARM, SH4 és Thumb architektúrák esetén)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE
.xdata
Kivételadatok (ingyenes formátum)
IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ

 

Az itt felsorolt szakaszok némelyike "csak objektum" vagy "csak kép" megjelöléssel jelzi, hogy a speciális szemantikák csak az objektumfájlok vagy képfájlok esetében relevánsak. Előfordulhat, hogy egy "csak kép" megjelölésű szakasz továbbra is megjelenik egy objektumfájlban a képfájlba való bejutás módjaként, de a szakasznak nincs külön jelentése a hivatkozásra, csak a képfájl-betöltőre.

A .debug szakasz

A .debug szakasz az objektumfájlokban a fordító által létrehozott hibakeresési információkat, a képfájlokban pedig az összes létrehozott hibakeresési információt tartalmazza. Ez a szakasz az objektum- és képfájlok hibakeresési információinak csomagolását ismerteti.

A következő szakasz a hibakeresési könyvtár formátumát ismerteti, amely bárhol lehet a képen. A következő szakaszok a hibakeresési információkat tartalmazó objektumfájlok "csoportjait" ismertetik.

A csatoló alapértelmezett értéke, hogy a hibakeresési információk nincsenek leképezve a kép címterébe. A .debug szakasz csak akkor létezik, ha a hibakeresési adatok leképezve találhatók a címtérben.

Címtár hibakeresése (csak kép)

A képfájlok egy nem kötelező hibakeresési könyvtárat tartalmaznak, amely jelzi, hogy a hibakeresési információk milyen formában és hol találhatók. Ez a könyvtár olyan hibakeresési címtárbejegyzésekből álló tömbből áll, amelyek helyét és méretét a rendszerkép nem kötelező fejlécében jelzi.

A hibakeresési könyvtár lehet egy elvethető .debug szakaszban (ha van ilyen), vagy szerepelhet a képfájl bármely más szakaszában, vagy egyáltalán nem szerepelhet egy szakaszban.

Minden hibakeresési címtárbejegyzés azonosítja a hibakeresési információblokk helyét és méretét. A megadott RVA nulla lehet, ha a hibakeresési információkat nem fedi le egy szakaszfejléc (azaz a képfájlban található, és nem a futásidejű címtérbe van leképezve). Ha le van képezve, az RVA a címe.

A hibakeresési címtárbejegyzések formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
4
Jellemzők
Fenntartott, nullának kell lennie.
4
4
TimeDateStamp
A hibakeresési adatok létrehozásának időpontja és dátuma.
8
2
MajorVersion
A hibakeresési adatformátum főverziószáma.
10
2
MinorVersion
A hibakeresési adatformátum alverziószáma.
12
4
Típus
A hibakeresési információk formátuma. Ez a mező több hibakereső támogatását teszi lehetővé. További információ: Hibakeresés típusa.
16
4
SizeOfData
A hibakeresési adatok mérete (magában a hibakeresési könyvtárban nem).
20
4
AddressOfRawData
A hibakeresési adatok címe betöltéskor a képbázishoz viszonyítva.
24
4
PointerToRawData
A hibakeresési adatokra mutató fájlmutató.

 

Hibakeresés típusa

A hibakeresési címtárbejegyzés Típus mezőjéhez a következő értékek vannak definiálva:

Állandó Érték Leírás
IMAGE_DEBUG_TYPE_UNKNOWN
0
Ismeretlen érték, amelyet az összes eszköz figyelmen kívül hagy.
IMAGE_DEBUG_TYPE_COFF
1
A COFF hibakeresési információi (sorszámok, szimbólumtáblázat és sztringtábla). Az ilyen típusú hibakeresési információkra a fájlfejlécek mezői is rámutatnak.
IMAGE_DEBUG_TYPE_CODEVIEW
2
A Visual C++ hibakeresési információi.
IMAGE_DEBUG_TYPE_FPO
3
A keretmutató kihagyása (FPO) információi. Ez az információ bemutatja a hibakeresőnek, hogyan értelmezze a nem megfelelő veremkereteket, amelyek az EBP-regisztrációt nem keretmutatóként használják.
IMAGE_DEBUG_TYPE_MISC
4
A DBG-fájl helye.
IMAGE_DEBUG_TYPE_EXCEPTION
5
A .pdata szakasz másolata.
IMAGE_DEBUG_TYPE_FIXUP
6
Fenntartott.
IMAGE_DEBUG_TYPE_OMAP_TO_SRC
7
A kép RVA-jának leképezése a forrásképben lévő RVA-ra.
IMAGE_DEBUG_TYPE_OMAP_FROM_SRC
8
A forrásképpel rendelkező RVA-ból a kép RVA-jának leképezése.
IMAGE_DEBUG_TYPE_BORLAND
9
Borlandnak van fenntartva.
IMAGE_DEBUG_TYPE_RESERVED10
10
Fenntartott.
IMAGE_DEBUG_TYPE_CLSID
11
Fenntartott.
IMAGE_DEBUG_TYPE_REPRO
16
PE determinizmus vagy reprodukálhatóság.
Meghatározatlan
17
A hibakeresési információk a PointerToRawData által megadott helyen található PE-fájlba lesznek beágyazva.
Meghatározatlan
19
A PE/COFF fájl létrehozásához használt szimbólumfájl tartalmának titkosítási kivonatát tárolja.
IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 Kiterjesztett DLL-jellemzők bitjei.

 

Ha a Típus mező IMAGE_DEBUG_TYPE_FPO értékre van állítva, a nyers adatok hibakeresése olyan tömb, amelyben minden tag egy függvény veremkeretét írja le. A képfájl nem minden függvényének kell FPO-információval rendelkeznie, annak ellenére, hogy a hibakeresés típusa FPO. Azok a függvények, amelyek nem rendelkeznek FPO-információkkal, feltételezzük, hogy normál veremkerettel rendelkeznek. Az FPO-információk formátuma a következő:

#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;

A IMAGE_DEBUG_TYPE_REPRO típusú bejegyzés jelenléte azt jelzi, hogy a PE-fájl úgy van létrehozva, hogy determinizmust vagy reprodukálhatóságot érjen el. Ha a bemenet nem változik, a kimeneti PE-fájl garantáltan bit-for-bit azonos lesz, függetlenül attól, hogy mikor vagy hol készül a PE. A PE-fájl különböző dátum-/időbélyegmezői egy számított kivonatértékből származó részekkel vagy bitekkel vannak kitöltve, amelyek bemenetként PE-fájltartalmat használnak, és így már nem a PE-fájl vagy a pe-fájlon belüli kapcsolódó konkrét adatok tényleges dátumát és idejét jelölik. A hibakeresési bejegyzés nyers adatai üresek lehetnek, vagy tartalmazhatnak számított kivonatértéket, amelyet egy négy bájtos érték előz meg, amely a kivonatérték hosszát jelöli.

Ha a Típus mező IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS értékre van állítva, a hibakeresési nyers adatok kiterjesztett DLL-jellemzőket tartalmaznak, a kép opcionális fejlécében beállíthatók mellett. Lásd a DLL-jellemzőket a Nem kötelező fejléc Windows-Specific mezők (csak kép) szakaszban.

Kiterjesztett DLL-jellemzők

A kiterjesztett DLL-jellemzők bitjeihez a következő értékek vannak definiálva.

Állandó Érték Leírás
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 A kép a Control-Flow Enforcement Technology (CET) Shadow Stack kompatibilis.
IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 Az összes képkódszakaszban található elágaztatási célokat az előremenő vezérlőfolyamat-integritásvédelmi utasítások, például x86 CET-Indirect Branch Tracking (IBT) vagy ARM Branch Target Identification (BTI) utasítások fűzik. Ezt a bitet a Windows nem használja.

.debug$F (csak objektum)

Az ebben a szakaszban szereplő adatokat a Visual C++ 7.0-s és újabb verziójában felváltotta a .debug$S alszakaszba kibocsátott adatok szélesebb köre.

Az objektumfájlok tartalmazhatnak .debug$F szakaszokat, amelyek tartalma egy vagy több FPO_DATA rekord (a keretmutató kihagyott adatai). Lásd: "IMAGE_DEBUG_TYPE_FPO" a hibakeresési típusban.

A linker felismeri ezeket a .debug$F rekordokat. Ha hibakeresési információk jönnek létre, a hivatkozáskészítő az RVA eljárás szerint rendezi a FPO_DATA rekordokat, és létrehoz egy hibakeresési címtárbejegyzést.

A fordító nem hozhat létre FPO rekordokat szabványos keretformátumú eljárásokhoz.

.debug$S (csak objektum)

Ez a szakasz a Visual C++ hibakeresési információkat (szimbolikus információkat) tartalmazza.

.debug$P (csak objektum)

Ez a szakasz a Visual C++ hibakeresési információkat (előre összeállított információkat) tartalmazza. Ezek közös típusok az összes olyan objektum között, amelyet az ezzel az objektummal létrehozott előre összeállított fejléc használatával fordítottak le.

.debug$T (csak objektum)

Ez a szakasz a Visual C++ hibakeresési adatait (típusinformációkat) tartalmazza.

A Linker támogatása a Microsoft hibakeresési adataihoz

A hibakeresési információk támogatásához a linker:

  • Összegyűjti az összes releváns hibakeresési adatot a .debug$F, debug$S, .debug$P és .debug$T szakaszokból.

  • Feldolgozza ezeket az adatokat a hivatkozáskezelő által létrehozott hibakeresési adatokkal együtt a PDB-fájlba, és létrehoz egy hibakeresési könyvtárbejegyzést, amely hivatkozik rá.

A .drectve szakasz (csak objektum)

A szakasz egy irányelvszakasz, ha a szakaszfejlécben a IMAGE_SCN_LNK_INFO jelző van beállítva, és .drectve szakasznévvel rendelkezik. A linker eltávolít egy .drectve szakaszt az információk feldolgozása után, így a szakasz nem jelenik meg a csatolt képfájlban.

A .drectve szakasz olyan szövegsztringből áll, amely ANSI-ként vagy UTF-8-ként kódolható. Ha az UTF-8 bájtsorrend-jelölő (BOM, egy 0xEF, 0xBB és 0xBF álló három bájtos előtag) nincs jelen, az irányelvsztringet ANSI-ként értelmezi a rendszer. Az irányelvsztring szóközök által elválasztott összekapcsoló lehetőségek sorozata. Minden beállítás tartalmaz egy kötőjelet, a beállítás nevét és bármely megfelelő attribútumot. Ha egy beállítás szóközöket tartalmaz, a beállítást idézőjelek közé kell tenni. A .drectve szakasz nem rendelkezhet áthelyezéssel vagy sorszámmal.

A .edata szakasz (csak kép)

Az .edata nevű exportálási adatszakasz olyan szimbólumokról tartalmaz információkat, amelyeket más képek dinamikus csatolással érhetnek el. Az exportált szimbólumok általában a DLL-ekben találhatók, de a DLL-ek is importálhatnak szimbólumokat.

Az exportálási szakasz általános szerkezetének áttekintését az alábbiakban ismertetjük. A leírt táblák általában egybefüggőek a fájlban a megjelenített sorrendben (bár ez nem kötelező). A szimbólumok sorszámként való exportálásához csak az exportálási címtártábla és az exportálási címtábla szükséges. (A sorszám olyan exportálás, amelyet közvetlenül az exportálási címtábla indexe ér el.) A névmutató táblázat, a sorszámtábla és az exportálási névtábla mind az exportálási nevek használatát támogatja.

Tábla neve Leírás
Címtártábla exportálása
Egy táblázat, amely csak egy sort tartalmaz (a hibakeresési könyvtárral ellentétben). Ez a táblázat a többi exportálási tábla helyét és méretét jelzi.
Címtábla exportálása
Exportált szimbólumok RVA-jainak tömbje. Ezek az exportált függvények és adatok tényleges címei a végrehajtható kódban és adatszakaszokban. Más képfájlok a táblához tartozó index (sorszám) használatával, vagy igény szerint a sorszámnak megfelelő nyilvános név használatával is importálhatnak szimbólumokat, ha egy nyilvános név van meghatározva.
Névmutató táblázata
A nyilvános exportálási nevekre mutató mutatótömb növekvő sorrendben rendezve.
Sorszámtábla
A névmutató-táblázat tagjainak megfelelő sorszámok tömbje. A levelezés pozíció szerint történik; ezért a névmutató táblának és a sorszámtáblának azonos számú taggal kell rendelkeznie. Minden egyes sorszám egy index az exportálási címtáblában.
Névtábla exportálása
Null értékű ASCII-sztringek sorozata. A névmutató táblázatának tagjai erre a területre mutatnak. Ezek a nevek azok a nyilvános nevek, amelyeken keresztül a szimbólumok importálása és exportálása történik; ezek nem feltétlenül ugyanazok, mint a képfájlban használt magánnevek.

 

Amikor egy másik képfájl név alapján importál egy szimbólumot, a Win32-betöltő a névmutató táblában keres egy megfelelő sztringet. Ha talál egyező sztringet, a rendszer a kapcsolódó sorszámot a sorszámtábla megfelelő tagjának keresésével azonosítja (vagyis a sorszámtábla azon tagját, amelynek indexe megegyezik a névmutató táblában található sztringmutatóval). Az eredményül kapott sorszám egy index az exportálási címtáblába, amely megadja a kívánt szimbólum tényleges helyét. Minden exportálási szimbólum egy sorszámmal érhető el.

Ha egy másik képfájl sorszám szerint importál egy szimbólumot, nem szükséges a névmutató táblában keresni egyező sztringet. A rendeletek közvetlen használata ezért hatékonyabb. Az exportálási nevek azonban könnyebben megjegyezhetők, és nem követelik meg a felhasználótól, hogy megismerje a szimbólum táblaindexét.

Címtártábla exportálása

Az exportálási szimbólum információi az exportálási könyvtár táblájával kezdődnek, amely az exportálási szimbólumok fennmaradó adatait írja le. Az exportálási címtártábla címadatokat tartalmaz, amelyek a lemezkép belépési pontjaira irányuló importálás feloldására szolgálnak.

Kiegyenlít Méret Terület Leírás
0
4
Jelölők exportálása
Fenntartott, 0-nak kell lennie.
4
4
Idő-/dátumbélyeg
Az exportálási adatok létrehozásának időpontja és dátuma.
8
2
Főverzió
A főverzió száma. A fő- és alverziószámokat a felhasználó állíthatja be.
10
2
Alverzió
Az alverzió száma.
12
4
Név RVA
A DLL nevét tartalmazó ASCII-sztring címe. Ez a cím a képbázishoz képest van.
16
4
Ordinal Base
A képen szereplő exportálások kezdő sorszáma. Ez a mező az exportálási címtábla kezdő sorszámát adja meg. Általában 1 értékre van állítva.
20
4
Címtábla bejegyzései
Az exportálási címtáblában lévő bejegyzések száma.
24
4
Névmutatók száma
A névmutató táblában lévő bejegyzések száma. Ez a sorszámtábla bejegyzéseinek száma is.
28
4
Címtábla RVA exportálása
Az exportálási címtábla címe a képbázishoz viszonyítva.
32
4
Névmutató RVA
Az exportálási név mutatótáblájának címe a képbázishoz viszonyítva. A tábla méretét a Névmutatók száma mező adja meg.
36
4
Ordinal Table RVA
A sorszámtábla címe a képbázishoz viszonyítva.

 

Címtábla exportálása

Az exportálási címtábla az exportált belépési pontok címét, valamint az exportált adatokat és abszolút értékeket tartalmazza. A rendszer egy sorszámot használ indexként az exportálási címtáblába.

Az exportálási címtábla minden bejegyzése egy mező, amely az alábbi táblázatban szereplő két formátum egyikét használja. Ha a megadott cím nem szerepel az exportálási szakaszban (az opcionális fejlécben megadott cím és hossz alapján), a mező egy exportálási RVA, amely a kódban vagy adatokban szereplő tényleges cím. Ellenkező esetben a mező egy továbbító RVA, amely egy szimbólumot nevez el egy másik DLL-ben.

Kiegyenlít Méret Terület Leírás
0
4
RVA exportálása
Az exportált szimbólum címe a memóriába való betöltésekor a képbázishoz viszonyítva. Például egy exportált függvény címe.
0
4
Továbbító RVA
Az exportálási szakaszban lévő null értékű ASCII-sztringre mutató mutató. Ennek a sztringnek az exportálási tábla adatkönyvtár-bejegyzése által megadott tartományon belül kell lennie. Lásd : Választható fejlécadat-könyvtárak (csak kép). Ez a sztring megadja a DLL nevét és az exportálás nevét (például "MYDLL.expfunc") vagy a DLL nevét és az exportálás sorszámát (például "MYDLL.#27").

 

A továbbító RVA exportál egy definíciót más rendszerképből, így úgy jelenik meg, mintha az aktuális rendszerkép exportálta volna. Így a szimbólum egyidejűleg importálódik és exportálódik.

A Windows XP Kernel32.dll például a "HeapAlloc" nevű exportálást az "NTDLL" sztringre továbbítja. RtlAllocateHeap." Ez lehetővé teszi az alkalmazások számára, hogy a Windows XP-specifikus modult Ntdll.dll anélkül, hogy az importálási hivatkozásokat tartalmazták volna. Az alkalmazás importálási táblája csak a Kernel32.dllhivatkozik. Ezért az alkalmazás nem a Windows XP-hez tartozik, és bármely Win32 rendszeren futtatható.

Névmutató táblázat exportálása

Az exportálási névmutató táblázata az exportálási névtáblába tartozó címek (RVA-k) tömbje. A mutatók egyenként 32 bitből állnak, és a képbázishoz viszonyítva vannak. Az egérmutatók lexikális sorrendben vannak rendezve, hogy lehetővé tegyék a bináris kereséseket.

Az exportálási név csak akkor van definiálva, ha az exportálási név mutatótáblája mutatót tartalmaz.

Sorszámtábla exportálása

Az exportálási sorszámtábla egy 16 bites, elfogulatlan indexeket tartalmazó tömb az exportálási címtáblában. Az ordinálisokat az exportálási címtártábla Sorszám alap mezőjének torzítja. Más szóval a sorszámbázist ki kell vonni a sorszámokból a valódi indexek exportálási címtáblába való beolvasásához.

Az exportálási névmutató táblázata és az exportálási sorszámtábla két párhuzamos tömböt alkot, amelyek elválasztva vannak a természetes mezők igazításához. Ez a két tábla tulajdonképpen egy táblaként működik, amelyben a Névmutató exportálása oszlop egy nyilvános (exportált) névre mutat, az Export Ordinal oszlop pedig az adott nyilvános név megfelelő sorszámát adja meg. Az exportálási név mutatótáblájának egy tagja és az exportálási sorszámtábla egy tagja ugyanazzal a pozícióval (indexszel) van társítva a megfelelő tömbökben.

Így amikor az exportálási név mutatótábláját keresik, és az i pozícióban egyező sztring található, a szimbólum RVA-jának és torzított sorszámának megkeresésére szolgáló algoritmus a következő:

i = Search_ExportNamePointerTable (name);
ordinal = ExportOrdinalTable [i];

rva = ExportAddressTable [ordinal];
biased_ordinal = ordinal + OrdinalBase;

Ha egy szimbólumot (elfogult) sorszám alapján keres, a szimbólum RVA-jának és nevének megkeresésére szolgáló algoritmus a következő:

ordinal = biased_ordinal - OrdinalBase;
i = Search_ExportOrdinalTable (ordinal);

rva = ExportAddressTable [ordinal];
name = ExportNameTable [i];

Névtábla exportálása

Az exportálási névtábla az exportálási név mutatótáblája által mutatott tényleges sztringadatokat tartalmazza. A táblázatban szereplő sztringek nyilvános nevek, amelyeket más képek használhatnak a szimbólumok importálásához. Ezek a nyilvános exportálási nevek nem feltétlenül egyeznek meg a szimbólumok saját képfájljában és forráskódjában található privát szimbólumnevekkel, bár lehetnek.

Minden exportált szimbólumnak van egy sorszámértéke, amely csak az exportálási címtáblában lévő index. Az exportálási nevek használata azonban nem kötelező. Néhány, az összes vagy egyik exportált szimbólumnak lehet exportálási neve. Az exportálási névvel rendelkező exportált szimbólumok esetében az exportálási név mutatótáblájában és az exportálási sorszámtáblában lévő megfelelő bejegyzések együttesen társítják az egyes neveket egy sorszámmal.

Az exportálási névtábla struktúrája a változó hosszúságú null értékű ASCII-sztringek sorozata.

Az .idata szakasz

Minden szimbólumot importáló képfájlnak, beleértve gyakorlatilag az összes végrehajtható (EXE) fájlt, .idata szakasza van. Az importálási információk tipikus fájlelrendezése a következő:

  • Címtártábla

    Null könyvtárbejegyzés

  • DLL1 – Keresési tábla importálása

    Nulla

  • DLL2 – Keresési tábla importálása

    Nulla

  • DLL3 – Keresési tábla importálása

    Nulla

  • Hint-Name táblázat

Címtártábla importálása

Az importálási információk az importálási címtártáblával kezdődnek, amely az importálási információk fennmaradó részét ismerteti. Az importálási címtártábla címadatokat tartalmaz, amelyek a DLL-lemezkép belépési pontjaira mutató javításokra mutató hivatkozások feloldására szolgálnak. Az importálási könyvtártábla egy importálási könyvtárbejegyzésekből álló tömbből áll, amely minden olyan DLL-hez egy bejegyzést tartalmaz, amelyre a rendszerkép hivatkozik. Az utolsó könyvtárbejegyzés üres (null értékekkel kitöltve), amely a címtártábla végét jelzi.

Minden importálási könyvtárbejegyzés formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
4
Keresési tábla RVA importálása (jellemzők)
Az importálási keresési tábla RVA-ja. Ez a tábla minden importáláshoz tartalmaz egy nevet vagy egy sorszámot. (A "Jellemzők" nevet használja a Winnt.h, de már nem írja le ezt a mezőt.)
4
4
Idő-/dátumbélyeg
A 0 értékre beállított bélyeg, amíg a kép meg nem kötött. A kép kötése után ez a mező a DLL idő-/adatbélyegére van állítva.
8
4
Továbbító lánca
Az első továbbító hivatkozás indexe.
12
4
Név RVA
A DLL nevét tartalmazó ASCII-sztring címe. Ez a cím a képbázishoz képest van.
16
4
Címtábla importálása RVA (thunk table)
Az importálási címtábla RVA-ja. A tábla tartalma megegyezik az importálási keresési tábla tartalmával, amíg a rendszerkép meg nem kötött.

 

Keresési tábla importálása

Az importálási keresőtáblák a PE32-hez 32 bites számokból álló tömbök, a PE32+-hez pedig 64 bites számokból álló tömbök. Minden bejegyzés az alábbi táblázatban leírt bitmező formátumot használja. Ebben a formátumban a PE32 esetében a 31. bit a legjelentősebb bit, a 63. bit pedig a PE32+ legfontosabb bitje. Ezeknek a bejegyzéseknek a gyűjteménye egy adott DLL-ből származó összes importálást ismerteti. Az utolsó bejegyzés nulla (NULL) értékre van állítva a tábla végét jelző értékre.

Bit(ek) Méret Bitmező Leírás
31/63
1
Ordinal/Name Flag
Ha ez a bit be van állítva, az importálás sorszám szerint történik. Ellenkező esetben az importálás név szerint. A bit a PE32 0x80000000, a PE32+ 0x8000000000000000.
15-0
16
Sorszámnév
Egy 16 bites sorszám. Ez a mező csak akkor használatos, ha az Ordinal/Name Flag bit mező 1 (importálás sorszám szerint). A 30-15 vagy a 62-15 bitnek 0-nak kell lennie.
30-0
31
Tipp/Névtábla RVA
31 bites RVA egy tipp/név táblabejegyzésből. Ezt a mezőt csak akkor használja a rendszer, ha az Ordinal/Name Flag bit mező 0 (importálás név alapján). PE32+ bit esetén a 62-31-nek nullának kell lennie.

 

Tipp/Névtábla

Egy tipp/név tábla elegendő a teljes importálási szakaszhoz. A tipp/név tábla minden bejegyzésének formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
2
Célzás
Index az exportálási név mutatótáblájába. Ezzel az értékkel először egyezést kísérel meg. Ha ez nem sikerül, bináris keresés történik a DLL exportálási névmutató tábláján.
2
változó
Név
Az importálandó nevet tartalmazó ASCII-sztring. Ezt a sztringet kell egyeztetni a DLL nyilvános nevével. Ez a sztring megkülönbözteti a kis- és nagybetűk értékét, és null bájttal végződik.
*
0 vagy 1
Kégli
Egy záró nulla-pad bájt, amely a záró null bájt után jelenik meg, ha szükséges, a következő bejegyzés páros határvonalon való igazításához.

 

Címtábla importálása

Az importálási címtábla szerkezete és tartalma megegyezik az importálási keresési táblaéval, amíg a fájl meg nem kötött. A kötés során az importálási címtáblában szereplő bejegyzések felülíródnak az importált szimbólumok 32 bites (PE32 esetén) vagy 64 bites (PE32+) címével. Ezek a címek a szimbólumok tényleges memóriacímei, bár technikailag még mindig "virtuális címeknek" nevezik őket. A betöltő általában feldolgozza a kötést.

A .pdata szakasz

A .pdata szakasz a kivételkezeléshez használt függvénytáblázat-bejegyzések tömbét tartalmazza. A képadattár kivételtáblázat-bejegyzése mutat rá. A bejegyzéseket a függvénycímek (az egyes szerkezetek első mezőjének) megfelelően kell rendezni, mielőtt a végleges képbe kerülnek. A célplatform határozza meg, hogy az alábbi három függvénytábla-bejegyzésformátum közül melyiket használja a rendszer.

32 bites MIPS-rendszerképek esetén a függvénytáblázat bejegyzései a következő formátumúak:

Kiegyenlít Méret Terület Leírás
0
4
Cím kezdőbetűje
A megfelelő függvény VA-ja.
4
4
Záró cím
A függvény végének VA-ja.
8
4
Kivételkezelő
A végrehajtandó kivételkezelő mutatója.
12
4
Kezelő adatai
A kezelőnek továbbadandó további információkra mutató mutató.
16
4
Prolog-végpont címe
A függvény prologjának végének VA-ja.

 

Az ARM, PowerPC, SH3 és SH4 Windows CE-platformok esetén a függvénytáblázat bejegyzései a következő formátumban vannak:

Kiegyenlít Méret Terület Leírás
0
4
Cím kezdőbetűje
A megfelelő függvény VA-ja.
4
8 bit
Prolog hossza
A függvény prologjában található utasítások száma.
4
22 bit
Függvény hossza
A függvény utasításainak száma.
4
1 bit
32 bites jelző
Ha be van állítva, a függvény 32 bites utasításokból áll. Ha nem egyértelmű, a függvény 16 bites utasításokból áll.
4
1 bit
Kivételjelző
Ha be van állítva, a függvényhez létezik kivételkezelő. Ellenkező esetben nincs kivételkezelő.

 

X64- és Itanium-platformok esetén a függvénytábla-bejegyzések formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
4
Cím kezdőbetűje
A megfelelő függvény RVA-ja.
4
4
Záró cím
A függvény végének RVA-ja.
8
4
Információ visszatekerése
A visszatekerés adatainak RVA-ja.

 

A .reloc szakasz (csak kép)

Az alapáthelyezés táblázata a képen szereplő összes alapáthelyezés bejegyzéseit tartalmazza. Az opcionális fejlécadat-könyvtárak Alapáthelyezés tábla mezőjében az alapáthelyezés táblában lévő bájtok száma látható. További információ: Opcionális fejlécadat-könyvtárak (csak kép). Az alapáthelyezés táblázat blokkokra van osztva. Minden blokk egy 4K-oldal alapáthelyezéseit jelöli. Minden blokknak 32 bites határvonalon kell kezdődnie.

A betöltő nem szükséges a csatolás által feloldott alapáthelyezések feldolgozásához, kivéve, ha a betöltési rendszerkép nem tölthető be a PE fejlécben megadott képbázisra.

Alapáthelyezés blokk

Az egyes alapáthelyezési blokkok a következő struktúrával kezdődnek:

Kiegyenlít Méret Terület Leírás
0
4
Lap RVA
A rendszer minden eltoláshoz hozzáadja a képbázist és az oldal RVA-t, hogy létrehozhassa azt a VA-t, ahol az alapáthelyezést alkalmazni kell.
4
4
Blokkméret
Az alapáthelyezés blokk bájtjainak teljes száma, beleértve az Oldal RVA és a Blokkméret mezőket, valamint a következő Típus/Eltolás mezőket.

 

A Blokkméret mezőt ezután tetszőleges számú Típus vagy Eltolás mezőbejegyzés követi. Minden bejegyzés egy WORD (2 bájt) és a következő struktúrával rendelkezik:

Kiegyenlít Méret Terület Leírás
0
4 bit
Típus
A WORD magas 4 bites verziójában tárolva egy érték, amely az alkalmazandó alapáthelyezés típusát jelzi. További információ: Alapáthelyezés-típusok.
0
12 bit
Ellensúlyoz
A WORD fennmaradó 12 bitjében tárolva a blokk Lap RVA mezőjében megadott kezdőcím eltolása. Ez az eltolás azt határozza meg, hogy hol kell alkalmazni az alapáthelyezést.

 

Az alapáthelyezés alkalmazásához a rendszer kiszámítja a különbséget az előnyben részesített alapcím és a rendszerkép tényleges betöltési helye között. Ha a rendszerkép az előnyben részesített bázison van betöltve, a különbség nulla, így az alapáthelyezéseket nem kell alkalmazni.

Alapáthelyezés-típusok

Állandó Érték Leírás
IMAGE_REL_BASED_ABSOLUTE
0
A rendszer kihagyja az alapáthelyezést. Ez a típus használható blokkok kitöltéséhez.
IMAGE_REL_BASED_HIGH
1
Az alapáthelyezés a különbség 16 bites értékét hozzáadja a 16 bites mezőhöz eltoláskor. A 16 bites mező egy 32 bites szó magas értékét jelöli.
IMAGE_REL_BASED_LOW
2
Az alapáthelyezés hozzáadja a különbség alacsony 16 bites értékét a 16 bites mezőhöz eltoláskor. A 16 bites mező egy 32 bites szó alsó felét jelöli.
IMAGE_REL_BASED_HIGHLOW
3
Az alapáthelyezés a különbség mind a 32 bites értékét alkalmazza eltoláskor a 32 bites mezőre.
IMAGE_REL_BASED_HIGHADJ
4
Az alapáthelyezés a különbség 16 bites értékét hozzáadja a 16 bites mezőhöz eltoláskor. A 16 bites mező egy 32 bites szó magas értékét jelöli. A 32 bites érték alacsony 16 bitje az alapáthelyezést követő 16 bites szóban van tárolva. Ez azt jelenti, hogy ez a bázisáthelyezés két helyet foglal el.
IMAGE_REL_BASED_MIPS_JMPADDR
5
Az áthelyezés értelmezése a gép típusától függ.
Ha a gép típusa MIPS, az alapáthelyezés egy MIPS-ugróutasításra vonatkozik.
IMAGE_REL_BASED_ARM_MOV32
5
Ez az áthelyezés csak akkor hasznos, ha a gép típusa ARM vagy Thumb. Az alapáthelyezés egy szimbólum 32 bites címét alkalmazza egy egymást követő MOVW/MOVT utasításpárra.
IMAGE_REL_BASED_RISCV_HIGH20
5
Ez az áthelyezés csak akkor hasznos, ha a gép típusa RISC-V. Az alapáthelyezés a 32 bites abszolút cím 20 bites csúcsára vonatkozik.
6
Fenntartott, nullának kell lennie.
IMAGE_REL_BASED_THUMB_MOV32
7
Ez az áthelyezés csak akkor hasznos, ha a gép típusa Thumb. Az alapáthelyezés egy szimbólum 32 bites címét alkalmazza egy egymást követő MOVW/MOVT utasításpárra.
IMAGE_REL_BASED_RISCV_LOW12I
7
Ez az áthelyezés csak akkor hasznos, ha a gép típusa RISC-V. Az alapáthelyezés a RISC-V I-típusú utasításformátumban létrehozott 32 bites abszolút cím alacsony 12 bitesére vonatkozik.
IMAGE_REL_BASED_RISCV_LOW12S
8
Ez az áthelyezés csak akkor hasznos, ha a gép típusa RISC-V. Az alapáthelyezés a RISC-V S típusú utasításformátumban létrehozott 32 bites abszolút cím alacsony 12 bitesére vonatkozik.
IMAGE_REL_BASED_LOONGARCH32_MARK_LA
8
Ez az áthelyezés csak akkor hasznos, ha a gép típusa LoongArch 32 bites. Az alapáthelyezés egy két egymást követő utasításban létrehozott 32 bites abszolút címre vonatkozik.
IMAGE_REL_BASED_LOONGARCH64_MARK_LA
8
Ez az áthelyezés csak akkor hasznos, ha a gép típusa LoongArch 64 bites. Az alapáthelyezés egy négy egymást követő utasításban létrehozott 64 bites abszolút címre vonatkozik.
IMAGE_REL_BASED_MIPS_JMPADDR16
9
Az áthelyezés csak akkor hasznos, ha a gép típusa MIPS. Az alapáthelyezés egy MIPS16-ugróutasításra vonatkozik.
IMAGE_REL_BASED_DIR64
10
Az alapáthelyezés a különbséget a 64 bites mezőre alkalmazza eltoláskor.

 

A .tls szakasz

A .tls szakasz közvetlen PE- és COFF-támogatást biztosít a statikus szál helyi tárolóihoz (TLS). A TLS egy speciális tárolási osztály, amelyet a Windows támogat, amelyben az adatobjektumok nem automatikus (verem) változók, mégis helyiek a kódot futtató egyes szálakhoz. Így minden szál más értéket tud fenntartani egy TLS használatával deklarált változóhoz.

Vegye figyelembe, hogy bármilyen mennyiségű TLS-adat támogatott a TlsAlloc, a TlsFree, a TlsSetValue és a TlsGetValue API-hívásokkal. A PE vagy a COFF implementáció alternatív megközelítés az API használatához, és előnye, hogy egyszerűbb a magas szintű programozó szempontjából. Ez az implementáció lehetővé teszi, hogy a TLS-adatok a program szokásos statikus változóihoz hasonlóan legyenek definiálva és inicializálva. A Visual C++-ban például egy statikus TLS-változó a következőképpen definiálható a Windows API használata nélkül:

__declspec (thread) int tlsFlag = 1;

Ennek a programozási szerkezetnek a támogatásához a PE és a COFF .tls szakasz a következő információkat adja meg: inicializálási adatok, visszahívási rutinok szálonkénti inicializáláshoz és leállításhoz, valamint a TLS-index, amelyeket a következő vitafórum ismertet.

Megjegyzés:

A Windows Vista előtt a statikusan deklarált TLS-adatobjektumok csak statikusan betöltött képfájlokban használhatók. Ez a tény megbízhatatlantá teszi a statikus TLS-adatok DLL-ben való használatát, hacsak nem tudja, hogy a DLL vagy bármi, ami statikusan kapcsolódik hozzá, soha nem lesz dinamikusan betöltve a LoadLibrary API-függvénysel. A Windows Vista-tól kezdve azonban továbbfejlesztették a Windows-betöltőt, hogy jobban támogassák a DLL-ek dinamikus betöltését statikus TLS-sel. Ez a változás azt jelenti, hogy a statikusan deklarált TLS-adatobjektumokkal rendelkező DLL-ek mostantól megbízhatóbban használhatók, még akkor is, ha dinamikusan vannak betöltve a LoadLibrary használatával. A rakodó képes TLS-tárolóhelyek kiosztására az ilyen DLL-ek számára a betöltési időben, enyhítve a Windows korábbi verzióiban fennálló korlátozásokat.

 

Megjegyzés:

A 32 bites eltolásokra és a 4-ből álló indexszorzókra mutató hivatkozások a 32 bites architektúrával rendelkező rendszerekre vonatkoznak. A 64 bites architektúrákon alapuló rendszerekben szükség szerint módosítsa őket.

A végrehajtható kód a következő lépésekkel fér hozzá egy statikus TLS-adatobjektumhoz:

  1. A csatoláskor a linker beállítja a TLS-címtár Index mezőjének címét. Ez a mező arra a helyre mutat, ahol a program várhatóan megkapja a TLS-indexet.

    A Microsoft futásidejű kódtára megkönnyíti ezt a folyamatot azáltal, hogy meghatározza a TLS-könyvtár memóriaképét, és a "__tls_used" (Intel x86-platformok) vagy a "_tls_used" (más platformok) nevet adja neki. A csatoló megkeresi ezt a memóriaképet, és az ott található adatokkal hozza létre a TLS-könyvtárat. A TLS-t támogató és a Microsoft linkerrel dolgozó más fordítóknak is ugyanezt a technikát kell használniuk.

  2. Szál létrehozásakor a rakodó a szál TLS-tömbjének címét közli a szálkörnyezeti blokk (TEB) címének az FS (x86 esetén) vagy a GS (x64 esetén) nyilvántartásában való elhelyezésével. A TLS-tömbre mutató mutató a TEB elejétől 0x2C eltolásánál található. Ez a viselkedés Intel x86-specifikus.

  3. A betöltő a TLS-index értékét az Index címe mező által megjelölt helyre rendeli.

  4. A végrehajtható kód lekéri a TLS-indexet és a TLS-tömb helyét is.

  5. A kód a TLS-indexet és a TLS-tömb helyét használja (az indexet megszorozza 4-gyel, és eltolásként használja a tömbhöz) az adott program és modul TLS-adatterületének címének lekéréséhez. Minden szál saját TLS-adatterülettel rendelkezik, de ez átlátható a program számára, amelynek nem kell tudnia, hogyan vannak lefoglalva az adatok az egyes szálakhoz.

  6. Az egyes TLS-adatobjektumok rögzített eltolásként érhetők el a TLS-adatterületen.

A TLS-tömb a rendszer által az egyes szálakhoz fenntartott címek tömbje. A tömb minden címe megadja egy adott modul (EXE vagy DLL) TLS-adatainak helyét a programon belül. A TLS-index a tömb használni kívánt tagját jelzi. Az index egy szám (csak a rendszer számára értelmezhető), amely azonosítja a modult.

A TLS-címtár

A TLS-könyvtár formátuma a következő:

Eltolás (PE32/ PE32+) Méret (PE32/ PE32+) Terület Leírás
0
4/8
Raw Data Start VA
A TLS-sablon kezdőcíme. A sablon egy adatblokk, amely a TLS-adatok inicializálására szolgál. A rendszer minden egyes szál létrehozásakor átmásolja ezeket az adatokat, ezért nem szabad sérültnek lennie. Vegye figyelembe, hogy ez a cím nem RVA; ez egy olyan cím, amelynek alapáthelyezésnek kell lennie a .reloc szakaszban.
4/8
4/8
Nyers adatvég VA
A TLS utolsó bájtjának címe, kivéve a nulla kitöltést. A Raw Data Start VA mezőhöz hasonlóan ez is VA, nem RVA.
8/16
4/8
Index címe
A TLS-index fogadásának helye, amelyet a betöltő hozzárendel. Ez a hely egy szokásos adatszakaszban található, így a program számára elérhető szimbolikus nevet adhat neki.
12/24
4/8
Visszahívások címe
A TLS visszahívási függvények tömbjének mutatója. A tömb null értékű, ezért ha nem támogatott visszahívási függvény, ez a mező 4 bájtra van állítva nullára állítva. A függvények prototípusával kapcsolatos információkért lásd a TLS Callback Functionst.
16/32
4
A nulla kitöltés mérete
A sablon mérete bájtban, a Raw Data Start VA és a Raw Data End VA mezők által elválasztott inicializált adatokon túl. A teljes sablonméretnek meg kell egyeznie a képfájl TLS-adatainak teljes méretével. A nulla kitöltés az inicializált nemzero adatok után érkező adatok mennyisége.
20/36
4
Jellemzők
A négy bit [23:20] az igazítási adatokat írja le. A lehetséges értékek a IMAGE_SCN_ALIGN_* definiált értékek, amelyek az objektumfájlok szakaszának igazítását is írják le. A többi 28 bit későbbi használatra van fenntartva.

 

TLS-visszahívási függvények

A program egy vagy több TLS-visszahívási függvényt biztosít a TLS-adatobjektumok további inicializálásának és leállításának támogatására. Az ilyen visszahívási függvények általában konstruktorokat és destruktorokat hívnak meg objektumokhoz.

Bár általában nincs több visszahívási függvény, a visszahívás tömbként van implementálva, hogy szükség esetén további visszahívási függvények is hozzáadhatóak legyenek. Ha több visszahívási függvény is létezik, a függvények neve abban a sorrendben történik, amelyben a cím megjelenik a tömbben. Egy null mutató leállítja a tömböt. Teljesen érvényes egy üres lista (nem támogatott visszahívás), ebben az esetben a visszahívási tömb pontosan egy tag-a null mutatóval rendelkezik.

A visszahívási függvény prototípusa (amely egy PIMAGE_TLS_CALLBACK típusú mutatóra mutat) ugyanazokkal a paraméterekkel rendelkezik, mint egy DLL belépésipont-függvény:

typedef VOID
(NTAPI *PIMAGE_TLS_CALLBACK) (
    PVOID DllHandle,
    DWORD Reason,
    PVOID Reserved
    );

A fenntartott paramétert nullára kell állítani. Az Ok paraméter a következő értékeket veheti fel:

Beállítás Érték Leírás
DLL_PROCESS_ATTACH
1
Új folyamat kezdődött, beleértve az első szálat is.
DLL_THREAD_ATTACH
2
Létre lett hozva egy új szál. Ez az értesítés az első szál ki nem egészére érkezett.
DLL_THREAD_DETACH
3
Egy szál hamarosan leáll. Ez az értesítés az első szál ki nem egészére érkezett.
DLL_PROCESS_DETACH
0
Egy folyamat leáll, beleértve az eredeti szálat is.

 

A terheléskonfigurációs struktúra (csak kép)

A terheléskonfigurációs struktúrát (IMAGE_LOAD_CONFIG_DIRECTORY) korábban nagyon korlátozott esetekben használták magának a Windows NT operációs rendszernek a leírására, hogy a rendszerkép fejlécében vagy opcionális fejlécében a különböző funkciók túl bonyolultak vagy túl nagyok legyenek. A Microsoft linker és a Windows XP és a Windows újabb verzióinak jelenlegi verziói a struktúra új verzióját használják a fenntartott SEH-technológiát tartalmazó 32 bites x86-alapú rendszerekhez. Ez az operációs rendszer által a kivételküldés során használt biztonságos strukturált kivételkezelők listáját tartalmazza. Ha a kezelőcím egy kép VA-tartományában található, és fenntartott SEH-tudatában van megjelölve (azaz IMAGE_DLLCHARACTERISTICS_NO_SEH az opcionális fejléc DllCharacteristics mezőjében a korábban leírtak szerint egyértelmű), akkor a kezelőnek szerepelnie kell a rendszerkép ismert biztonságos kezelőinek listájában. Ellenkező esetben az operációs rendszer leállítja az alkalmazást. Ez segít megakadályozni az "x86-os kivételkezelő eltérítését" az operációs rendszer irányításához korábban használt "x86-os kivételkezelők eltérítésének" megakadályozásában.

A Microsoft linker automatikusan biztosít egy alapértelmezett terheléskonfigurációs struktúrát, amely tartalmazza a fenntartott SEH-adatokat. Ha a felhasználói kód már rendelkezik terheléskonfigurációs struktúrával, az új fenntartott SEH-mezőket is tartalmaznia kell. Ellenkező esetben a hivatkozás nem tartalmazhat fenntartott SEH-adatokat, és a rendszerkép nincs megjelölve fenntartott SEH-t tartalmazóként.

Konfigurációs címtár betöltése

Az előre fenntartott SEH-terheléskonfigurációs struktúra adatkönyvtár-bejegyzésének meg kell adnia a terheléskonfigurációs struktúra adott méretét, mivel az operációs rendszer betöltője mindig egy bizonyos értékre számít. Ebben a tekintetben a méret valójában csak egy verzióellenőrzés. A Windows XP és a Windows korábbi verzióival való kompatibilitás érdekében az x86-os rendszerképek méretének 64-nek kell lennie.

Konfigurációs elrendezés betöltése

A terheléskonfigurációs struktúra a következő elrendezéssel rendelkezik a 32 bites és a 64 bites PE-fájlokhoz:

Kiegyenlít Méret Terület Leírás
0
4
Jellemzők
A jelenleg nem használt fájl attribútumait jelző jelzők.
4
4
TimeDateStamp
Dátum- és időbélyeg értéke. Az érték az éjfél óta eltelt másodpercek számában (00:00:00), 1970. január 1., univerzális koordinált időpontban jelenik meg a rendszerórának megfelelően. Az időbélyeg a C futtatókörnyezet (CRT) időfüggvényével nyomtatható.
8
2
MajorVersion
Főverzió száma.
10
2
MinorVersion
Alverziószám.
12
4
GlobalFlagsClear
A globális rakodójelzők a folyamat elindításakor törlik a folyamatot.
16
4
GlobalFlagsSet
A globális betöltő jelzői a folyamat indításakor a folyamathoz lesznek beállítva.
20
4
CriticalSectionDefaultTimeout
Az alapértelmezett időtúllépési érték, amelyet a folyamat elhagyatott kritikus szakaszaihoz kell használni.
24
4/8
DeCommitFreeBlockThreshold
A rendszerhez való visszatérés előtt felszabadítandó memóriát bájtban kell megadni.
28/32
4/8
DeCommitTotalFreeThreshold
Szabad memória teljes mennyisége bájtban.
32/40
4/8
LockPrefixTable
[csak x86] A LOCK előtagot tartalmazó címek listájának VA-ját használja, hogy egy processzoros gépeken a NOP-re lehessen őket cserélni.
36/48
4/8
MaximumAllocationSize
Maximális foglalási méret bájtban.
40/56
4/8
VirtualMemoryThreshold
Virtuális memória maximális mérete bájtban.
44/64
4/8
ProcessAffinityMask
A mező nem nulla értékűre állítása egyenértékű a SetProcessAffinityMask meghívásával a folyamat indításakor (csak.exe)
48/72
4
ProcessHeapFlags
A HeapCreate függvény első argumentumának megfelelő feldolgozási halomjelölők. Ezek a jelzők a folyamat indításakor létrehozott folyamat halomra vonatkoznak.
52/76
2
CSDVersion
A szervizcsomag verzióazonosítója.
54/78
2
DependentLoadFlags
Az operációs rendszer által használt alapértelmezett terhelésjelzők feloldják a modul statikusan csatolt importálását.
56/80
4/8
EditList
A rendszer számára fenntartott.
60/88
4/8
SecurityCookie
Mutató a Visual C++ vagy GS implementáció által használt cookie-ra.
64/96
4/8
SEHandlerTable
[csak x86] A képen szereplő érvényes, egyedi SE kezelők RVA-jainak rendezett táblázatának VA-ja.
68/104
4/8
SEHandlerCount
[csak x86] A tábla egyedi kezelőinek száma.
72/112
4/8
GuardCFCheckFunctionPointer
Az a VA, ahol a Control Flow Guard ellenőrzőfüggvény mutatója tárolódik.
76/120
4/8
GuardCFDispatchFunctionPointer
Az a VA, ahol a Control Flow Guard diszpécserfüggvény mutatója van tárolva.
80/128
4/8
GuardCFFunctionTable
A képen található egyes Control Flow Guard-függvények RVA-jainak rendezett táblázatának VA-ja.
84/136
4/8
GuardCFFunctionCount
Az egyedi RVA-k száma a fenti táblázatban.
88/144
4
GuardFlags
A Flow Guardhoz kapcsolódó jelzők vezérlése.
92/148
12
CodeIntegrity
Kódintegritási információk.
104/160
4/8
GuardAddressTakenIatEntryTable
Az a VA, ahol a Control Flow Guard IAT-táblában foglalt címe van tárolva.
108/168
4/8
GuardAddressTakenIatEntryCount
Az egyedi RVA-k száma a fenti táblázatban.
112/176
4/8
GuardLongJumpTargetTable
A VA, ahol a Control Flow Guard távolugrásos céltáblát tárolja.
116/184
4/8
GuardLongJumpTargetCount
Az egyedi RVA-k száma a fenti táblázatban.

 

A GuardFlags mező az alábbi jelölők és almezők egy vagy több kombinációját tartalmazza:

  • A modul rendszer által biztosított támogatással végzi a folyamatintegritási ellenőrzéseket.

    #define IMAGE_GUARD_CF_INSTRUMENTED 0x00000100

  • A modul vezérlőfolyamat- és írási integritás-ellenőrzéseket végez.

    #define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200

  • A modul érvényes vezérlőfolyamat-cél metaadatokat tartalmaz.

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400

  • A modul nem használja a /GS biztonsági cookie-t.

    #define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800

  • A modul támogatja az írásvédett késleltetési IAT-t.

    #define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000

  • Az importálási tábla késleltetése a saját .didat szakaszában (semmi más nem található benne), amely szabadon újra védhető.

    #define IMAGE_GUARD_DELAYLOAD_IAT_IN_ITS_OWN_SECTION 0x00002000

  • A modul letiltott exportálási információkat tartalmaz. Ez arra is következtet, hogy az IAT-táblában foglalt cím is megtalálható a terhelési konfigurációban.

    #define IMAGE_GUARD_CF_EXPORT_SUPPRESSION_INFO_PRESENT 0x00004000

  • A modul lehetővé teszi az exportálások letiltását.

    #define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000

  • A modul hosszú távú céladatokat tartalmaz.

    #define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000

  • Maszk a Control Flow Guard függvény táblabejegyzéseit tartalmazó almezőhöz (azaz a táblabejegyzésenkénti bájtok további száma).

    #define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_MASK 0xF0000000

Emellett a Windows SDK winnt.h fejléce meghatározza ezt a makrót a bitek mennyiségéhez a GuardFlags érték jobb oldali eltolásához a Control Flow Guard függvénytáblázat lépéshosszának jobbra igazításához:

#define IMAGE_GUARD_CF_FUNCTION_TABLE_SIZE_SHIFT 28

A .rsrc szakasz

Az erőforrásokat többszintű bináris rendezésű faszerkezet indexeli. Az általános kialakítás 2**31 szintet tartalmazhat. Konvenció szerint azonban a Windows három szintet használ:

Típusnév nyelve

Az erőforráskönyvtár-táblák sorozata az összes szintet a következő módon kapcsolja össze: Az egyes címtártáblákat olyan könyvtárbejegyzések sorozata követi, amelyek az adott szint (típus, név vagy nyelvi szint) nevét vagy azonosítóját (azonosítóját) és egy adatleírás vagy egy másik könyvtártábla címét adják meg. Ha a cím egy adatleírásra mutat, akkor az adatok egy levél a fában. Ha a cím egy másik címtártáblára mutat, akkor az a tábla a következő szinten lévő címtárbejegyzéseket sorolja fel.

A levél típusát, nevét és nyelvi azonosítóit a levél eléréséhez a címtártáblákon keresztül elért elérési út határozza meg. Az első tábla a típusazonosítót, a második táblát (az első tábla könyvtárbejegyzése alapján) a névazonosítót, a harmadik pedig a nyelvazonosítót határozza meg.

A .rsrc szakasz általános felépítése:

Adat Leírás
Erőforráscímtár-táblák (és erőforráscímtár-bejegyzések)
Táblák sorozata, amely a fa csomópontjainak minden csoportjához tartozik. Az első táblázatban az összes legfelső szintű (Típus) csomópont szerepel. A táblázat bejegyzései a második szintű táblákra mutatnak. Minden második szintű fa típusazonosítója azonos, de eltérő névazonosítóval rendelkezik. A harmadik szintű fák típus- és névazonosítói azonosak, de eltérő nyelvi azonosítókkal rendelkeznek.
Minden egyes táblát azonnal könyvtárbejegyzések követnek, amelyekben minden bejegyzéshez tartozik név vagy numerikus azonosító, valamint egy adatleírásra vagy egy táblára mutató mutató a következő alsó szinten.
Erőforrás-címtár sztringjei
Két bájtra igazított Unicode-sztringek, amelyek a címtárbejegyzések által mutatott sztringadatokként szolgálnak.
Erőforrásadatok leírása
Táblák által mutatott rekordtömb, amely az erőforrásadatok tényleges méretét és helyét írja le. Ezek a rekordok az erőforrás-leírási fa levelei.
Erőforrásadatok
Az erőforrásszakasz nyers adatai. Az Erőforrásadatok leírása mező méret- és helyadatai elhatárolják az erőforrásadatok egyes régióit.

 

Erőforráscímtár táblázata

Minden erőforráscímtár-tábla formátuma a következő. Ezt az adatstruktúrát egy tábla címsorának kell tekinteni, mivel a tábla valójában könyvtárbejegyzésekből (a 6.9.2. szakaszban"Erőforráscímtár-bejegyzések") és a következő struktúrából áll:

Kiegyenlít Méret Terület Leírás
0
4
Jellemzők
Erőforrás-jelzők. Ez a mező jövőbeli használatra van fenntartva. Jelenleg nulla értékre van állítva.
4
4
Idő-/dátumbélyeg
Az az időpont, amikor az erőforrás-fordító létrehozta az erőforrás-adatokat.
8
2
Főverzió
A fő verziószám, amelyet a felhasználó állít be.
10
2
Alverzió
A felhasználó által beállított alverziószám.
12
2
Névbejegyzések száma
Azoknak a könyvtárbejegyzéseknek a száma, amelyek közvetlenül a táblát követve sztringeket használnak a típus-, név- vagy nyelvbejegyzések azonosításához (a tábla szintjétől függően).
14
2
Azonosítóbejegyzések száma
Azoknak a címtárbejegyzéseknek a száma, amelyek közvetlenül a típus, név vagy nyelv bejegyzéseihez numerikus azonosítókat használó névbejegyzéseket követnek.

 

Erőforráscímtár bejegyzései

A címtárbejegyzések egy tábla sorait alkotják. Minden erőforráscímtár-bejegyzés formátuma a következő. Azt, hogy a bejegyzés név vagy azonosító bejegyzés-e, az erőforráscímtár táblája jelzi, hogy hány név- és azonosítóbejegyzés követi (ne feledje, hogy az összes Név bejegyzés megelőzi a tábla összes azonosító bejegyzését). A tábla összes bejegyzése növekvő sorrendben van rendezve: a névbejegyzéseket kis- és nagybetűkre érzékeny sztring, az azonosítót pedig numerikus érték szerint. Az eltolások a IMAGE_DIRECTORY_ENTRY_RESOURCE DataDirectory címéhez viszonyítva vannak. További információ: Társviszony-létesítés a PE-ben: A Win32 Hordozható végrehajtható fájlformátum bemutatója .

Kiegyenlít Méret Terület Leírás
0
4
Név eltolása
Egy sztring eltolása, amely a tábla szintjétől függően megadja a Típus, a Név vagy a Nyelvazonosító bejegyzést.
0
4
Egész szám azonosítója
32 bites egész szám, amely azonosítja a Típus, a Név vagy a Nyelvazonosító bejegyzést.
4
4
Adatbevitel eltolása
Nagy bit 0. Erőforrás-adatbevitel címe (levél).
4
4
Alkönyvtár eltolása
Nagy bit 1. Az alsó 31 bit egy másik erőforráscímtár-tábla címe (a következő szint lefelé).

 

Erőforrás-címtár sztringje

Az erőforráskönyvtár sztringterülete Unicode-sztringekből áll, amelyek szóhoz igazítottak. Ezeket a sztringeket a rendszer az utolsó erőforráscímtár-bejegyzés és az első erőforrás-adatbevitel előtt együtt tárolja. Ez minimalizálja ezeknek a változó hosszúságú sztringeknek a rögzített méretű címtárbejegyzések igazítására gyakorolt hatását. Minden erőforráscímtár-sztring formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
2
Hosszúság
A sztring mérete, magában a hosszmezőben nem.
2
változó
Unicode-sztring
A változó hosszúságú Unicode-sztringadatok, szó szerint igazítva.

 

Erőforrás-adatbevitel

Minden erőforrásadat-bejegyzés a nyers adatok tényleges egységét írja le az Erőforrásadatok területen. Az erőforrás-adatbejegyzések formátuma a következő:

Kiegyenlít Méret Terület Leírás
0
4
Data RVA
Az erőforrásadatok egy egységének címe az Erőforrás-adatok területen.
4
4
Méret
A Data RVA mező által mutatott erőforrásadatok mérete bájtban.
8
4
Kódlap
A kódlap, amely az erőforrás-adatokban lévő kódpontértékek dekódolására szolgál. A kódlap általában a Unicode kódlap.
12
4
Fenntartott, 0-nak kell lennie.

 

A .cormeta szakasz (csak objektum)

A CLR-metaadatok ebben a szakaszban találhatók. Azt jelzi, hogy az objektumfájl felügyelt kódot tartalmaz. A metaadatok formátuma nincs dokumentálva, de átadható a CLR-felületeknek a metaadatok kezeléséhez.

A .sxdata szakasz

Az objektumok érvényes kivételkezelői az objektum .sxdata szakaszában jelennek meg. A szakasz IMAGE_SCN_LNK_INFO van megjelölve. Az egyes érvényes kezelők COFF szimbólumindexét tartalmazza, indexenként 4 bájttal.

Emellett a fordító egy COFF-objektumot regisztrált SEH-ként jelöl meg a "@feat.00" abszolút szimbólum kibocsátásával az 1 értékmező LSB-jével. A regisztrált SEH-kezelők nélküli COFF-objektumoknál a "@feat.00" szimbólum szerepelne, de .sxdata szakasz nincs.

Archív (tár) fájlformátum

A COFF archív formátum szabványos mechanizmust biztosít az objektumfájlok gyűjteményeinek tárolására. Ezeket a gyűjteményeket gyakran kódtáraknak nevezik a programozási dokumentációban.

Az archívum első 8 bájtja a fájlaírásból áll. Az archívum többi része archívumtagokból áll, az alábbiak szerint:

  • Az első és a második tag a "linker tagok". Mindegyik tagnak saját formátuma van az Importálási név típusa szakaszban leírtak szerint. A linkelők általában ezekbe az archív tagokba helyezik az információkat. A linker tagjai tartalmazzák az archívum könyvtárát.

  • A harmadik tag a "longnames" tag. Ez a választható tag null értékű ASCII-sztringekből áll, amelyekben minden sztring egy másik archív tag neve.

  • Az archívum többi része standard (object-file) tagokból áll. Mindegyik tag egy objektumfájl tartalmát tartalmazza teljes egészében.

Az archív tagok fejléce megelőzi az egyes tagokat. Az alábbi lista egy archívum általános struktúráját mutatja be:

Aláírás :"!<arch>\n"
Fejléc
1. Linker-tag
Fejléc
2. Linker tag
Fejléc
Longnames Tag
Fejléc
Az OBJ-fájl tartalma 1
(COFF formátum)
Fejléc
A 2. OBJ-fájl tartalma
(COFF formátum)

...

Fejléc
Az OBJ-fájl N tartalma
(COFF formátum)

Archív fájl aláírása

Az archív fájl aláírása azonosítja a fájltípust. Minden olyan segédprogram (például egy hivatkozáskezelő), amely bemenetként egy archív fájlt használ, ellenőrizheti a fájl típusát az aláírás elolvasásával. Az aláírás az alábbi ASCII-karakterekből áll, amelyekben az alábbi karakterek szó szerint jelennek meg, kivéve az új sor (\n) karaktert:

!<arch>\n

A Windows SDK winnt.h fejléce a következő makrókat határozza meg:

#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>/   "

Tagfejlécek archiválása

Minden tagot (linker, longnames vagy object-file tag) egy fejléc előz meg. Az archív tagfejlécek formátuma a következő, amelyben minden mező egy ASCII szöveges sztring, amely ki van állítva, és szóközökkel van elválasztva a mező végéig. Ezen mezők egyikében sem végződik null karakter.

Minden tagfejléc az előző archív tag végének első páros címén kezdődik, egy bájtnyi "\n" (IMAGE_ARCHIVE_PAD) beilleszthető egy archív tag után, hogy a következő tag páros címmel kezdődjön.

Kiegyenlít Méret Terület Leírás
0
16
Név
Az archív tag neve egy perjellel (/) a név megszakításához. Ha az első karakter perjel, a névnek speciális értelmezése van az alábbi táblázatban leírtak szerint.
16
12
Dátum
Az archív tag létrehozásának dátuma és időpontja: Ez az ASCII decimális ábrázolása az 1970.01.01. óta eltelt másodpercek számáról.
28
6
Felhasználói azonosító
A felhasználói azonosító ASCII decimális ábrázolása. Ez a mező nem tartalmaz értelmezhető értéket a Windows-platformokon, mert a Microsoft-eszközök minden üres mezőt kibocsátanak.
34
6
Csoportazonosító
A csoportazonosító ASCII decimális ábrázolása. Ez a mező nem tartalmaz értelmezhető értéket a Windows-platformokon, mert a Microsoft-eszközök minden üres mezőt kibocsátanak.
40
8
Üzemmód
A tag fájlmódjának ASCII oktális ábrázolása. Ez a C futásidejű függvény _wstat ST_MODE értéke.
48
10
Méret
Az archív tag teljes méretének ASCII decimális ábrázolása, a fejléc méretét nem beleértve.
58
2
Fejléc vége
A C sztring ""\n" (IMAGE_ARCHIVE_END) két bájtja (0x60 0x0A).

A Név mező az alábbi táblázatban látható formátumok egyikével rendelkezik. Ahogy korábban említettük, a sztringek mindegyike indokolt marad, és 16 bájtos mezőn belüli záró szóközökkel van elválasztva:

A Név mező tartalma Leírás
név/
Az archív tag neve.
/
Az archív tag a két linkertag egyike. Mindkét linker-tagnak ez a neve van.
//
Az archív tag a longnames tag, amely null értékű ASCII-sztringek sorozatából áll. A longnames tag a harmadik archív tag, és nem kötelező.
/n
Az archív tag neve az n eltolásnál található a longnames tagon belül. Az n szám az eltolás decimális ábrázolása. Például: "/26" azt jelzi, hogy az archív tag neve 26 bájtban található a longnames tag tartalmának elején.

 

Első Linker-tag

Az első linkertag neve "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Az első linkertag a visszamenőleges kompatibilitás érdekében szerepel. Az aktuális csatolók nem használják, de formátumának helyesnek kell lennie. Ez a linker tag a szimbólumnevek könyvtárát biztosítja, ahogyan a második linkertagot is. Az egyes szimbólumok esetében az információk azt jelzik, hogy hol található a szimbólumot tartalmazó archív tag.

Az első linkertag formátuma a következő. Ez az információ a fejléc után jelenik meg:

Kiegyenlít Méret Terület Leírás
0
4
Szimbólumok száma
Aláíratlan hosszú, amely az indexelt szimbólumok számát tartalmazza. Ez a szám big endian formátumban van tárolva. Minden objektumfájl-tag általában egy vagy több külső szimbólumot határoz meg.
4
4 * n
Ellentételezések
Fájleltolások tömbje az archív tagfejlécekhez, amelyekben n egyenlő a Szimbólumok száma mezővel. A tömb minden egyes száma egy előjel nélküli hosszú, big-endian formátumban tárolt. A sztringtáblában elnevezett szimbólumok esetében az eltolástömb megfelelő eleme adja meg a szimbólumot tartalmazó archív tag helyét.
*
*
Sztringtábla
Null értékű sztringek sorozata, amelyek a könyvtár összes szimbólumát elnevzik. Minden sztring közvetlenül az előző sztring null karaktere után kezdődik. A sztringek számának meg kell egyezik a Szimbólumok száma mező értékével.

 

Az eltolástömb elemeit növekvő sorrendbe kell rendezni. Ez azt jelenti, hogy a sztringtáblában lévő szimbólumokat az archív tagok sorrendjének megfelelően kell elrendezni. Például az első objektumfájl-tag összes szimbólumának szerepelnie kell a második objektumfájl szimbólumai előtt.

Második Linker-tag

Az első linkertaghoz hasonlóan a második linkertag neve "/" (IMAGE_ARCHIVE_LINKER_MEMBER). Bár mindkét linkertag rendelkezik szimbólumok és archív tagok könyvtárával, a második linkertagot az összes jelenlegi hivatkozás az elsőhöz előnyben részesíti. A második linkertag lexikális sorrendben tartalmazza a szimbólumneveket, ami lehetővé teszi a név szerinti gyorsabb keresést.

A második tag formátuma a következő. Ez az információ a fejléc után jelenik meg:

Kiegyenlít Méret Terület Leírás
0
4
Tagok száma
Egy aláíratlan hosszú, amely az archív tagok számát tartalmazza.
4
4 * m
Ellentételezések
Fájleltolások tömbje a tagfejlécek archiválásához növekvő sorrendben. Minden eltolás egy aláíratlan hosszú . Az m szám megegyezik a Tagok száma mező értékével.
*
4
Szimbólumok száma
Egy aláíratlan hosszú, amely az indexelt szimbólumok számát tartalmazza. Minden objektumfájl-tag általában egy vagy több külső szimbólumot határoz meg.
*
2 * n
Indexek
Egy 1-alapú indexek (nem aláírt rövid) tömbje, amely a szimbólumneveket a tageltolások archiválására térképezi le. Az n szám egyenlő a Szimbólumok száma mezővel. A sztringtáblában elnevezett szimbólumok esetében az Indexek tömb megfelelő eleme indexet ad az eltolások tömbjének. Az eltolások tömbje viszont megadja a szimbólumot tartalmazó archív tag helyét.
*
*
Sztringtábla
Null értékű sztringek sorozata, amelyek a könyvtár összes szimbólumát elnevzik. Minden sztring közvetlenül az előző sztring null bájtja után kezdődik. A sztringek számának meg kell egyezik a Szimbólumok száma mező értékével. Ez a táblázat az összes szimbólumnevet növekvő lexikális sorrendben sorolja fel.

 

Longnames Tag

A longnames tag neve "//" (IMAGE_ARCHIVE_LONGNAMES_MEMBER). A longnames tag az archív tagnevek sztringjeinek sorozata. Itt csak akkor jelenik meg név, ha nincs elegendő hely a Név mezőben (16 bájt). A longnames tag megadása nem kötelező. Üres lehet csak fejléccel, vagy akár élőfej nélkül is teljesen hiányzik.

A sztringek null értékűek. Minden sztring közvetlenül az előző sztring null bájtja után kezdődik.

Tárformátum importálása

A hagyományos importálási kódtárak, vagyis az egyik képről a másik által való használatra történő exportálást leíró kódtárak általában a 7. szakasz Archívum (Tár) fájlformátumában leírt elrendezést követik. Az elsődleges különbség az, hogy az importálási kódtártagok a valósak helyett pszeudoobjektum-fájlokat tartalmaznak, amelyekben minden tag tartalmazza a 6.4. szakaszban leírt importálási táblák létrehozásához szükséges szakasz-hozzájárulásokat, a .idata szakaszT . A linker ezt az archívumot hozza létre az exportálási alkalmazás létrehozásakor.

Az importálás szakaszbefizetései kis információkészletből következtethetők. A linker létrehozhatja a teljes, részletes információkat az importálási kódtárba az egyes tagok számára a kódtár létrehozásakor, vagy csak a canonical információkat írja a tárba, és hagyja, hogy a később használó alkalmazás menet közben hozza létre a szükséges adatokat.

Egy hosszú formátumú importálási kódtárban egyetlen tag a következő információkat tartalmazza:

  • Tagfejléc archiválása
  • Fájlfejléc
  • Szakaszfejlécek
  • Az egyes szakaszfejléceknek megfelelő adatok
  • COFF szimbólumtábla
  • Húrok

Ezzel szemben egy rövid importálási kódtár a következőképpen íródik:

  • Tagfejléc archiválása
  • Élőfej importálása
  • Null értékű importálási névsztring
  • Null értékű DLL-névsztring

Ez elegendő információ a tag teljes tartalmának pontos rekonstruálásához a használat időpontjában.

Élőfej importálása

Az importálási fejléc a következő mezőket és eltolásokat tartalmazza:

Kiegyenlít Méret Terület Leírás
0
2
Sig1
IMAGE_FILE_MACHINE_UNKNOWN kell lennie. További információ: Géptípusok.
2
2
Sig2
0xFFFF kell lennie.
4
2
. verzió
A struktúra verziója.
6
2
Gép
A célgép típusát azonosító szám. További információ: Géptípusok.
8
4
Time-Date bélyeg
A fájl létrehozásának időpontja és dátuma.
12
4
Adatok mérete
A fejlécet követő sztringek mérete.
16
2
Ordinal/Hint
Az importálás sorszáma vagy tippje, amelyet a Névtípus mezőben szereplő érték határoz meg.
18
2 bit
Típus
Az importálás típusa. Konkrét értékekről és leírásokról az Importálás típusa című témakörben olvashat.
3 bit
Névtípus
Az importálási név típusa. További információ: Névtípus importálása.
11 bit
Tartózkodó
Fenntartott, 0-nak kell lennie.

 

Ezt a struktúrát két null értékű sztring követi, amelyek az importált szimbólum nevét és azt a DLL-t írják le, amelyből származik.

Importálás típusa

Az importálási fejléc Típus mezőjéhez a következő értékek vannak definiálva:

Állandó Érték Leírás
IMPORT_OBJECT_CODE
0
Végrehajtható kód.
IMPORT_OBJECT_DATA
1
Adat.
IMPORT_OBJECT_CONST
2
CONST-ként van megadva a .def fájlban.

Ezek az értékek határozzák meg, hogy a tárat használó eszköz mely szakasz-hozzájárulásokat kell létrehoznia, ha hozzá kell férnie az adatokhoz.

Névtípus importálása

A null értékű importálási szimbólum neve azonnal követi a társított importálási fejlécet. Az importálási fejléc Névtípus mezőjéhez a következő értékek vannak definiálva. Jelzik, hogyan kell a nevet használni az importálást jelképező megfelelő szimbólumok létrehozásához:

Állandó Érték Leírás
IMPORT_OBJECT_ORDINAL 0 Az importálás sorszám szerint történik. Ez azt jelzi, hogy az importálás fejlécének Sorszám/Emlékeztető mezőjében szereplő érték az importálás sorszáma. Ha ez az állandó nincs megadva, akkor az Ordinal/Hint mezőt mindig az importálás tippjeként kell értelmezni.
IMPORT_OBJECT_NAME 1 Az importálás neve megegyezik a nyilvános szimbólum nevével.
IMPORT_OBJECT_NAME_NOPREFIX 2 Az importálás neve a nyilvános szimbólum neve, de kihagyja a kezdő ?, @vagy opcionális _nevet.
IMPORT_OBJECT_NAME_UNDECORATE 3 Az importálás neve a nyilvános szimbólum neve, de kihagyja a kezdő ?, @vagy opcionális _nevet, és az első @-nál csonkolja.

A függelék: Authenticode PE-rendszerkép kivonatának kiszámítása

A rendszer várhatóan számos attribútumtanúsítványt használ a képek integritásának ellenőrzéséhez. A leggyakoribb azonban az Authenticode aláírás. Az Authenticode aláírással ellenőrizheti, hogy a PE-lemezképfájl megfelelő szakaszai semmilyen módon nem módosultak-e a fájl eredeti formájából. A feladat elvégzéséhez az Authenticode-aláírások egy PE-rendszerkép kivonatát tartalmazzák

Mi az Authenticode PE-rendszerkép kivonata?

Az Authenticode PE-rendszerkép kivonata vagy röviden fájlkivonata hasonló a fájl ellenőrzőösszegéhez, mivel egy kis értéket hoz létre, amely egy fájl integritásához kapcsolódik. Egy ellenőrzőösszeget egy egyszerű algoritmus állít elő, és elsősorban a memóriahibák észlelésére szolgál. Ez azt jelzi, hogy a lemezen lévő memóriablokk hibás lett-e, és az ott tárolt értékek sérültek-e. A fájlkivonatok hasonlóak az ellenőrzőösszeghez, mivel a fájlsérülést is észleli. A legtöbb ellenőrzőösszeg-algoritmussal ellentétben azonban nagyon nehéz úgy módosítani egy fájlt, hogy ugyanazzal a fájlkivonatkal rendelkezik, mint az eredeti (nem módosított) űrlapja. Ez azt jelzi, hogy az ellenőrzőösszegek olyan egyszerű memóriahibákat észlelnek, amelyek sérüléshez vezetnek, de a fájlkivonatok felhasználhatók a fájlok szándékos, sőt apró módosításainak észlelésére, például vírusok, hackerek vagy trójai programok által bevezetett módosítások észlelésére.

Az Authenticode-aláírásban a fájlkivonat digitálisan alá van írva egy olyan titkos kulccsal, amelyet csak a fájl aláírója ismer. A szoftverfelhasználók a fájl kivonatértékének kiszámításával és az Authenticode digitális aláírásban található aláírt kivonat értékével való összehasonlításával ellenőrizhetik a fájl integritását. Ha a fájlkivonatok nem egyeznek, a PE-rendszerkép kivonata által lefedett fájl egy része módosult.

Mit fed le az Authenticode PE-rendszerkép kivonata?

Nem lehetséges vagy kívánatos, hogy az összes képfájladat szerepeljen a PE-rendszerkép kivonatának kiszámításában. Néha egyszerűen nemkívánatos jellemzőket jelenít meg (például a hibakeresési információk nem távolíthatók el a nyilvánosan közzétett fájlokból); néha egyszerűen lehetetlen. Például nem lehet a képfájlban lévő összes információt authenticode aláírásba foglalni, majd beszúrni az authenticode aláírást, amely az adott PE-rendszerkép kivonatát tartalmazza a PE-lemezképbe, majd később képes lesz azonos PE-rendszerkép kivonatot létrehozni úgy, hogy az összes képfájl-adatot újra belefoglalja a számításba, mert a fájl most már tartalmazza az eredetileg nem használt Authenticode-aláírást.

Az Authenticode PE-rendszerkép kivonatának létrehozásának folyamata

Ez a szakasz azt ismerteti, hogyan történik a PE-rendszerkép kivonatának kiszámítása, és hogy a PE-rendszerkép mely részei módosíthatók az Authenticode-aláírás érvénytelensége nélkül.

Megjegyzés:

Egy adott fájl pe-lemezkép kivonata külön katalógusfájlban is szerepelhet anélkül, hogy attribútumtanúsítványt kellene belefoglalni a kivonatolt fájlba. Ez azért fontos, mert lehetővé válik a PE-rendszerkép kivonatának érvénytelenítése egy Authenticode-aláírású katalógusfájlban egy olyan PE-rendszerkép módosításával, amely valójában nem tartalmaz Authenticode-aláírást.

A pe-lemezkép szakaszaiban található, a szakasztáblában megadott összes adat teljes egészében kivonatolt, kivéve a következő kizárási tartományokat:

  • Az opcionális fejléc Windows-specifikus mezőinek CheckSum fájlmezője. Ez az ellenőrzőösszeg tartalmazza a teljes fájlt (beleértve a fájlban lévő attribútumtanúsítványokat is). Az ellenőrzőösszeg minden valószínűség szerint eltér az eredeti értéktől az Authenticode aláírás beszúrása után.

  • Attribútumtanúsítványokkal kapcsolatos információk. Az Authenticode-aláíráshoz kapcsolódó PE-rendszerkép területei nem szerepelnek a PE-rendszerkép kivonatának kiszámításában, mert az Authenticode-aláírások a kép teljes integritásának befolyásolása nélkül is hozzáadhatók vagy eltávolíthatók egy képből. Ez nem probléma, mert vannak olyan felhasználói forgatókönyvek, amelyek a PE-rendszerképek újraaláírásától vagy egy időbélyeg hozzáadásától függnek. Az Authenticode kizárja a következő információkat a kivonatszámításból:

    • Az opcionális fejlécadat-könyvtárak Tanúsítványtábla mezője.

    • A Tanúsítványtábla és a megfelelő tanúsítványok, amelyekre a tanúsítványtábla mező mutat közvetlenül a fenti felsorolásban.

    A PE-rendszerkép kivonatának kiszámításához az Authenticode címtartomány szerint rendezi a szakasztáblában megadott szakaszokat, majd kivonatolja az eredményként kapott bájtsorozatot, és átadja a kizárási tartományoknak.

  • Az utolsó szakasz végének információi. Az utolsó szakaszon (a legmagasabb eltolással definiált) terület nincs kivonatolva. Ez a terület gyakran tartalmaz hibakeresési információkat. A hibakeresési információk általában tanácsadónak tekinthetők a hibakeresők számára; nem befolyásolja a végrehajtható program tényleges integritását. A termék kézbesítése után szó szerint eltávolítható a hibakeresési információ a rendszerképből, és nem befolyásolja a program működését. Valójában ez néha lemezmentési mértékként történik. Érdemes megjegyezni, hogy a PE-rendszerkép megadott szakaszaiban található hibakeresési információk nem távolíthatók el az Authenticode aláírás érvénytelensége nélkül.

A Windows Platform SDK-ban található makecert és signtool eszközökkel kísérletezhet az Authenticode-aláírások létrehozásával és ellenőrzésével. További információ: Referencia, lent.

Hivatkozások

Letöltések és eszközök a Windowshoz (beleértve a Windows SDK-t is)

Tanúsítványok létrehozása, megtekintése és kezelése

Kernel-Mode kódaláírási útmutató (.doc)

SignTool

Windows Authenticode Portable Végrehajtható aláírás formátum (.docx)

ImageHlp-függvények