Я пытался написать программу, которая сама открывается, читает себя и ищет определенный адрес или байты для замены другим значением.
Моя цель состоит в том, чтобы создать программу, которая понимает, запускается ли она в первый раз или нет, изменяя некоторые байты при первом запуске (и мне очень не нравится создавать файл вне моей программы)
Исполняемый файл может читать себя, но когда он пытается перезаписать себя, он выдает ошибку (файл, используемый другим процессом... Как и ожидалось)
Есть ли способ перезаписать программу? Если нет, может быть, я могу изменить только часть программы, которая содержит только данные? Есть ли другое простое решение, о котором я не знаю?
(Я использую как Linux, так и Windows в качестве ОС.)
Ответ 1 · weeb
Насколько я понимаю, ваша цель - выяснить, запускалась ли программа ранее или нет. Вместо того, чтобы придерживаться идеи, которую вы представили, почему бы не создать файл, это может быть любой файл, проверьте при запуске, есть ли файл или нет. Если он есть, то он запускался раньше, иначе нет.
Ответ 2 · gekigek99
Обходной путь может быть (потому что он не перезаписывает себя, он просто создает другой файл):
- скопировать все содержимое исходного исполняемого файла
- изменить то, что мне нужно
- переименовать исходный исполняемый файл в фиксированное имя "старая версия"
- записать измененные байты в "исходное имя" (измененный исполняемый файл)
- запустить только что созданный новый исполняемый файл
- либо самостоятельно удалить исходный исполняемый файл, либо удалить его из только что созданного модифицированного исполняемого файла
Я думаю, что это выполняет свою работу, даже если не самым чистым способом (программа должна начинаться с самого начала, но я думаю, что это неизбежно)...
Если кто-то все еще знает лучший способ, вы можете написать свою идею.