Nightmare1
@Nightmare1
Программист

Возможно ли изменить исполняемый файл в процессе выполнения*?

В общем суть вопроса в заголовке вопроса. Возможно ли в процессе выполнения исполняемого файла изменить его содержимое на жестком диске?
  • Вопрос задан
  • 296 просмотров
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Unix-way: в исполняемом файле - только исполняемый код, он при запуске читается в память, после этого файл свободен и с ним можно делать все, что позволяет твой доступ.
Windows-way: в исполняемом файле может быть навалено три короба ресурсов, вплоть до вырожденных случаев вроде самораспаковывающегося архива, когда код - это просто небольшая вставка в гигантский исполняемый файлище. Так что в память читается только код, но при этом предполагается, что он может подтягивать из файла ресурсы, когда они понадобятся. Поэтому файл блокируется на запись до тех пор, пока этот код не закончит выполнение.
Ответ написан
old2ev
@old2ev
int main(){for(;;)fork();}
Из того что приходит на ум только костыль аля открыть ofstream переписать им файл, натравить на него через system компилятор и за тем перезапустить программу через exec из скомпилированного файла. Да это можно было бы сделать, но это бред. Менять C/C++ код в рантайме всё равно что юзать микроскоп для забивания гвоздей. Проще было бы подключить V8 и в рантайме менять JavaScript он так из коробки умеет вродебы.

Вообще, хотелось бы уточнить зачем вам это нужно? Ибо я даже придумать не могу причину для данных махинаций с кодом. Всплывала в голове подобная бредятина, когда выдумывал систему модулей для C++, но вопрос решился через подгрузку динамических библиотек во время выполнения, так если что C и C++ умеют.

Так же есть вариант для совсем уж отбитых: писать в исполняемый файл через ofstream машинный код(предварительно скопировав сам исполняемый на системах семейства Windows) и перезапускаться exec'ом, но тут более чем дофига причин так не делать - как минимум будет больно и страшно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы