Сериализация и обфускация в .NET.

У меня есть двоичный файл, который я хочу обфускать и раздавать пользователям. Предположим, что я использую unobfuscated версию моего двоичного файла для сериализации данных, используя бинарный форматировщик .NET. Можем ли мы затем обработать данные с обфускацией двоичных данных?

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

Ответ 1

Кажется, существует путаница между запутанными двоичными и сериализованными данными. Если вы сериализуете свой класс с использованием сериализаторов по умолчанию, тогда значения имени класса и свойства/поля используются в виде строк в этих сериализованных данных, поэтому, если вы запутываете свой двоичный файл, тогда сериализованные данные с использованием этого двоичного файла будут иметь обфускации, obfuscated binary не сможет прочитать сериализованные данные, созданные вашим обфускационным двоичным кодом, если вы выполните одно из следующих действий:

  • Использовать переименование классов в вашем сериализованном классе
  • Использовать переименование членов в вашем сериализованном классе

Вот несколько вариантов для этого:

  • Я не использовал это некоторое время (так что вы хотите проверить, работает ли оно в вашей ситуации), но если вы используете двоичный форматтер, то вы можете контролировать, как данные хранятся в сериализованном файле предоставляя конструкторы, которые обрабатывают SerializationInfo и StreamingContext. Если вы используете Google для образца, вы должны найти его (вот один, который я нашел: Сериализировать объекты в файл). Вы не можете найти много новых статей при использовании этого метода, так как большинство людей не считают это очень интересным, однако на самом деле это самый простой способ указать, как ваш класс сохраняет себя и репопулирует себя с помощью бинарного форматирования.

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

  • Еще одна опция: исключить класс, который вы сериализуете из обфускации, и просто зашифровать файл данных.

Ответ 2

Неправильный вопрос. Когда двоичный объект запутан, вам нужно быть осторожным, когда имена классов/пространства имен будут изменены и т.д. Это нарушит не только между запутанными/не запутанными двоичными файлами, но также и между разными версиями.

Этот продукт, по-видимому, исключает классы, отмеченные как: http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm (Это не рекомендация, которую я никогда не использовал - у вас будет проверить его и посмотреть, стоит ли это стоить).

Кроме того, вы можете написать собственный сериализатор в зависимости от того, сколько данных вы сериализуете.


[Исходный ответ]

Почему вы запутываете данные? Я могу только представить это, чтобы кто-то не редактировал его или не позволял кому-то читать содержимое.

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

Если это не позволяет кому-то прочитать его, я предлагаю вам зашифровать данные вместо того, чтобы сериализоваться.

Есть много примеров того и другого, но если вам нужен пример, дайте мне знать.

Ответ 3

Вы пытались использовать EazFuscator? Это позволяет использовать некоторые пользовательские схемы переименования, позволяющие вам сохранять точные имена в определенных случаях, например, внешние методы. Он не обновляется с новейшими версиями .NET 4.0+ или WCF, хотя.

Вы также можете использовать .NET Reactor, еще одну службу обфускатора, которая выходит далеко за пределы возможностей EazFuscator и Dotfuscator, но у нее есть стоимость.

.NET Reactor также позволяет шифрование кода вместо обфускации, которое, как было предложено ранее, решит проблему.