Tabulka exportů - 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 exportů

26. října 2001, 00.00 | V dalším díle seriálu o PE file formatu si popíšeme tabulku exportů - druhou stranu mince tabulky importů.

V minulých dílech jsme se bavili o importovaných funkcích. Druhou stranou mince jsou funkce exportované. Je to jednoduché - aby mohli být funkce nějakým PE soborem importovány, musí je jiný PE soubor exportovat.
Z minulého dílu víme, že funkce může být importována dvěma způsoby - podle jména a podle umístění (ordinální funkce). Je tedy logické, že u exportovaných funkcí tomu musí být stejně. 
Exportování ordinálních funkcí je však velmi zrádné. Nádherným příkladem jsou DLL knihovny, kde programátor nemůže ovlivnit umístění takovýchto funkcí. Při upgradu DLL knihovny tak mohou nastat problémy se všemi programy, které ji využívají.
Stejně jako u tabulky importů, jsou veškeré potřebné informace pro nalezení tabulky exportů uloženy v DataDirectory (pole struktur IMAGE_DATA_DIRECTORY). Tabulka je definována strukturou IMAGE_EXPORT_DIRECTORY:

typedef struct _IMAGE_EXPORT_DIRECTORY {
DWORD Characteristics;
DWORD TimeDateStamp;
WORD MajorVersion;
WORD MinorVersion;
DWORD Name;
DWORD Base;
DWORD NumberOfFunctions;
DWORD NumberOfNames;
DWORD AddressOfFunctions; 
DWORD AddressOfNames; 
DWORD AddressOfNameOrdinals; 
} IMAGE_EXPORT_DIRECTORY, *PIMAGE_EXPORT_DIRECTORY;

AddressOfFunctions ukazuje na pole adres jednotlivých exportovaných funkcí. Počet prvků tohoto pole je NumberOfFunctions
AddressOfNames ukazuje na pole RVA jmen exportovaných funkcí. Počet prvků tohoto pole je NumberOfNames.
Pokud nejsou exportovány ordinální funkce, měli by se hodnoty NumberOfFunctions a NumberOfNames rovnat. Pokud ano, měla by platit rovnice: NumberOfFunctions - NumberOfNames = počet ordinálních funkcí.
Mezi poli adres a názvů ale není žádná vazba. Je proto třeba je nějak dodatečně propojit.
Od toho existuje pole indexů (WORD), na které ukazuje AddressOfNameOrdinals. Je jakousi vazbou mezi názvy funkcí a jejich adresami (=> nevztahuje se k ordinálním funkcím). Toto pole má stejný počet prvků jako pole názvů a každý jeho prvek přísluší témuž prvku v poli názvů. Obě pole tak musí být zpracovávána současně.
Ke každému názvu funkce je vždy přiřazena jen jedna adresa - to však nemusí neplatí naopak!!

Postup, jak využít index k výpočtu RVA exportované funkce je následující:

;ebx = AddressOfNameOrdinals
mov dx,[ebx] ;dx obsahuje index umístění v poli adres
movzx edx,dx ;doplnit nulami
shl edx,2 ;*4
add edx, AddressOfFunctions ;edx = RVA

Využijete-li výše zmiňovaného algoritmu ve smyčce (např.chcete-li RVA všech export. funkcí) nezapomeňte zvyšovat hodnotu AddressOfNameOrdinals o velikost jednoho prvku pole, na které ukazuje - tedy WORD. AddressOfFunctions se samozřejmě nezvyšuje - není třeba, zvyšuje se index.

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: