Самоизменяющийся бинарник (Self Modifying Binary)
Возможно ли создать самоизменяющийся бинарник на Go? К примеру, программа должна отобразить сколько раз она была запущена и время последнего запуска. Допустим:
./goprogram 1 29.06.2019 14:10 ./goprogram 2 29.06.2019 14:12 ./goprogram 3 29.06.2019 15:10 ./goprogram 4 30.06.2019 14:10
- Скомпилированный бинарный файл создаёт свою копию.
- Записывает в конец файла число.
- Замещает оригинал изменённой копией.
- При повторном запуске выводит записанное число.
Можно пример такой реализации на Go?
Отслеживать
16k 3 3 золотых знака 24 24 серебряных знака 41 41 бронзовый знак
задан 29 июн 2019 в 5:50
13 5 5 бронзовых знаков
Пишите число в отдельный файл и всё.
29 июн 2019 в 5:58
в этом вся суть, ни каких записей в системе и ни каких дополнительных файлов не должно быть.
29 июн 2019 в 6:14
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
То, чего вам хочется, небезопасно, и наверняка будет запрещено антивирусами и прочими системами безопасности. Не говоря уже о разнице в различных ОС. Тем не менее, можно сделать как-то так (обработка ошибок опущена для краткости):
type persistent struct < Magic [8]byte Content int64 >var p = persistent< Magic: [8]byte, Content: 0, > func main()
Отслеживать
ответ дан 29 июн 2019 в 8:40
16k 3 3 золотых знака 24 24 серебряных знака 41 41 бронзовый знак
Можете подсказать, как таким же образом записывать текстовые данные?
29 июн 2019 в 12:51
Текст придётся ограничить максимальной длиной и выделить ровно столько байт в структуре persistent , плюс выделить отдельно место под число символов, записанных сейчас (если вы конечно не хотите получить C-string).
29 июн 2019 в 12:54
Мне кажется, возможность реализации сильно зависит от
1) конкретной ОС и ФС
2) определения понятия “ни каких дополнительных файлов” (кстати, “никаких”, если по обычным правилам языка, надо писать слитно; упоминаю это потому, что вообще проблемная трактовка, а значит, надо и такое уточнять).
Например, если допустимо, что в момент обновления счётчика создаётся временная копия (и есть права на создание в этом каталоге), то:
- Надо ввести какую-то достаточно уникальную сигнатуру в файл. Это какая угодно константа, строковая или бинарная – по вкусу, лишь бы набор случайных байт, к которому по известному смещению будет приписан собственно счётчик. При этом на уровне программы эта сигнатура – глобальная переменная.
- На обновлении, программа создаёт рядом со своим prog – копию в виде prog.new, находит поиском эту константу и по вычисленному таким образом смещению обновляет значение счётчика.
- Чтение при выполнении – обращается к переменной, в которой эта константа, и достаёт из неё счётчик.
В общем надёжнее со строками – потому что у бинарных структур может быть выравнивание, но в них можно искать слайсами бинарной последовательности.
Если такого нет, то писать в файл запущенной сейчас программы обычно невозможно – Unix такое не позволяет (все флаворы), Windows вроде тоже. Но можно сделать запись в дополнительные атрибуты файла (проверить, получится ли в конкретном случае). В Linux есть подсистема xattr и изменение этих атрибутов не блокируется фактом работы программы.
В любом случае учтите, что это может быть заблокировано множеством методов и условий – FS только для чтения, каталог только для чтения, демон слежения за состоянием FS, и т.п.
Файл формата BIN — что это?
Файл BIN (с англ. Generic Binary Executable File) отвечает за хранение двоичных данных. В отличие от текстовых файлов, данный формат файла не так просто отредактировать. Расширение файла BIN формируется при помощи различных специальных программ, открыть или изменить его возможно с применением тех утилит, посредством которых расширение BIN создавалось.
В основном, вручную файлы с расширением .bin не поддаются корректному редактированию. При ознакомлении с тем, что такое формат BIN, следует понимать, что в подобном файле хранятся служебные данные, к примеру файлы прошивки операционной системы компьютера или мобильного устройства. Нередко формат BIN используется в целях обновления тех или иных программных комплексов, открытие файла, в котором присутствует .bin расширение, может выполняться в случаях их вызова установочными пакетами.
Достаточно часто, пользователи сталкиваются с наличием файла .bin в процессе установки компьютерных игр, а также приложений. В более редких случаях, устанавливаемая программа потребует открыть файл BIN. Итак, что такое файл BIN и как же открыть файл с двоичными данными? Зачастую, подобный тип файла предназначен для синхронной работы с системными комплексами, он хранит данные, необходимые для программного обеспечения пользовательского компьютера. Кроме того, .bin файл может помещаться в файлы игр, а также в файлы данных утилит и программ.
Прежде чем открыть файл .bin, рекомендуется предварительное создание его резервной копии, ведь двоичный файл может хранить важную информацию, которую возможно легко повредить. Программы на подобии DAEMON Tools Lite помогут корректно открыть BIN и выяснить что же содержит данное расширение файла.
Программы для работы с BIN в Windows
Microsoft Windows
Apache OpenOffice
Mac
Apple OS X
Apache OpenOffice
Linux
Apache OpenOffice
Решение проблем с файлами BIN
Наиболее распространенная проблема – файл не открывается. Мы подготовили набор программ, с помощью которых вы гарантированно сможете открыть нужный файл в вашей операционной системе.
Видео форматы
Аудио форматы
Электронные книги
Текстовые форматы
Дисковые образы
Табличные данные
Растровые изображения
Векторные изображения
Резервное копирование
Raw
Сжатые файлы
Файлы данных
Базы
3D Изображения
CAD файлы
Файлы разработчиков
Зашифрованные файлы
Исполняемые форматы
Шрифты
Файлы игр
GIS, карты
Другие расширения
Форматы макетов
Форматы плагинов
Файлы настроек
Системные файлы
Веб форматы
При подготовке материала использовались источники:
https://ru.stackoverflow.com/questions/997587/%D0%A1%D0%B0%D0%BC%D0%BE%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D1%8F%D1%8E%D1%89%D0%B8%D0%B9%D1%81%D1%8F-%D0%B1%D0%B8%D0%BD%D0%B0%D1%80%D0%BD%D0%B8%D0%BA-self-modifying-binary
https://filesreview.com/ru/info/bin