Введение

В компьютерной науке самомодифицирующийся код (SMC или SMoC) — это код, который изменяет собственные инструкции во время выполнения, обычно для сокращения длины пути выполнения инструкций и повышения производительности или просто для уменьшения избыточности схожего кода, что упрощает поддержку. Термин обычно применяется только к коду, где самомодификация является намеренной, а не к ситуациям, когда код случайно изменяет себя из-за ошибки, такой как переполнение буфера. Самомодифицирующийся код может включать перезапись существующих инструкций или генерацию нового кода во время выполнения и передачу управления этому коду. Самомодификация может использоваться как альтернатива методу "установки флага" и условного ветвления программы, применяемому главным образом для уменьшения количества проверок условий. Этот метод часто используется для условного вызова кода тестирования/отладки без дополнительных вычислительных затрат на каждый цикл ввода-вывода. Изменения могут выполняться: только во время инициализации на основе входных параметров (когда процесс чаще описывается как "конфигурация" программного обеспечения и в некоторой степени аналогичен, с точки зрения аппаратного обеспечения, установке перемычек на печатных платах). Изменение указателей точек входа в программу является эквивалентным косвенным методом самомодификации, но требует одновременного существования одного или нескольких альтернативных путей выполнения инструкций, что увеличивает размер программы. в процессе выполнения ("на лету") — на основе конкретных состояний программы, достигнутых в ходе выполнения.

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

Язык сборки

Самомодифицирующийся код довольно просто реализовать при использовании языка ассемблера. Инструкции могут быть динамически созданы в памяти (или же перезаписаны поверх существующего кода в незащищенной области памяти программ). В меньшей степени, ядро DR DOS также оптимизирует критически важные участки кода при загрузке, в зависимости от поколения используемого процессора.