Возможно ли узнать расположение переменных const в exe? Мы думали о водяных знаках нашей программы, так что каждый пользователь, загружающий программу с нашего сервера, будет иметь уникальный ключ, встроенный в код.
Есть ли другой способ сделать это?
Ключевые соображения № 1: Подписание сборки
Поскольку вы распространяете свое приложение, ясно, что вы его подписываете. Таким образом, поскольку вы изменяете двоичное содержимое, вам нужно будет интегрировать процесс подписи непосредственно в процессе загрузки.
Ключевые соображения # 2: const
или readonly
Существует ключевое различие между переменными const
и readonly
, о которых многие люди не знают. В частности, если я делаю следующее:
private readonly int SomeValue = 3;
...
if (SomeValue > 0)
...
Затем он скомпилирует код байта следующим образом:
ldsfld [SomeValue]
ldc.i4.0
ble.s
Если вы сделаете следующее:
private const int SomeValue = 3;
...
if (SomeValue > 0)
...
Затем он скомпилирует код байта следующим образом:
{contents of if block here}
const
переменные [разрешены] заменены и оценены компилятором, а не во время выполнения, где переменные readonly
всегда оцениваются во время выполнения. Это делает разницу большой, когда вы публикуете поля для других сборок, поскольку изменение переменной const
является нарушением, которое заставляет перекомпилировать все зависимые сборки.
Моя рекомендация
Я вижу два достаточно простых варианта для водяных знаков, хотя я не эксперт в этой области, поэтому не знаю, насколько они хороши в целом.
Наконец, Google сообщила следующую статью статью о программном обеспечении для водяных знаков, которую вы можете посмотреть.
Вы можете создать двоичный файл с водяным знаком, который представляет собой строковое представление GUID в типе .net как константу. После сборки выполните поиск строки GUID в двоичном файле, чтобы проверить ее местоположение. Вы можете изменить это значение GUID на другое значение GUID, а затем запустить двоичный файл и фактически увидеть измененное значение в выводе кода.
Примечание. Форматирование важно, поскольку длина будет очень важной, так как вы возитесь со скомпилированным двоичным кодом. Например, вы хотите сохранить ведущие нули GUID, чтобы все экземпляры имели одинаковую длину char при преобразовании в строку.
Я действительно делал такие вещи с помощью DLL Win32 и даже с Sql Server 2000 Desktop exe. (Был взломан, где вы могли переключить настольную версию на полноразмерный SQL-сервер, щелкнув переключатель в двоичном формате.)
Затем этот процесс может быть автоматизирован, и новая копия DLL будет программно изменена небольшой серверной утилитой для каждой загрузки клиента.
Также взгляните на это: ссылка
В нем обсуждается использование настроек хранения в DLL.Net и используется подход на основе классов и внедряется файл настроек приложения и настраивается после компиляции.
В С++ (например):
#define GUID_TO_REPLACE "CC7839EB7EC047B290D686C65F98E0F4"
printf(GUID_TO_REPLACE);
в PHP:
<?php
exec("sed -e 's/CC7839EB7EC047B290D686C65F98E0F4/replacedreplacedreplacedreplaced/g' TestApp.exe > TestAppTagged.exe");
?>
Если вы наклеиваете свой скомпилированный двоичный файл на сервер, зайдите на php script, загрузите tagged exe и запустите его... вы увидите, что теперь он печатает "замененную" строку, а не GUID:)
Обратите внимание, что длина замененной строки должна быть идентична оригиналу (в данном случае 32), поэтому вам нужно наложить длину, если вы хотите пометить ее чем-то короче.
Я не уверен, что вы подразумеваете под "местоположением" значения const. Вы можете использовать элементы, подобные отражению, для доступа к полю const определенного типа. Поля Const связывают, как и любое другое поле без экземпляра с той же доступностью. Я не знаю, соответствует ли это вашему определению местоположения.