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:
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:
|
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:
|
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:
|
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):
- Obecná struktura PE souboru
- Jak ověřit platnost PE souboru??
- PE hlavička
- Tabulka sekcí
- Tabulka importů - první část
- Tabulka importů - druhá část
- Tabulka exportů
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007