Есть ли умные случаи модификации кода во время выполнения? - PullRequest
119 голосов
/ 04 апреля 2011

Можете ли вы вспомнить какие-либо законные (умные) варианты использования для модификации кода во время выполнения (программа изменяет свой собственный код во время выполнения)?

Современные операционные системы, кажется, не одобряют программы, которые делают это, так как этот метод был использован вирусами, чтобы избежать обнаружения.

Все, что я могу придумать, это какая-то оптимизация времени выполнения, которая удалитдобавить некоторый код, зная во время выполнения что-то, что не может быть известно во время компиляции.

Ответы [ 17 ]

5 голосов
/ 04 апреля 2011

Другая причина самоизменения кода (фактически «самогенерирующего» кода) заключается в реализации механизма компиляции Just-In-time для повышения производительности.Например, программа, которая считывает алгебраическое выражение и вычисляет его по диапазону входных параметров, может преобразовать выражение в машинный код перед указанием вычисления.

4 голосов
/ 04 апреля 2011

Я реализовал программу, используя эволюцию, чтобы создать лучший алгоритм. Он использовал самоизменяющийся код для изменения схемы ДНК.

2 голосов
/ 14 ноября 2013

Одним из вариантов использования является тестовый файл EICAR , который является допустимым исполняемым COM-файлом DOS для тестирования антивирусных программ.

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

Он должен использовать модификацию собственного кода, поскольку исполняемый файлдолжен содержать только печатные / печатаемые символы ASCII в диапазоне [21h-60h, 7Bh-7Dh], что значительно ограничивает число кодируемых инструкций

Подробности объяснены здесь


Он также используется для диспетчеризации операций с плавающей запятой в DOS

Некоторые компиляторы будут выдавать CD xx с xx в диапазоне от 0x34-0x3B в местах команд x87 с плавающей запятой.Поскольку CD - это код операции для инструкции int, он будет переходить в прерывание 34h-3Bh и эмулировать эту инструкцию в программном обеспечении, если сопроцессор x87 недоступен.В противном случае обработчик прерываний заменит эти 2 байта на 9B Dx, так что последующие выполнения будут обрабатываться непосредственно x87 без эмуляции.

Какой протокол используется для эмуляции с плавающей запятой x87 в MS-DOS?

1 голос
/ 05 апреля 2011

Я запускаю статистический анализ постоянно обновляемой базы данных.Моя статистическая модель записывается и переписывается каждый раз, когда выполняется код для размещения новых данных, которые становятся доступными.

1 голос
/ 04 апреля 2011

Ядро Linux имеет загружаемые модули ядра, которые делают именно это.

Emacs также обладает этой способностью, и я использую ее постоянно.

Все, что поддерживает динамическую архитектуру плагинов, по сути модифицирует код во время выполнения.

0 голосов
/ 12 октября 2014

Сценарий, в котором это можно использовать, представляет собой учебную программу. В ответ на пользовательский ввод программа изучает новый алгоритм:

  1. ищет существующую кодовую базу для похожего алгоритма
  2. если в базе кода нет аналогичного алгоритма, программа просто добавляет новый алгоритм
  3. если подобный алгоритм существует, программа (возможно, с некоторой помощью пользователя) модифицирует существующий алгоритм, чтобы иметь возможность служить как старой цели, так и новой цели

Возникает вопрос, как это сделать в Java: Каковы возможности для самостоятельной модификации кода Java?

0 голосов
/ 04 апреля 2011

Лучшей версией этого может быть Lisp Macros.В отличие от макросов C, которые являются просто препроцессором, Lisp позволяет вам всегда иметь доступ ко всему языку программирования.Это самая мощная функция в lisp, которая не существует ни на одном другом языке.

Я ни в коем случае не эксперт, но один из парней из LISP говорит об этом!Есть причина, по которой они говорят, что Лисп - самый мощный язык вокруг, а умные люди - нет, что они, вероятно, правы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...