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
Tabulka sekcí
14. srpna 2001, 00.00 | Další pokračování doprovodného seriálu k Crecker Proof. Dnes o tabulce sekcí v PE souboru.
Tabulka sekcí v PE souboru je reprezentována polem struktur IMAGE_SECTION_HEADER. Počet těchto struktur (prvků pole) je uložen v proměnné NumberOfSections struktury IMAGE_FILE_HEADER (viz.minulý díl). Stavba struktury IMAGE_SECTION_HEADER je následující:
|
Jako vždy vypíchnu ty nejdůležitější proměnné.
Name obsahuje max. osmimístný název sekce. Není však ve standardním ASCIIZ string formátu a proto nemusí být ukončen nulou.
Union Misc je ve skutečnosti nahrazen jen jednou proměnou typu DWORD s názvem VirtualSize. Ta obsahuje velikost sekce v paměti (RAM) bez zarovnání (SectionAligment).
VirtualAddress je RVA sekce.
SizeOfRawData obsahuje skutečnou velikost sekce v souboru včetně zarovnání FileAlignment.
PointerToRawData ukazuje na začátek dané sekce v souboru (nikoli v paměti).
Characteristics je charakteristika sekce - např. jestli obsahuje data pouze pro čtení, zápis, spustitelný kód..atd.
Co je to tedy to Virtual, Raw a RVA??
Slovo Virtual v názvu nějaké proměnné znamená, že daná proměnná obsahuje informace pro paměť. Zatímco Raw určuje tytéž informace v souboru.
Uvedu jednoduchý příklad. Dejme tomu, že o první sekci v souboru známe následující informace (např. z PE editoru):
|
Pokud soubor otevřeme v obyčejném hexadecimálním editoru a přemístíme se na 400h(=1024 dec) - PointerToRawData znak, ocitneme se na začátku první sekce. Pokud ještě přidáme velikost samotné sekce (SizeOfRawData), tedy 600h (=1536 dec) dostaneme se na konec první a začátek druhé sekce v souboru.
Myslím, že teď již je pojem Raw (= v souboru) celkem jasný.
S pamětí je to ovšem trochu složitější.
Jak již bylo řečeno v minulém díle - ImageBase je preferovaná nahrávací adresa v paměti. Také si ale jistě pamatujete, že tato hodnota je použita jen v případě, že adresový prostor nevyužívá jiný proces. Pokud se paměť na této lokaci nepodaří alokovat, musí PE loader zvolit adresu jinou. Je proto nemožné, aby některé Virtual proměnné ukazovali na specifickou hodnotu v paměti (jak je tomu u Raw proměnných v souboru). Loader by potom musel všechny tyto proměnné najít a adekvátně je přesměrovat. Proto se zde objevuje tajemná zkratka RVA. RVA tedy real virtual address slouží k popisu umístění v paměti bez využití základní adresy - tedy ImageBase. Po jejím přičtení k ImageBase teprve dostaneme řádné umístění v paměti. Proto Virtual proměnné obsahující informace o umístění v paměti (např. V.Address) ve skutečnosti obsahují RVA těchto paměťových pozic.
Abyste se tedy např. v debuggeru podívaly na začátek první sekce v paměti, musíte k proměnné V. Address - v našem případě 1000h, přičíst hodnotu ImageBase (dejme tomu 400000h). První sekce je tedy v paměti na adrese 401000h.
Věci však nikdy nejsou tak jednoduché, jak by se zdáli. Vše se může zkomplikovat tím, že některé sekce v souboru mohou být zarovnány jinak než samotný paměťový základ. Potom se může stát přepočet z RVA třeba do offsetu peklem. V takových případech doporučuji využít služeb nějakého šikovného prográmku z široké nabídky, kterou najdete na I-netu.
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