Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив1 / docx31 / Отчёт №2.docx
Скачиваний:
25
Добавлен:
01.08.2013
Размер:
626.76 Кб
Скачать

Подробный обзор DeployLx 5.X Suite обфускатора :

Для обфускации была выбрана поиска подстроки в строке:

static void Main(string[] args)

{

Do:

Console.WriteLine("Введите строку");

string stroka = Console.ReadLine();

Console.WriteLine("Введите подстроку");

string podstroka = Console.ReadLine();

if (stroka.Length < podstroka.Length)

Console.WriteLine("строка не может быть меньше подстроки");

else

{

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

{

for (int j = 0; j < podstroka.Length; j++)

{

if (stroka[i] == podstroka[j])

Console.WriteLine("Строка {0} содержит подстроку {1}", stroka, podstroka);

else

Console.WriteLine("Строка {0} не содержит подстроку {1}", stroka, podstroka);

goto Do;

}

}

}

Так как все хорошие обфускаторы(за некоторым исключением) работают с исполняемым кодом, и обфусцируют его, требовалось найти дизассемблеры для просмотра изменений в коде. Скачено два обфускатора: WinDbg и .NET Reflector. Первый – дизассемблер, входящий в состав windows SDK. Соответственно, рекомендован windows. Второй разработан компанией Red State, используется в 90% случаях когда нужно дизассемблировать код на C/C++/C#. Чрезвычайно удобен, красив и быстр. Имеет встроенный плагин в Visual Studiо. Внешний вид Reflector:

Для детального просмотра первым был выбран обфускатор DeployLX 5.x Suite от компании CodeVeil . Даже триал версия оказалась на редкость настраиваемой. К примеру, можно задавать различные параметры переименования, управлять возможность дизассемблирования программы, изменять граф потока управления и даже включать элементы криптографии в проект(последние два пункта лишь в платной версии) .

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

Итак, параметры степени обфускации можно настраивать при включенном переименовании, программа почти не изменяется, и все так же понятна:

private static void u(string[] ​)

{

Label_0001:

Console.

WriteLine("Введите строку");

string str = Console.ReadLine();

Console.

WriteLine("Введите подстроку");

string str2 = Console.ReadLine();

if (str.Length < str2.

Length)

{

Console.WriteLine("строка не может быть меньше подстроки");

}

else

{

for (

int i = 0; i < str.Length; i++)

{

int num2 = 0;

while (num2 < str2.Length)

{

if (str[i] == str2[num2])

{

Console.

WriteLine("Строка {0} содержит подстроку {1}", str, str2);

}

else

{

Console.

WriteLine("Строка {0} не содержит подстроку {1}", str, str2);

}

goto Label_0001;

}

}

}

Затем, включим замену операторов. На самом деле, они хранятся в отдельных вложениях, но проследить какой куда подставляется не получилось ни Reflector-ом, ни WinDbg. Код уже не понятен, но по строковым литералам еще можно догадаться, что он делает.

private static void ##Main##_W(string[] ​)

{

Label_0001:

.​​​​​​​​​​​​​​​​​​​​​​​.("Введите строку");

string str = .​​​​​​​​​​​​​​​​​​​​​​​​.();

.​​​​​​​​​​​​​​​​​​​​​​​.("Введите подстроку");

string str2 = .​​​​​​​​​​​​​​​​​​​​​​​​.();

if (.​​​​​​​​​​​​​​​​​​.(str) < .​​​​​​​​​​​​​​​​​​.(str2))

{

.​​​​​​​​​​​​​​​​​​​​​​​.("строка не может быть меньше подстроки");

}

else

{

for (

int i = 0; i < .​​​​​​​​​​​​​​​​​​.(str); i++)

{

int num2 = 0;

while (num2 < .​​​​​​​​​​​​​​​​​​.(str2))

{

if (.​​​​​​​​​​​​​​​​​​​​​​​​​.(str, i) == .​​​​​​​​​​​​​​​​​​​​​​​​​.(str2, num2))

{

.​​​​​​​​​​​​​​​​​​​​​​​​​​.("Строка {0} содержит подстроку {1}", str, str2);

}

else

{

.​​​​​​​​​​​​​​​​​​​​​​​​​​.("Строка {0} не содержит подстроку {1}", str, str2);

}

goto Label_0001;

}

}

}

}

Когда же включаются замена сроковых литералов, программа превращается в абсолютно непонятный код:

private static void ##Main##_](string[] ​)

{

Label_0001:

​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(​.​​​​​​​​​​​​​​​​​​​.​(0x1c));

string str = ​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​();

​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(​.​​​​​​​​​​​​​​​​​​​.​(0x1d));

string str2 = ​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​();

if (​.​​​​​​​​​​​​​​​​​​​​​​.​(str) < ​.​​​​​​​​​​​​​​​​​​​​​​.​(str2))

{

​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(​.​​​​​​​​​​​​​​​​​​​.​(30));

}

else

{

for (

int i = 0; i < ​.​​​​​​​​​​​​​​​​​​​​​​.​(str); i++)

{

int num2 = 0;

while (num2 < ​.​​​​​​​​​​​​​​​​​​​​​​.​(str2))

{

if (​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(str, i) == ​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(str2, num2))

{

​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(​.​​​​​​​​​​​​​​​​​​​.​(0x1f), str, str2);

}

else

{

​.​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​.​(​.​​​​​​​​​​​​​​​​​​​.​(0x20), str, str2);

}

goto Label_0001;

}

}

}

}

Для сравнения, в Visual Studio есть встроенный обфускатор – Dotfuscator. Я скачал триал с их сайта, однако он позволяет не больше, нежели встроенный в студию. Конкретнее – без покупки полной версии программы, доступно лишь простое переименование, причем далеко не лучшее:

private static void a(string[] A_0)

{

Label_0000:

Console.WriteLine("Введите строку");

string str = Console.ReadLine();

Console.WriteLine("Введите подстроку");

string str2 = Console.ReadLine();

if (str.Length < str2.Length)

{

Console.WriteLine("строка не может быть меньше подстроки");

}

else

{

for (

int i = 0; i < str.Length; i++)

{

int num2 = 0;

while (num2 < str2.Length)

{

if (str[i] == str2[num2])

{

Console.WriteLine("Строка {0} содержит подстроку {1}", str, str2);

}

else

{

Console.WriteLine("Строка {0} не содержит подстроку {1}", str, str2);

}

goto Label_0000;

}

}

}

}

Соседние файлы в папке docx31