В информатике подмена указателей — это преобразование ссылок на основе имени или положения в прямые ссылки указателей ( адреса памяти ). Обычно выполняется во время десериализации или загрузки перемещаемого объекта из файла на диске, например исполняемого файла или структуры данных на основе указателей .
Обратная операция, замена указателей памяти на позиционно-независимые символы или позиции, иногда называется unswizzling и выполняется во время сериализации (сохранения). В качестве альтернативы обе операции также могут называться swizzling.
Легко создать структуру данных связанного списка, используя такие элементы:
структурный узел { int data ; структурный узел * next ; };
Но сохранение списка в файле и его повторная загрузка (в большинстве операционных систем) сломает все ссылки и сделает список бесполезным, поскольку узлы почти никогда не будут загружены в одни и те же области памяти. Один из способов полезного сохранения и извлечения списка — назначить уникальный номер идентификатора каждому узлу, а затем расконсервировать указатели, превратив их в поле, указывающее номер идентификатора следующего узла:
struct node_saved { int data ; int id_number ; int id_number_of_next_node ; };
Такие записи можно сохранять в файл в любом порядке и перезагружать, не нарушая список. Другие варианты включают сохранение смещения файла следующего узла или числа, указывающего его положение в последовательности сохраненных записей, или простое сохранение узлов в порядке в файл.
После загрузки такого списка поиск узла по его номеру становится громоздким и неэффективным (последовательный поиск). Обход списка был очень быстрым с исходными указателями «next». Чтобы преобразовать список обратно в его исходную форму или перевернуть указатели, требуется найти адрес каждого узла и превратить поля id_number_of_next_node обратно в прямые указатели на нужный узел.
Существует потенциально неограниченное количество форм, в которые можно преобразовать указатель, но вот некоторые из самых популярных:
Swizzling в общем случае может быть сложным. Ссылочный граф указателей может содержать произвольное количество циклов ; это усложняет поддержание отображения от старых неперемещенных значений к новым адресам. Ассоциативные массивы полезны для поддержания отображения, в то время как алгоритмы, такие как поиск в ширину, помогают проходить по графу, хотя оба они требуют дополнительного хранилища. Различные библиотеки сериализации предоставляют общие системы swizzling. Однако во многих случаях swizzling можно выполнить с упрощающими предположениями, такими как древовидная или списочная структура ссылок.
Различают следующие виды свизлинга:
В целях безопасности unswizzling и swizzling должны реализовываться с большой осторожностью. В частности, представление злоумышленником специально созданного файла может позволить получить доступ к адресам за пределами ожидаемых и надлежащих границ. В системах со слабой защитой памяти это может привести к раскрытию конфиденциальных данных или изменению кода, который, вероятно, будет выполнен. Если система не реализует защиту от выполнения данных, она может быть серьезно скомпрометирована установкой различных видов вредоносного ПО .
Методы защиты включают проверки перед передачей данных в приложение: