Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Здравствуйте! Экспериментирую с различными обфускаторами, чтобы защитить свой код от повторного использования. Основная задача - сделать анализ с целью повторного использования настолько трудоемким, чтобы дешевле было написать свой код, а не использовать мой. Уточню - не преследую цель сделать анализ НЕвозможным,- просто, максимально усложнить! Пока остановился на SmartAssembly (версии 6). Деобфусцировал с помощью de4dot. Результат оценивал в Reflector. В связи с этим есть ряд вопросов. В вопросах подразумевается, что анализируемый exe или dll был ранее обфусцирован SmartAssembly.
Вопросы: 1. Можно ли с помощью какого либо метода (деобфускация, создание дампа процесса, отладка или что либо другое) без значительных трудозатрат восстановить исходный код (можно без имен переменных) internal и private функций с условием, что они не вызываются из public функций? Если можно, то как? 2. Аналогичный вопрос по поводу исходных имен параметров функций и локальных переменных, используемых в internal и private функциях. 3. Какой обфускатор посоветуете использовать вместо SmartAssembly (только чтобы лицензия была не дороже 150-200$)?
Несколько наблюдений (исходя из моих экспериментов): 1. De4dot не восстанавливает имена локальных переменных после SmartAssembly (только переименовывает исходя из их типов [Ссылки могут видеть только зарегистрированные пользователи. ] для облегчения анализа). А вот структуру кода нормально восстанавливает. Еще восстанавливает имена параметров публичных функций. 2. internal и private функций я не нашел [Ссылки могут видеть только зарегистрированные пользователи. ] в восстановленном с помощью De4dot файле. Причем, их код не находится даже если вызываешь прямо из него (из кода internal или private функции) public функцию [Ссылки могут видеть только зарегистрированные пользователи. ] (в то время как ее вызов из публик функции виден [Ссылки могут видеть только зарегистрированные пользователи. ] и [Ссылки могут видеть только зарегистрированные пользователи. ]) 3. Однако если приватная функция вызывается публичной, то ее можно обнаружить [Ссылки могут видеть только зарегистрированные пользователи. ] и распознать структуру .
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
я использую Appfuscator, регаем каждые 14 дней новую почту и пользуемся пробной версией, которая никак не ограничивает конечный результат, или ILProtector, тоже не плохой обфускатор, Det4Dot не снимет его
Ну а для защиты можете сделать некий лаунчер, который будет воссоздавать саму программу, код которой будет у вас на сервере.
Вот гляньте работу AppFuscator
[Ссылки могут видеть только зарегистрированные пользователи. ] - обфусцированная программа(накляпал за 5 мин, показывает скорость работы циклов)
исходный код
Код:
using System;
using System.Threading;
using System.Diagnostics;
namespace ConsoleApplication1
{
internal class Program
{
static int Count = 100000000;
static void DWhile()
{
int TestInt = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
do TestInt++; while (TestInt <= Count);
sw.Stop();
float DoWhileTick = sw.ElapsedTicks;
float DoWhileMs = sw.ElapsedMilliseconds;
Console.WriteLine("Do_WhileTick = {0}\tDo_WhileMs = {1}", DoWhileTick, DoWhileMs);
}
static void WhileD()
{
int TestInt = 0;
Stopwatch sw = new Stopwatch();
sw.Start();
while (TestInt <= Count) TestInt++;
sw.Stop();
float WhileDoTick = sw.ElapsedTicks;
float WhileDoMs = sw.ElapsedMilliseconds;
Console.WriteLine("While_DoTick = {0}\tWhile_DoMs = {1}", WhileDoTick, WhileDoMs);
}
static void For()
{
Stopwatch sw = new Stopwatch();
int TestInt = 0;
sw.Start();
for (int i = 0; i <= Count; i++)
TestInt++;
sw.Stop();
float ForTick = sw.ElapsedTicks;
float ForMs = sw.ElapsedMilliseconds;
Console.WriteLine("ForTick = {0}\tForMs = {1}", ForTick, ForMs);
}
static void Foreach()
{
Stopwatch sw = new Stopwatch();
int TestInt = 0;
sw.Start();
byte[] bt = new byte[Count];
foreach (byte b in bt)
TestInt++;
sw.Stop();
float ForeachTick = sw.ElapsedTicks;
float ForeachMs = sw.ElapsedMilliseconds;
Console.WriteLine("ForeachTick = {0}\tForeachMs = {1}", ForeachTick, ForeachMs);
}
static Thread[] threads;
public static void Main()
{
threads = new Thread[4];
threads[0] = new Thread(DWhile);
threads[1] = new Thread(WhileD);
threads[2] = new Thread(For);
threads[3] = new Thread(Foreach);
foreach (Thread t in threads)
t.Start();
Console.ReadLine();
}
}
}
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Последний раз редактировалось Ginrey; 25.05.2015 в 14:07.
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Appfuscator, .Net Reactor, .SmartAssembly... всё это снимается, да, сложно, но, снимается.
Откуда я знаю? Опыт.
Вывод: писать что-то своё. Что? Ну сейчас видел реализации так называемого "облачного" кода.
Сериализируется функция, записывается в облако, из облака десериализируется и вызывается. Можно вытянуть код, но если прицепить к этому ещё пару проверок, то желание что-то крякать - отпадает.
________________
We are Ducks. We are birds. We like bread. We cryack. Cryack.
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
А можете ссылочки на примеры скинуть?
Сериализация/Десериализация пробейте в гугле, а облаком может быть любое хранилище данных
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
Сериализация/Десериализация пробейте в гугле
Аа понял) Была тут задумка сделать нечто такое:
Вин форм проект связывается с ASP MVC(сервер) и передает ему некоторые данные, на стороне сервера данные обрабатываются и возвращается некий Action. Вот только интересно на сколько будет хромать быстродействие и можно ли вообще так делать?) А если можно, то где можно покурить мануалы на эту тему?
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
Вин форм проект связывается с ASP MVC(сервер) и передает ему некоторые данные, на стороне сервера данные обрабатываются и возвращается некий Action. Вот только интересно на сколько будет хромать быстродействие и можно ли вообще так делать?)
да можно, по такому принципу у меня все работает, на быстродействии это никак не сказывается ибо время нужно затратить только при запуске программы, чтобы от сервера получить данные и достроить программу, в остальном же она работает как и всегда. Как все это передавать, спросите вы - смотрите темы в интернете по созданию чатов на уровне сокетов, а дальше уже от сервера сможете передавать клиенту любые данные.
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
да можно, по такому принципу у меня все работает, на быстродействии это никак не сказывается ибо время нужно затратить только при запуске программы, чтобы от сервера получить данные и достроить программу, в остальном же она работает как и всегда. Как все это передавать, спросите вы - смотрите темы в интернете по созданию чатов на уровне сокетов, а дальше уже от сервера сможете передавать клиенту любые данные.
Про сокеты я информацию нагуглю, но может вы посоветуете что то для новичков(никогда с ними не работал). И в каком виде хранить функции которые будут встраиваться в клиент на самом сервере?
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
И в каком виде хранить функции которые будут встраиваться в клиент на самом сервере?
смотря какая сериализация, если бинарная то в bin, если Xml-сериализация, то собственно в xml. В результате все равно передаете массив байт, а дальше уже с ним работаете
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
Цитата:
В результате все равно передаете массив байт, а дальше уже с ним работаете
Погуглил про сокеты, во всех материалах говорилось что для закрытия канала нужно указать сокету что данные переданы в полном объеме, например так:
Код:
...if (data.IndexOf("<TheEnd>") > -1)
{
Console.WriteLine("Сервер завершил соединение с клиентом.");
break;
}
handler.Shutdown(SocketShutdown.Both);
handler.Close();
}
Где <TheEnd> передаем вручную или дописываем его автоматически к строке(в случае чата), а как быть с функцией?
Re: Несколько вопросов по C# обфускации (SmartAssembly, internal функции)
если вы на TCP протоколе устанавливаете соединение, то он гарантирует, что пакет придет и в правильном порядке, так что просто вставить асинхронный прием данных и все. Ну а класс у вас есть, данные с него храните у себя на сервер, а после того как передадите все эти данные на клиента в переводите их в текст, а дальше десериализуете их в нужный класс
________________
Хотите как то отблагодарить за помощь?
Не стесняйтесь нажимайте "Спасибо" Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий).
Делаю программы на заказ, по всем вопросам в скайп: Ginrey2