Самомодифицирующийся код | это... Что такое Самомодифицирующийся код? (original) (raw)

Question book-4.svg В этой статье не хватает ссылок на источники информации. Информация должна быть проверяема, иначе она может быть поставлена под сомнение и удалена.Вы можете отредактировать эту статью, добавив ссылки на авторитетные источники.Эта отметка установлена 14 мая 2011.

Самомодифицирующийся код (СМК) — программный приём, при котором приложение создаёт или изменяет часть своего программного кода во время выполнения. Такой код обычно применяют в программах, написанных под процессор с фон-неймановской организацией памяти.

По времени проведения модификации метод делится на

В обоих случаях изменение проходит непосредственно в машинном коде, когда новые инструкции перезаписывают старые (например, сравнение и переход заменяются на безусловный переход или NOP). В наборе инструкций IBM/360 и Z/Architecture имеется инструкция EXECUTE (EX), которая перезаписывает целевую инструкцию (записанную во втором байте команды EX) самыми младшими 8 битами регистра 1. На указанных архитектурах с её помощью реализуется стандартный, законный метод временного изменения инструкций.

Содержание

Назначение

Основные применения самомодифицирующегося кода:

Применимость к процессорам с Гарвардской архитектурой

В Гарвардской архитектуре память для кода и память для данных разделены. Соответственно, в них сильно усложняется работа самомодифицирующегося кода. Хотя архитектура x86 определена как фон-неймановская (с единой памятью кода и данных), большинство современных процессоров имеют раздельные области кэша для кода и для данных. При этом кэш кода не поддерживает запись, и при изменении закэшированного участка памяти может потребоваться либо аппаратно проведенный частичный или полный сброс кэша кода (x86) либо явная инструкция процессору на сброс кэша кода (sparc). Из-за этого только что измененный код может исполняться медленнее, либо потребовать дополнительных команд для правильной работы. Также изменение кода сбрасывает конвейер процессора.[2]

Также, некоторые идеи Гарвардской архитектуры реализуются в ОС (например, Data Execution Prevention в ОС Windows, W^X в OpenBSD) и в процессорах (для x86 — бит NX и подобные). В этих реализациях отдельные фрагменты памяти могут быть помечены как неисполняемые (то есть данные) или как исполняемые но немодифицируемые (то есть код без права на изменение). Использование самомодифицирующегося кода в таких программных окружениях усложняется, так как его приходится располагать либо в незащищенной области памяти (иногда такой областью является стэк), либо явно отключать защиту для подлежащего изменению кода.

Использование

См. также

Примечания

  1. См., например, исходный код Doom Legacy, функция ASM_PatchRowBytes.
  2. Касперски, абзац с "Процессоры семейства Pentium .."

Ссылки