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

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

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

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

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

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


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


Ответы (2)


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

person weeb    schedule 12.04.2020
comment
Да, это то, чего я пытаюсь избежать, потому что я не хочу, чтобы конечный пользователь каким-либо образом нашел файл и удалил его. - person gekigek99; 12.04.2020
comment
Пользователь также может удалить скомпилированную программу, если он хочет. В чем разница между изменением самого двоичного файла и изменением внешнего файла? Кроме того, если проблема заключается в поиске файла, вы можете затруднить его обнаружение пользователем. Как в Linux, так и в Windows вы можете создать его как скрытый файл. Кроме того, в Windows вы можете изменить запись реестра, что определенно затруднит ее обнаружение пользователем. - person Amit Davidson; 17.04.2020

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

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

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

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

person gekigek99    schedule 12.04.2020