a fine detail on how DLL are relokated as the result of a base address collision, and consequences

Raymond

19 stycznia, 2017

jeśli biblioteka DLL musi zostać przeniesiona z powodu konfliktu adresu bazowego, obraz zostanie przeniesiony, a cała biblioteka DLL jest teraz wspierana przez plik strony.

jeśli dokładniej przeczytasz opis, zobaczysz, że nie jest to dokładnie Cała przeniesiona biblioteka DLL, która jest wspierana przez plik strony. Dokładniej, wszystkie strony zawierające poprawki są umieszczane w pliku strony. Jeśli masz szczęście i masz stronę bez żadnych poprawek, to ta strona nadal będzie pobierana z obrazu, ponieważ jądro nie zastosowało do niej żadnych poprawek, a zatem nie spowodowało kopiowania przy zapisie dla tej strony, więc nadal jest wspierana przez obraz systemu plików.

jednym z argumentów, które widziałem, aby celowo spowodować kolizję adresu bazowego, jest to, że przeniesione DLL zostanie skopiowane do pliku strony, co jest winem, jeśli plik strony jest na szybszym nośniku niż DLL. Na przykład plik strony może znajdować się na dysku SSD lub (gasp) dysku RAM.

ta logika nie bierze pod uwagę przypadku stron bez poprawek. Strony te nadal będą wyświetlać strony bezpośrednio z oryginalnego pliku, co stanowi problem, jeśli oryginalny plik znajduje się na bardzo wolnym nośniku lub nośniku, który może zostać utracony, takim jak napęd CD-ROM lub dysk sieciowy.

Na szczęście nie musisz grać w śmieszne gry z konfliktami adresów bazowych, aby załadować całą bibliotekę DLL do pliku strony. Zamiast tego Użyj flagi / SWAPRUN linker, która pozwala określić w nagłówku modułu, że program ładujący powinien skopiować obraz do pliku wymiany.

Raymond Chen

Obserwuj

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.