Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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
- MS-DOS csonk (csak kép)
- Aláírás (csak kép)
- COFF-fájlfejléc (objektum és kép)
- Nem kötelező fejléc (csak kép)
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
- Szakaszadatok
- COFF-áthelyezések (csak objektum)
- COFF-sorszámok (elavult)
- COFF szimbólumtábla
- Kiegészítő szimbólumrekordok
- COFF sztringtábla
- Az attribútumtanúsítvány táblája (csak kép)
- Delay-Load Táblák importálása (csak kép)
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:
- Adja hozzá az első attribútumtanúsítvány dwLength értékét a kezdő eltoláshoz.
- 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.
- 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.
- 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 .debug szakasz
- A .drectve szakasz (csak objektum)
- A .edata szakasz (csak kép)
- Az .idata szakasz
- A .pdata szakasz
- A .reloc szakasz (csak kép)
- A .tls szakasz
- A terheléskonfigurációs struktúra (csak kép)
- A .rsrc szakasz
- A .cormeta szakasz (csak objektum)
- A .sxdata szakasz
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:
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.
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.
A betöltő a TLS-index értékét az Index címe mező által megjelölt helyre rendeli.
A végrehajtható kód lekéri a TLS-indexet és a TLS-tömb helyét is.
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.
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 0x00000100A modul vezérlőfolyamat- és írási integritás-ellenőrzéseket végez.
#define IMAGE_GUARD_CFW_INSTRUMENTED 0x00000200A modul érvényes vezérlőfolyamat-cél metaadatokat tartalmaz.
#define IMAGE_GUARD_CF_FUNCTION_TABLE_PRESENT 0x00000400A modul nem használja a /GS biztonsági cookie-t.
#define IMAGE_GUARD_SECURITY_COOKIE_UNUSED 0x00000800A modul támogatja az írásvédett késleltetési IAT-t.
#define IMAGE_GUARD_PROTECT_DELAYLOAD_IAT 0x00001000Az 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 0x00002000A 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 0x00004000A modul lehetővé teszi az exportálások letiltását.
#define IMAGE_GUARD_CF_ENABLE_EXPORT_SUPPRESSION 0x00008000A modul hosszú távú céladatokat tartalmaz.
#define IMAGE_GUARD_CF_LONGJUMP_TABLE_PRESENT 0x00010000Maszk 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)
Windows Authenticode Portable Végrehajtható aláírás formátum (.docx)