Article View: pl.comp.lang.asm
Article #400Re: Asembler i Windows
From: Paweł Pawlak
Date: Mon, 17 Jul 2006 19:40
Date: Mon, 17 Jul 2006 19:40
65 lines
3942 bytes
3942 bytes
Dnia 7/17/2006 6:06 PM, Remek wrote: > >> adres funkcji znany jest dopiero w momencie załadowania programu - > wypełnia go system w trakcie ładowania exeka. > > Wszystko sie zgadza. Jednak pewne informacje muszą być wcześniej > umieszczone zarówno w DLL'u, jak i execu. Jak są one wykorzystywane > bardzo dobrze widać jeśli ładujemy DLL'a "ręcznie", tzn przez > LoadLibrary i GetProcAddress. Natomiast nie wiem jak to robi > "automatycznie" sam system. Byłbym Ci wdzięczny za jakiś link > do opisu tego procesu (oczywiście jeśli znasz i zechcesz podać). > W uproszczeniu: plik wykonywalny zawiera sekcję importów. Składa się ona z kilku części zawierających: a) część określającą nazwę biblioteki b) część zapełnioną numerami lub nazwami funkcji importowanych (zależy od ostatniego bitu - jeśli zapalony to import przez numer, jeśli zgaszony - to przez nazwę) c) część przeznaczoną na adresy zaimportowanych funkcji (IAT - Import Address Table) Loader odczytuje nazwę biblioteki - jeśli jest już w pamięci, to mapuje ją do procesu, jeśli nie ma - ładuje i mapuje do procesu (po drodze sprawdza sekcję importów tej biblioteki i jeśli ona ma swoje biblioteki importowe to sprawdza, czy są w pamięci itd.). Jeśli biblioteka ma być przerelokowana, to loader to robi (jest do tego specjalna sekcja). Po drodze pewnie buduje tablicę eksportów biblioteki. Jak już bibliotek jest załadowana i zamapowana, loader odczytuje numer lub nazwę funkcji, którą ma zaimportować. Jeśli jest numer, to po prostu w tabeli eksportów biblioteki znajduje adres funkcji o podanym numerze i wstawia go do IAT. Jeśli import odbywa się przez nazwę, to: 1. loader sprawdza, czy przy nazwie znajduje się tzw. hint, czyli jakby numer funkcji o podanej nazwie a) jeśli tak, to sprawdza, czy pod podanym numerem w tabeli eksportów rzeczywiście znajduje się ta funkcja i jeśli tak, to jej adres wstawia do IAT b) jeśli nie, to po prostu wyszukuje funkcję po nazwie 2. jeśli nie ma hinta, to wyszukuje w tabeli eksportów funkcję o podanej nazwie Jeśli funkcja została znaleziona (z użyciem hinta czy bez), to do IAT wędruje jej adres. Skoki do importowanych funkcji odbywają się (zwykle) właśnie przez IAT. To tyle w uproszczeniu. Funkcje mogą być jeszcze forwardowane (czyli mogą wskazywać na funkcje z innych bibliotek), mogą być ładowane z opóźnieniem (delayload). Jeśli Ci to nie wystarcza, to musisz sam poszukać w sieci odpowiednich materiałów - powyższy opis to moje wnioski z gdzieś-tam-kiedyś wyczytanych informacji oraz z lektury specyfikacji PE/COFF (http://www.microsoft.com/whdc/system/platform/firmware/PECOFF.mspx) Pozdrawiam, Morris
Technical Details
Message-ID:
<e9gp6i$dla$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<e8lpj6$hfl$1@atlantis.news.tpi.pl> <e8rcht$31e$1@atlantis.news.tpi.pl> <e8vqbr$rn3$1@news.onet.pl> <e96gca$qf4$1@inews.gazeta.pl> <e996em$u9m$1@news.onet.pl> <e9gcb2$pie$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: Paweł Pawlak <morr!s@elys!um.pl> Newsgroups: pl.comp.lang.asm Subject: Re: Asembler i Windows Date: Mon, 17 Jul 2006 21:40:53 +0200 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 65 Message-ID: <e9gp6i$dla$1@inews.gazeta.pl> References: <e8lpj6$hfl$1@atlantis.news.tpi.pl> <e8rcht$31e$1@atlantis.news.tpi.pl> <e8vqbr$rn3$1@news.onet.pl> <e96gca$qf4$1@inews.gazeta.pl> <e996em$u9m$1@news.onet.pl> <e9gcb2$pie$1@inews.gazeta.pl> NNTP-Posting-Host: eny189.neoplus.adsl.tpnet.pl Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1153165330 13994 83.20.14.189 (17 Jul 2006 19:42:10 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Mon, 17 Jul 2006 19:42:10 +0000 (UTC) X-User: mickey_knox X-Antivirus: avast! (VPS 0628-5, 2006-07-14), Outbound message In-Reply-To: <e9gcb2$pie$1@inews.gazeta.pl> X-Antivirus-Status: Clean User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; pl-PL; rv:1.8.0.2) Gecko/20060404 SeaMonkey/1.0.1 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit