C #: расположение константной переменной в двоичном

2

Возможно ли узнать расположение переменных const в exe? Мы думали о водяных знаках нашей программы, так что каждый пользователь, загружающий программу с нашего сервера, будет иметь уникальный ключ, встроенный в код.

Есть ли другой способ сделать это?

Теги:
security
compiler-construction
watermark

4 ответа

1
Лучший ответ

Ключевые соображения № 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 является нарушением, которое заставляет перекомпилировать все зависимые сборки.

Моя рекомендация

Я вижу два достаточно простых варианта для водяных знаков, хотя я не эксперт в этой области, поэтому не знаю, насколько они хороши в целом.

  • Водяной знак встроенного заставки или изображения логотипа "О коробке".
  • Водяной знак симметричного ключа для загрузки ваших строковых ресурсов. Храните кеш, поэтому их нужно только декодировать один раз, и это не будет проблемой производительности - это переменная, применяемая к обычно используемой методике обфускации. Строки хранятся в двоичном виде как кодированные строки UTF-8 и могут быть заменены в строке до тех пор, пока длина строки с нулевой длиной строки меньше или равна длине строки, найденной в настоящее время в двоичном формате.

Наконец, Google сообщила следующую статью статью о программном обеспечении для водяных знаков, которую вы можете посмотреть.

  • 0
    Спасибо! Я не знал об этой разнице. Однако в нашем примере я думаю, что const или readonly будет достаточно. Я серьезно приму к сведению ваш совет. +1
3

Вы можете создать двоичный файл с водяным знаком, который представляет собой строковое представление GUID в типе .net как константу. После сборки выполните поиск строки GUID в двоичном файле, чтобы проверить ее местоположение. Вы можете изменить это значение GUID на другое значение GUID, а затем запустить двоичный файл и фактически увидеть измененное значение в выводе кода.

Примечание. Форматирование важно, поскольку длина будет очень важной, так как вы возитесь со скомпилированным двоичным кодом. Например, вы хотите сохранить ведущие нули GUID, чтобы все экземпляры имели одинаковую длину char при преобразовании в строку.

Я действительно делал такие вещи с помощью DLL Win32 и даже с Sql Server 2000 Desktop exe. (Был взломан, где вы могли переключить настольную версию на полноразмерный SQL-сервер, щелкнув переключатель в двоичном формате.)

Затем этот процесс может быть автоматизирован, и новая копия DLL будет программно изменена небольшой серверной утилитой для каждой загрузки клиента.

Также взгляните на это: ссылка

В нем обсуждается использование настроек хранения в DLL.Net и используется подход на основе классов и внедряется файл настроек приложения и настраивается после компиляции.

  • 0
    Да, я думал о чем-то подобном до того, как начал. Тем не менее, я хотел бы узнать, есть ли у кого-нибудь опыт с этим и рекомендации относительно лучших практик. Спасибо за ответ.
  • 0
    Я сделал это с помощью шестнадцатеричного редактора. Делать это программно не должно быть пота. А за лучшие практики ??? Это решение и любое другое в этом духе - хакерская работа. Вы изменяете бинарный файл после компиляции! Если Microsoft не создаст пространство в заголовке файла для хранения и редактирования этой информации, никогда не будет «наилучшей практики».
1

В С++ (например):

#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), поэтому вам нужно наложить длину, если вы хотите пометить ее чем-то короче.

0

Я не уверен, что вы подразумеваете под "местоположением" значения const. Вы можете использовать элементы, подобные отражению, для доступа к полю const определенного типа. Поля Const связывают, как и любое другое поле без экземпляра с той же доступностью. Я не знаю, соответствует ли это вашему определению местоположения.

  • 0
    Приложение представляет собой набор файлов, которые мы будем хранить на сервере. Когда пользователь решил загрузить приложение, я надеялся, что мы сможем использовать PHP для изменения exe-файла windows, переписав в нем предопределенный раздел. Таким образом, мы можем пометить каждый exe-файл водяным знаком, прежде чем автоматически заархивировать его и предоставить ссылку на скачивание пользователю. Если файл когда-либо обнаружится как незаконный торрент, мы будем знать, откуда он взялся.
  • 0
    Педери, ты можешь это сделать. Проверьте мой отредактированный комментарий выше. Но мне интересно, проверяла ли кто-нибудь вашу стратегию. Я думаю, что это может быть довольно простой взлом, чтобы обнулить водяной знак, чтобы скрыть источник. Например, взять серийный номер единицы оборудования ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню