Ładowanie biblioteki z pamięci

0

Czy ktokolwiek orientuje się, gdzie mogę znaleźć przykład ładowania dlla z pamięci, zamiast z dysku? Jeśli nie przykład, to przynajmniej jakiś tekst, który dobrze tłumaczy, w jaki sposób system wczytuje biblioteki. Szukałem sporo i jedyne, co znalazłem, to tekst pod adresem: http://www.joachim-bauch.de/tutorials/load_dll_memory.html/en , jednak ten opis jest jak dla mnie trochę zbyt lakoniczny. Kod źródłowy dołączony jest do artykułu, także nie jest zbyt czytelny dla kogoś, kto z c/c++ zna tylko podstawy. Jeśli więc ktoś jest w posiadaniu jakichś kodów/materiałów, byłbym wdzięczny, gdyby mi je podesłał.

0

ladowanie biblioteki z pamieci? Czy chodzi Ci o ladowanie (uruchamianie) jakiejs funkcji z pamieci, ktora jest zawarta w bibliotece aktywnej w pamieci?

0

Chodzi mi o załadowanie biblioteki. Czyli to, co robi funkcja LoadLibrary(), tylko że ona ładuje bibliotekę z dysku, a ja chcę, żeby ładowało, powiedzmy ze streama, czy czegoś podobnego.

0

To po drodze zapisz na dysk ;) Najprostsze rozwiązania rulez!! :)

0

Nie ma takiego jednolitego sposobu. Moze sam zaalokuj pamiec poprzez VirtualAlloc z opcja PAGE_EXECUTE. Ale bys musial tam odpowiednio dodac biblioteke musial bys kazda sekcje (biblioteka dll zbudowana jest w standardowy sposob jak pliki exe typu PE) z pliku odpowiednio rozplanowac. Jest to dosc wariacki pomysl, ale tak chyba tez mozna. Ale najlepiej to chyba wykonac jak napisal przedmowca - zapisac do pliku i zaladowac.

0

Na pomysł taki wpadłem sam :). Tylko, gdyby mnie ten sposób zadowalał, to bym nie pytał, jak załadować z pamięci :>. Jest to jak najzupełniej możliwe, bo windows przecież robi to samo, tylko najpierw odczytuje plik dll. Poza tym, na stronie, której adres podałem, opisany jest taki loader, ale jak napisałem w pierwszym poście, ten artykuł jest dla mnie za mało zrozumiały. Dlatego szukam jakiegoś dokładniejszego opisu i/lub przykładowego kodu w OP.

0

Rzeczywiscie. Spojrzalem na strone, ktora podales i tak sie robi mniej wiecej jak opisalem. Chodzi oto, ze musisz najpierw zbadac budowe biblioteki. To znaczy, wiedziec w ktorym miejscu pamieci ma byc zaalokowana oraz znac rozmiar jaki bedziesz musial przydzielic na pamiec. Aby to wiedziec rozmiar to weilkosc STUB (malego programiku dosowego, dostepnego w kazdym pliku wykonywalnym PE, w tym i bibliotek 32 bitowych) plus rozmiar naglowka. Dlaej bys musial sprawdzic jakie sa potrzebne wielkosci pamieci dla kazdej sekcji (rozmiary wirtualne) i wszystkie zsumowal z poprzednia wielkoscia i taka wilekosc zaalokowac (VirtualAlloc). Pozniej kazda sekcje bys musial odpowiednio wstawic do tej pamieci. Oczywiscie na samym poczatku naglowek.
Mam mala ochote samemu sprobowac to zrobic, ale jeszcze sesja mi sie nie skonczyla i niestety musze sie kuc.

0

A czy wiesz może, gdzie znajdę informacje na temat formatu takiego pliku, ale już w pamieci? Jak wygląda pamięć takiego modułu, bo wszędzie jest tylko opis pliku PE, a domyślam się, że plik ten nie jest do pamięci wrzucany 'jak leci'. Czy może się mylę?

0

_IMAGE_SECTION_HEADER - ta struktura opisuje dana sekcje:
VirtualAddress = adres wirtualny, gdzie ma sie umiescic sekcja w pamieci. Oczywiscie jest to adres wzgledny, liczony od miejsca zaalokowanej biblioteki
SizeOfRawData = no i potrzebny rozmiar.

Sekcje fizyczne (czyli tak jak zapisane sa w pliku) opisane sa:
PointerToRelocations = adres fizyczny.
PointerToLinenumbers = rozimar fizyczny. Ale uwaga! Rozmiar moze wynosic zero a pamiec wirtualna iles tam. Oznacza to, ze pamiec i tak musi byc zaalokowana. bedzie po prostu czysta i potrzebna moze na jakies inne dane.
Ale nasuwa mi sie jedno pytanie. Bo sekcje maja rozny rodzaj przydzielonej pamieci (informuje o tym: Characteristics w postaci zapisu cyfry jako flagi) tak wiec dla kazdej sekcji pozniej trzeba zmienic na odpowiedni rodzaj pamieci.

1 użytkowników online, w tym zalogowanych: 0, gości: 1