Может ли программа на C изменить его исполняемый файл?

Причина неявного преобразования (T& -> reference_wrapper) допускается для std::reference_wrapper, , но не boost::reference_wrapper, достаточно объяснена в DR-689 ссылка предоставлена ​​Нейтом Колем. Подводя итог:

В 2007 году Рабочая группа библиотек C ++ 0x / C ++ 11 (LWG) предложила изменить № DR-689 на раздел 20.8.3.1 [refwrap.const] стандарта:

Конструктор reference_wrapper в настоящее время является явным . Основным мотивом для этого является проблема безопасности в отношении значений r, которая решается в предлагаемом решении [DR-688]. Поэтому нам следует рассмотреть возможность ослабления требований к конструктору, поскольку запросы на неявное преобразование продолжают обновляться.

Предлагаемое решение: Удалить явное из конструктора reference_wrapper.

Стоит отметить:

  • boost::reference_wrapper не были расслаблены таким образом, и при этом кажется, предложение для этого, что создает несоответствие между семантикой boost::reference_wrapper и std::reference_wrapper.

  • Основываясь на словоблудии в DR-689 (в частности, в части «запросы продолжают всплывать»), представляется вероятным, что это изменение просто рассматривалось LWG как приемлемый компромисс между безопасностью и удобством (в отличие от его повышения). аналог).

  • Неясно, предвидела ли LWG другие потенциальные риски (такие, как продемонстрированные в примерах, приведенных на этой странице), поскольку единственный риск, упомянутый в DR-689, был связан с привязкой к значению (как описано и решено). в предыдущей записи DR-688).

22
задан Joel 10 October 2010 в 03:07
поделиться

2 ответа

Если вы используете Windows, вы можете сделать следующее:

Пошаговый пример:

  1. Вызвать VirtualProtect() на кодовых страницах, которые вы хотите изменить, с защитой PAGE_WRITECOPY.
  2. Изменить кодовые страницы.
  3. Звоните VirtualProtect() на модифицированных кодовых страницах с защитой PAGE_EXECUTE.
  4. Позвоните FlushInstructionCache().

Для получения дополнительной информации см. Как изменить исполняемый код в памяти (В архиве: август 2010 г.)

6
ответ дан 29 November 2019 в 04:15
поделиться

Если вы работаете в Windows, я считаю, что он блокирует файл, чтобы предотвратить его изменение во время работы. Вот почему вам часто нужно выйти из программы, чтобы установить обновление. То же самое не верно в системе Linux.

0
ответ дан 29 November 2019 в 04:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: