Вопрос-ответ

FAQ

- Каким функционалом продукта можно пользоваться бесплатно без каких-либо ограничений

Бесплатный функционал включает в себя:

  • Переименование: символы, цифры, типы;
  • Удаление метаданных свойств и событий;
  • Переименование параметров метода;
  • Очистка не используемого кода (классы, методы, поля);
  • Полная интеграция с MS Visual Studio 2003/2005;
  • Генерация проекта обфускации на основе существующего проекта С#, VB.NET, J#;

(т.е. бесплатно все то, что позволяет Dotfuscator + Очистка кода, полная поддержка MS VS, шаблоны обфускации, техническая поддержка)

 

- Если пользоваться платным функционалом (для незарегистрированной версии), то какие ограничения вставляются в сборку?

Если применяются ограничения, то при компиляции проекта появляется строка:

> Вставка ограничения демо-версии (для незарегистрированной версии)

В сборку вставляется ограничение по времени работы в течении одного дня, если это exe сборка то вставляется еще и сообщение.

 

- В каких случаях при выполнении кода из обфусцированных сборок могут возникать ошибки?

1. При использовании технологии .Net Reflection (создание объектов по строковому имени, обращение и поиск полей или методов класса по строковому имени)

Пример:

object obj=System.Reflection.Assembly.GetExecutingAssembly().CreateInstance("Class1");

Для корректной работы данного участка кода необходимо добавить имя создаваемого класса в список исключений имен (Обфускация->Переименование);

2. Возникновение Exception в конструкторе создаваемого объекта (например, из-за атрибутов не учитывающих тот факт, что класс может быть в последствии переименован);

3. При использовании стандартного механизма сериализации (в случае шифрования сборок);

В этом случае нужно, либо использовать другой способ сериализации, или не шифровать сбоку, в котором находится определение типа сериализуемого объекта;

 

- В каких случаях при обфускации проекта на ASP .NET могут возникнуть ошибки?

В случае если в настройках переименования не включена опция “Не переименовывать Веб элементы” (Обфускация->Переименование);

 

- Какие дополнительные меры помимо обфускации можно предпринять для защиты проекта

 

1. В первую очередь подписывать сборки (Strong name)

Сделать это можно следующим образом:

Генерируем ключ: sn.exe –k MyKey.snk
В
VS проекте в файле AssemblyInfo.cs (AssemblyInfo.vb) прописываем

[assembly: AssemblyDelaySign(false)]

[assembly: AssemblyKeyFile(@"..\..\MyKey.snk")]

[assembly: AssemblyKeyName("")]

А также в проекте обфускации для сборок указываем созданный ключ.

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

[System.Security.Permissions.StrongNameIdentityPermission(

System.Security.Permissions.SecurityAction.LinkDemand,

PublicKey="PublucKeyHex")]

class TestClass

{

//…

}

где PublucKeyHex значение открытого ключа из файла PublicKeyHex.txt

sn –p MyKey.snk MyOpenKey.snk
sntp MyOpenKey.snk >PublicKeyHex.txt

3. Добавляем новый атрибут для сборки (в файле AssemblyInfo.cs или AssemblyInfo.vb), требующий обязательного наличия подписи с использованием конкретной ключевой пары.

[assembly: System.Security.Permissions.StrongNameIdentityPermission(

System.Security.Permissions.SecurityAction.RequestMinimum,

PublicKey="PublucKeyHex")]

где PublucKeyHex значение открытого ключа из файла PublicKeyHex.txt

4. Добавляем в код сборки (в методах), проверку на наличие и правильность подписи. Для этого обращаемся к значению токена открытого ключа и сравниваем его с эталонным значением (или в качестве значений начальной инициализации):

private static bool IsValidSign()

{

// Токена отклытого ключа, нашей кючевой пары

byte[] my_public_key={ PublucKeyToken };

// Значение токена отклытого ключа,

// с использованием которой подписана сборка

byte[] public_key =

System.Reflection.Assembly.GetCallingAssembly()

.GetName().GetPublicKeyToken(true);

// Если сборка не подписана, то это попытка модификации кода

if(public_key==null

|| public_key.Length!=my_public_key.Length)

return false;

for(int i=0; i<my_public_key.Length; i++)

{

// Если токены не совподают,

// то это попытка модификации кода

if(public_key[i]!=my_public_key[i])

return false;

}

// Подпись верна

return true;

}

где PublucKeyToken значение токена открытого ключа из файла PublicKeyHex.txt

5. Аналогичным способом (предыдущий пункт) повсеместно используем значение токена открытого ключа для начальной инициализации переменных.

 

- Как убедиться, что проект действительно защищен

Можно попытаться дизассемблировать сборку и посмотреть результат:

ildasm.exe /OUT="Assembly.il" /TEXT /RAWEH /QUOTEALLNAMES /UTF8 "Assembly.exe"

Также можно воспользоваться Reflector.exe.

 

- Что делать если обфусцированный проект не работает, а в данном документе вы не нашли способа решить проблему

В этом случае можно попробовать по очереди отключать опции обфускации, до того момента пока сборка не заработает. После чего написать письмо в техническую поддержку Support@inquartos.ru, с темой “Support for Inquartos ® Obfuscator”, а в теле письма описать возникшую проблему. И если есть возможность прислать также сборку, в которой возникла проблема (из самой сборки можно убрать весь закрытый функционал).

 

- Как настроить обфускацию плагинов (либо открытых библитоек)

При написании плагинов, нужно применять следующие методы:

  1. Переименование включать можно, но при этом нужно включить опцию "Не переименовывать открытые объекты"
  2. Включить обфускацию условных переходов
  3. Включить шифрование строк
  4. Включить защиту от декомпиляторов
  5. Все классы, методы и свойства которые не используются снаружи (из других сборок) должны быть НЕ public - можно к примеру internal, private. Это делается для того чтобы при переименовании они не исключились.
  6. Для классов, которые используются из других сборок желательно написать теневой класс,
    //
    // например было: 
    //
    public class MyPlugin :  IPlugin 
    { 
       // IPlugin.Fun 
       public string Fun() 
       { return “result”; } 
    }

// // Лучше сделать его так: // public class MyPlugin : IPlugin { private MyPluginShadow d = new MyPluginShadow(); // IPlugin.Fun public string Fun() { return d.Fun(); } } internal class MyPluginShadow { // IPlugin.Fun public string Fun() { return "result"; } }
// // или так // public class MyPlugin : IPlugin { // IPlugin.Fun public string Fun() { string s = "11"; if (s == "22") return Fun2_Shadow(); if (s == "11") return Fun_Shadow(); return ""; } private string Fun_Shadow() { return “result”; } private string Fun2_Shadow() { return ""; } }

 

E-mail: support@netobf.com

Web: http://netobf.com

 


 

 

 
15.11.2008
 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
11.10  GAC и ngen
10.10  SqlTypes