PE hlavička - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



Assembler

PE hlavička

20. července 2001, 00.00 | V dnešním díle se budeme zabývat podrobnou stavbou PE hlavičky. Popíšeme si strukturu FileHeader a OptionalHeader.

V dnešním díle se budeme zabývat podrobnou stavbou PE hlavičky. Ta je tvořena strukturou IMAGE_NT_HEADERS, jak již bylo řečeno v minulém díle. Jen pro připomenutí - její stavba:

typedef struct _IMAGE_NT_HEADERS {
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER32 OptionalHeader;
} IMAGE_NT_HEADERS32, *PIMAGE_NT_HEADERS32;

Co je uloženo v proměnné Signature a k čemu je tato hodnota dobrá již jsme si řekli v minulých dílech. Dnes si řekneme něco o zbývajících dvou strukturách. Tou první je struktura FileHeader. Její stavba vypadá takto:

typedef struct _IMAGE_FILE_HEADER {
WORD Machine;
WORD NumberOfSections;
DWORD TimeDateStamp;
DWORD PointerToSymbolTable;
DWORD PointerToSymbolTable;
WORD SizeOfOptionalHeader;
WORD Characteristics;
} IMAGE_FILE_HEADER, *PIMAGE_FILE_HEADER;

První proměnná Machine nese informace o hostujícím stroji. Pro platformu Intel je to hodnota IMAGE_FILE_MACHINE_I386, tedy 14Ch.
Proměnná NumberOfSections je pro nás velice důležitá, protože je v ní uložen počet sekcí v souboru. Až budeme přidávat novou sekci do souboru, budeme muset tuto hodnotu upravit.
Další tři proměnné jsou pro nás více méně nezajímavé. TimeDateStamp nese informace o datu a čase vytvoření souboru a PointerToSymbolTable a PointerToSymbolTable jsou používány při debuggování. Hned po nich přichází proměnná SizeOfOptionalHeader, která určuje velikost struktury OptionalHeader.
V poslední proměnné Characteristics je uložena charakteristika souboru - PE loader podle ní pozná např. jestli se jedná o exe nebo dll soubor. 

Poslední strukturou je OptionalHeader. Je bohužel poněkud obsáhlejší a proto vyberu jen (pro nás) nejdůležitější informace:

typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
…………
DWORD AddressOfEntryPoint;
…………
//
// NT additional fields.
//

DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
…………
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
…………
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];

} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;

AddressOfEntryPoint je RVA první instrukce, která se zpracuje, jakmile bude PE loader připraven ke spuštění souboru.
ImageBase je preferovaná nahrávací adresa pro PE soubor. Většinou bývá tato hodnota 400000h - to znamená, že se PE loader pokusí nahrát soubor do virtuálního adresového prostoru začínajícího adresou 400000h. Slovo "pokusí" jsem zvolil záměrně. PE loader nahraje soubor na tuto adresu jen v případě, že již tento adresový prostor nevyužívá jiný proces.
SectionAlignment je hodnota určující zarovnání sekcí v paměti. Např. pokud je nastavena na 1000h, musí každá sekce začínat na násobku 1000h. Pokud tedy první sekce začíná třeba na adrese 401000h a má velikost jeden jediný bajt, pak ta druhá musí začínat na adrese 402000h.
FileAlignment je totéž co SectionAlignment, ale místo v paměti, určuje zarovnání v souboru.
MajorSubsystemVersion a MinorSubsystemVersion určují verzi win32 subsystému. Pokud je nastavena na hodnotu 4.0, budou mít všechny dialogy v programu 3D vzhled.
SizeOfImage je celková velikost PE obrazu v paměti. Je součtem velikostí všech hlaviček a sekcí včetně zarovnání.
SizeOfHeaders je velikost všech hlaviček a tabulky sekcí. Dá se tedy také použít jako umístění první sekce v souboru.
Subsystem obsahuje informace o NT subsytému, pro který je daný soubor určen. Pro většinu win32 programů se používá buďto hodnota Windows GUI nebo Windows CUI (konzole).
DataDirectory je pole IMAGE_DATA_DIRECTORY struktur. Každá z nich nese RVA nějaké důležité struktury v PE souboru - např. Import, Export tabulek

Příští díl přinese popis tabulky sekcí.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » Assembler  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: