Защита приложений - Переименование классов, методов...

 

Символьная обфускация

 

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

  • Преобразование имен методов, переменных и т.д. в набор бессмысленных символов
    Например: был у Вас метод класса CheckLicense(), после обфускации данный метод будет иметь имя ah(). Такие фразы усложняют взломщику задачу и увеличивают затрачиваемо на анализ время. Однако существует одна проблема - многие декомпиляторы, встречая на своем пути подобного рода имена заменяют их на более читабельные (method_1, method_2), тем самым облегчая анализ (для того чтобы этого не произошло нужно комбинировать методы защиты).
  • Преобразование имен методов, переменных и т.д. в набор цифр.
    Например, был у Вас метод - GetDefaultPassword(), а стал 0(). К тому же, в связи с тем, что символьной информации теперь в сборке будет храниться меньше, размер самой сборки, соответственно, тоже значительно сократится. Также такой метод хорош тем, что одно и то же имя будет использовано для именование класса, методов класса (например, отличающихся только типом возвращаемого значения). Это позволит также заблокировать работу некоторых дизассемблеров, таких как ildasm, например.
  • Преобразование имен методов, переменных и т.д. в набор нечитабельных символов
    Суть метода в замене имен на нечитаемые символы, например символы японского языка. Хотя .Net и работает с кодировкой UTF8, не все декомпиляторы адекватно обрабатывают ее символы. Некоторые заменяют имена с такими символами на более понятные, некоторые проставляют вместо непонятных символов их код, некоторые просто отказываются работать с данными символами.
  • Использование комбинированного метода
    Для преобразования конкретного имени случайным образом будет выбран один из вышеперечисленных видов обфускации.
  • Преобразование имен методов, переменных и т.д. в типы с нумерацией (класс1, метод1 и т.д.)
    При использовании данного вида символьной обфускации, её результат будет включать тип обфусцируемого объекта.
    Например: У Вас был метод класса TestLicense(), после обфускации данный метод будет иметь имя Method1(). Данный метод бывает полезен при отладке приложения.


Настройка параметров переименования сборок

Внешний вид вкладки Переименование (с пометками)

 

Опции:

  • Разрешить переименование - Включение режима переименования для сборок при обфускации;
  • Метод переименования - Задает метод, по которому будет, производится переименование;
     
  • Не переименовывать открытые объекты - Исключает из процесса переименования открытые (public) классы, методы и т.д. ;
    Например:
    // Исходный код
    public class Class1
    {
        public void Function1() {}
        protected void Function2() { }
        internal void Function3() { }
    }
    
    // После переименования с опцией Не переименовывать открытые объекты
    public class Class1
    {
        public void Function1() {}
        protected void a() { }
        internal void b() { }
    }
    
  • Не переименовывать Веб элементы - Исключает из процесса переименования классы относящиеся в Web контролам;
  • Путь по которому сохраняется таблица переименования (в виде XML);
  • Задать путь к файлу, по которому будет, сохраняется таблица переименования (в виде XML);
  • Очистить файл таблицы переименования (очистить XML);
  • Загрузить таблицу - Указывает, что таблицу переименования нужно брать из указанного файла (XML). Бывает необходимо при раздельной обфускации некоторых связанных сборок (например, плагинов);
  • Сохранить таблицу - Указывает, что после обфускации таблицу переименования нужно сохранить в указанный файл (XML). Это нужно для предыдущего пункта, а также для возможности восстановить исходное имя ('Расшифровка' в главном меню), например при возникновении Exception;
  • Дерево исключений - В этом дереве можно с помощью меню исключить нужные классы, методы и т.д. из процесса переименования;
  • Список выбранных исключений - В этом списке отображаются исключенные (из переименования) пользователем элементы (используя дерево исключений);
  • Исключить - Исключает из процесса переименования выделенный в дереве элемент (только себя), в результате к списку исключений добавится новая запись;
  • Исключить рекурсивно - Исключает из процесса переименования выделенный в дереве элемент (вместе со всеми дочерними элементами) , в результате в списке исключений добавится новая запись;
  • Удалить - Удаляет элемент из списка исключений;
  • Выделить в дереве - Выделяет элемент исключения в дереве;


Исключение при переименования - из исходного кода

 

Задавать исключения можно так же непосредственно в исходном коде (C#, VB и т.д.).

Для этого нужно использовать атрибут System.Reflection.Obfuscation

 

[System.Reflection.Obfuscation( Exclude = true [, ApplyToMembers = true|false [, Feature = "Public"]])]

 

Например:

 

//
// Исключить из переименования класс 'Class1' со всем вложением
//
[System.Reflection.Obfuscation(Exclude = true, ApplyToMembers = true)]
public class Class1
{
    public void Function1() { }
    protected void Function2() { }
    internal void Function3() { }
}



// // Исключить из переименования класс 'Class1' со всеми дочерними Public элементами // [System.Reflection.Obfuscation(Exclude = true, ApplyToMembers = true, Feature = "Public")] public class Class1 { public void Function1() { } protected void Function2() { } internal void Function3() { } }

// // Исключить из переименования только метод 'Function2' // public class Class1 { public void Function1() { } [System.Reflection.Obfuscation(Exclude = true)] protected void Function2() { } internal void Function3() { } }

// // Исключить из переименования только класс 'Class1' и метод 'Function2' // [System.Reflection.Obfuscation(Exclude = true)] public class Class1 { public void Function1() { } [System.Reflection.Obfuscation(Exclude = true)] protected void Function2() { } internal void Function3() { } }


Пример результата переименования с использованием метода Юникод (просмотр осуществляется с использованием утилиты .Net Reflector):

 

 

 

 
15.11.2008
 
 
 
 
10.12  .NET Reactor
15.11  n
15.11  C# ClickOnce
 
01.08  Task Context
01.08  XLSX в Mono