Как заставить программу перезаписывать себя при выполнении в go - PullRequest
0 голосов
/ 12 апреля 2020

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 12 апреля 2020

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

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

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

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

0 голосов
/ 12 апреля 2020

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

...