Tabulka sekcí - 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:



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í:

typedef struct _IMAGE_SECTION_HEADER {
BYTE Name[IMAGE_SIZEOF_SHORT_NAME];
union {
DWORD PhysicalAddress;
DWORD VirtualSize;
} Misc;
DWORD VirtualAddress;
DWORD SizeOfRawData;
DWORD PointerToRawData;
DWORD PointerToRelocations;
DWORD PointerToLinenumbers;
WORD NumberOfRelocations;
WORD NumberOfLinenumbers;
DWORD Characteristics;
} IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;

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):

Name V.Size V.Address SizeOfRawData(= Raw Size) PointerToRawData(=Raw Offset)
.text     4f4h    1000h    600h   400h

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):

Tématické zařazení:

 » Rubriky  » Assembler  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

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

 

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

Uživatelské jméno:

Heslo: