Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Как заставить программу перезаписывать себя во время выполнения в go

Автор вопроса: gekigek99Ответов: 2

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

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

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

Есть ли способ перезаписать программу? Если нет, может быть, я могу изменить только часть программы, которая содержит только данные? Есть ли другое простое решение, о котором я не знаю?

(Я использую как Linux, так и Windows в качестве ОС.)

  • Есть ли другое простое решение, о котором я не знаю? Простое решение состоит в том, чтобы написать сигнальный файл где-нибудь в $HOME (используйте $XDG_CONFIG_HOME, если он установлен), что вам не очень нравится. Кроме того, сомнительно, есть ли у исполняющего пользователя разрешение на перезапись двоичного файла. При этом, как вы пытаетесь перезаписать программу? os.Rename должен работать как минимум в Linux. Peter 12.04.2020

gooverwriteself

Ответы

Ответ 1 · weeb

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

Ответ 2 · gekigek99

Обходной путь может быть (потому что он не перезаписывает себя, он просто создает другой файл):

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

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

Если кто-то все еще знает лучший способ, вы можете написать свою идею.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы