Wskaźnik pulsuje - Pointer swizzling

W informatyce , wskaźnik swizzling jest konwersja odniesienia na podstawie nazwy lub pozycji w bezpośrednich wskaźnika odniesienia ( adresy pamięci ). Jest to zwykle wykonywane podczas deserializacji lub ładowania relokowalnego obiektu z pliku dyskowego, takiego jak plik wykonywalny lub struktura danych oparta na wskaźnikach .

Operacja odwrotna, polegająca na zastępowaniu wskaźników pamięci symbolami lub pozycjami niezależnymi od pozycji, jest czasami określana jako unwizzling i jest wykonywana podczas serializacji (zapisywania).

Przykład

Utworzenie połączonej struktury danych listy przy użyciu takich elementów jest łatwe :

struct node {
        int data;
        struct node *next;
};

Ale zapisanie listy w pliku, a następnie ponowne załadowanie jej (w większości systemów operacyjnych) zepsuje każde łącze i sprawi, że lista stanie się bezużyteczna, ponieważ węzły prawie nigdy nie zostaną załadowane do tych samych lokalizacji pamięci. Jednym ze sposobów przydatnego zapisywania i pobierania listy jest przypisanie unikalnego numeru identyfikacyjnego do każdego węzła, a następnie przełączenie wskaźników, przekształcając je w pole wskazujące numer identyfikacyjny następnego węzła:

struct node_saved {
        int data;
        int id_number;
        int id_number_of_next_node;
};

Takie rekordy można zapisać w pliku w dowolnej kolejności i ponownie wczytać bez przerywania listy. Inne opcje obejmują zapisanie przesunięcia pliku następnego węzła lub liczby wskazującej jego pozycję w sekwencji zapisanych rekordów.

Po załadowaniu takiej listy znalezienie węzła na podstawie jego numeru jest uciążliwe i nieefektywne (wyszukiwanie szeregowe). Przeglądanie listy było bardzo szybkie dzięki oryginalnym wskazówkom „następne”. Aby przekonwertować listę z powrotem do jej pierwotnej postaci lub zamienić wskaźniki, wymaga znalezienia adresu każdego węzła i przekształcenia pól id_number_of_next_node z powrotem w bezpośrednie wskaźniki do prawego węzła.

Metody nawijania

Istnieje potencjalnie nieograniczona liczba formularzy, w których można zamienić kursor, ale do najpopularniejszych należą:

  • Przesunięcie wskazanego obiektu w pliku
  • Indeks wskazywanego obiektu w jakiejś sekwencji rekordów
  • Unikalny identyfikator posiadany przez wskazany obiekt, taki jak numer ubezpieczenia społecznego danej osoby ; w bazach danych wszystkie wskaźniki są odwrócone w ten sposób (patrz Klucz obcy ).

Metody swizzlingu

Swizzling w ogólnym przypadku może być skomplikowany. Wykres odniesienia wskaźników może zawierać dowolną liczbę cykli ; komplikuje to utrzymywanie mapowania ze starych wartości niezmienionych na nowe adresy. Tablice asocjacyjne są przydatne do utrzymywania odwzorowania, podczas gdy algorytmy takie jak przeszukiwanie wszerz pomagają w poruszaniu się po grafie, chociaż oba wymagają dodatkowej pamięci. Różne biblioteki serializacji zapewniają ogólne systemy swizzling. W wielu przypadkach swizzling można jednak wykonać przy uproszczonych założeniach, takich jak drzewo lub struktura listy odniesień.

Różne rodzaje swizzlingu to:

  • Automatyczne swizzling
  • Swizzling na żądanie

Potencjalne słabości bezpieczeństwa

Ze względów bezpieczeństwa, unoszenie i swizzling należy wdrażać z dużą ostrożnością. W szczególności prezentacja specjalnie spreparowanego pliku przez osobę atakującą może umożliwić dostęp do adresów poza oczekiwanymi i właściwymi granicami. W systemach ze słabą ochroną pamięci może to prowadzić do ujawnienia poufnych danych lub modyfikacji kodu, który prawdopodobnie zostanie wykonany. Jeśli system nie posiada zabezpieczeń przed wykonaniem danych, system może zostać poważnie zagrożony przez instalację różnego rodzaju złośliwego oprogramowania .

Metody ochrony obejmują weryfikacje przed udostępnieniem danych do aplikacji:

  • Że każde przesunięcie mieści się w granicach odczytanych danych.
  • Tablica indeksów i wskazanych rekordów jest podobnie ograniczona.
  • Te identyfikatory są unikalne i, jeśli są wrażliwe, zaszyfrowane.
  • Że wszystkie dane o zmiennej długości są ograniczone do długości nieprzekraczających rzeczywistego przydziału.
  • Te przydziały są rozsądnych rozmiarów.
  • Te alokacje, które nie są ładowane z odczytem danych, są czyszczone lub ładowane za pomocą określonego wzorca.

Bibliografia

Linki zewnętrzne