У меня есть набор файлов (скомпилированное программное обеспечение), которые я хочу дать уникальному отпечатку пальца перед дистрибутивом. Идея состоит в том, чтобы написать сценарий, который:
Требования к процессу отпечатков пальцев заключаются в следующем:
Существуют ли какие-либо решения с открытым исходным кодом, которые создаются с целью отпечатки пальцев?
Хранение информации в файле без ее развращения и способом, который нелегко обнаружить, - это упражнение в стеганографии и довольно сложное. Этот теоретический инструмент должен иметь возможность анализировать исполняемую структуру и правильно ее модифицировать, при необходимости изменять смещения или обнаруживать адионы заполнения или в основном выполнять часть работы, выполняемой компилятором. Я сомневаюсь, что он существует или является надежным.
Тем не менее, существует немало инструментов стеганографии, которые могут хранить информацию на фотографиях, тонко изменяя цвета пикселей, возможно, вы можете хранить свою информацию в значке EXE файла или любого включенного ресурса.
Другой способ заключается в том, чтобы скрыть данные во время компиляции, на уровне оптимизации производительности - некритические части исполняемого файла, так что компилятор генерирует немного другой код, но поведение гарантировано останется неизменным. Теперь вы можете использовать хэши файлов в качестве отпечатка пальца.
Еще один способ - просто создать неиспользуемую строку внутри какой-либо случайной функции, пометить ее как volatile
или аналоговую на выбранном вами языке, чтобы не дать компилятору оптимизировать ее из вашей программы и добавить в нее что-то заметное, например REPLACE_ME
. Теперь вы можете открыть этот файл, найти эту строку и заменить ее на генерируемый вами идентификатор. Если идентификатор и строка были одинаковой длины - вы не можете повредить свое программное обеспечение.
Другой, более тонкий способ - создать несколько разных перефразиров одних и тех же сообщений в вашем приложении и поменять их и вытеснить как способ дифференцировать версии. Если ваш язык программирования хранит строки с нулевым завершением, то это очень просто, просто сделайте свои строки в коде до тех пор, пока вы не будете долго перефразировать. Если ваш язык хранит длину строки, вам также необходимо динамически пересчитать ее.
В качестве альтернативы, если вы работаете со строками Unicode в своем коде, то вы можете использовать похожие глифы в некоторых строках как менее эффективную версию предыдущей идеи. В основном вы выполняете атаку гомографа на ваши строки. В качестве альтернативы вы можете использовать символы управления Unicode (ZWJ, ZWNJ и т.д.), Которые не влияют на большинство языков и являются невидимыми.
Все схемы легко обнаруживаются путем различения двух разных распределений программного обеспечения: один с разными уровнями оптимизации может быть правдоподобно списан как просто разные сборки программного обеспечения, но постоянный злоумышленник все еще может понять это.
Поскольку вы говорите о скомпилированном программном обеспечении, возможно, альтернативным решением может быть использование execbinary encrypting tool. Когда вы запустите файл, он попросит пароль, если он будет прав, тогда он будет использовать пароль для генерации ключа. Затем он использует этот ключ для дешифрования программы непосредственно в памяти. Таким образом, они не смогут анализировать двоичный файл и даже с помощью ключа было бы намного сложнее сделать это, а тем более изменить его. Вы можете поместить в код столько отпечатков пальцев, сколько хотите, обычные текстовые строки, и они, скорее всего, останутся там.