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
sn –tp 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”, а в теле письма описать возникшую проблему. И если есть возможность прислать также сборку, в которой возникла проблема (из самой сборки можно убрать весь закрытый функционал).
- Как настроить обфускацию плагинов (либо открытых библитоек)
При написании плагинов, нужно применять следующие методы:
- Переименование включать можно, но при этом нужно включить опцию "Не переименовывать открытые объекты"
- Включить обфускацию условных переходов
- Включить шифрование строк
- Включить защиту от декомпиляторов
- Все классы, методы и свойства которые не используются снаружи (из других сборок) должны быть НЕ public - можно к примеру internal, private. Это делается для того чтобы при переименовании они не исключились.
- Для классов, которые используются из других сборок желательно написать теневой класс,
//
// например было:
//
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