Хранение информации в файле без ее повреждения и способом, который трудно обнаружить, является упражнением в стеганографии , и довольно трудным. Этот теоретический инструмент должен уметь анализировать исполняемую структуру и корректно ее изменять, редактировать смещения, если это необходимо, или обнаруживать арии заполнения, или в основном выполнять часть работы, выполняемой компилятором. Я сомневаюсь, что это существует или надежно.
Однако существует довольно много инструментов стеганографии, которые могут хранить информацию в изображениях, слегка изменяя цвета пикселей, возможно, вы можете сохранить свою информацию в значке exe-файла или в любом включенном ресурсе.
Другой способ - скрыть данные во время компиляции, на уровне оптимизации некритических для производительности частей исполняемого файла, так что компилятор генерирует немного другой код, но поведение гарантированно останется согласованным. Теперь вы можете использовать файловые хеши в качестве отпечатка пальца.
Еще один способ - просто создать неиспользуемую строку внутри некоторой случайной функции, пометить ее как volatile
или аналог на выбранном вами языке, чтобы компилятор не оптимизировал ее из вашей программы, и добавить в нее что-то заметное, например REPLACE_ME
. Теперь вы можете открыть этот файл, найти эту строку и заменить ее на сгенерированный вами идентификатор. Если идентификатор и строка имеют одинаковую длину - вы не сможете повредить программное обеспечение.
Другой, более тонкий способ - создать несколько разных перефразировок одних и тех же сообщений в вашем приложении и менять их местами, чтобы различать версии. Если ваш язык программирования хранит строки с нулевым символом в конце, то это очень просто, просто сделайте ваши строки в коде так долго, как долго будет перефразировать. Если ваш язык хранит длину строки, вам также придется динамически пересчитывать ее.
В качестве альтернативы, если вы работаете со строками Unicode в своем коде, то вы можете использовать похожие глифы в некоторых строках в качестве версии предыдущей идеи с меньшими усилиями. По сути, вы выполняете гомографическую атаку на ваших струнах. В качестве альтернативы вы можете использовать управляющие символы Юникода (ZWJ, ZWNJ и т. Д.), Которые не влияют на большинство языков и являются невидимыми.
Все схемы легко обнаруживаются путем различий в двух разных дистрибутивах программного обеспечения, причем тот, у которого разные уровни оптимизации, можно было бы списать со счетов как просто разные сборки программного обеспечения, но настойчивый злоумышленник все же может это выяснить.