Метка: self-modifying
Самомодифицирующийся код (self-modifying code) — программный приём, при котором приложение создаёт или изменяет часть своего программного кода в процессе выполнения. Такой код обычно применяют в программах, написанных под процессор с фон-неймановской организацией памяти. Это принцип совместного хранения кода и данных памяти. Фон-неймановской архитектуре соответствует большинство наиболее распространенных в настоящее время процессоров. Например, процессоры Intel семейства x86/IA-64.
Типы модификации кода
По времени проведения модификации метод делится на:
- Модификация при инициализации — проводится один раз, перед запуском изменяемого кода
- Модификация на лету (on-the-fly) — изменение состояния программы во время исполнения
В обоих случаях изменение проходит непосредственно в машинном коде, когда новые инструкции перезаписывают старые (напр. условный переход JZ, JNZ, JE, JNE и т.п. заменяются на безусловный переход JMP или NOP). В наборе инструкций IBM/360 и Z/Architecture имеется инструкция EXECUTE (EX), которая перезаписывает целевую инструкцию (записанную во втором байте команды EX) самыми младшими 8 битами регистра 1. На указанных архитектурах с её помощью реализуется стандартный, законный метод временного изменения инструкций.
Необходимость применения метода «self-modifying»
Процесс модификации кода в процессе выполнения программы достаточно опасен и может приводить к аварийному завершению. Во многих случаях именно вирусы и другое программное обеспечение шпионского толка переводит программу в разряд «самомодифицирующиеся программы» именно с целью так или иначе навредить ему. Тем не менее, возможны ситуации, когда модификация кода при выполнении программы необходима для внесения изменений «на лету» в код third-party библиотеки без исходного кода. Зачастую программные продукты-анализаторы используют модификацию кода для перехвата вызовов, осуществляющихся компонентами анализируемого процесса для сбора разного рода статистики.