Anonymizer – еще одна специя для
защиты .Net сборок.
В
новой версии Spices.Net компания 9rays.net
предлагает более эффективную и «умную» технологию защиты метаданных от
дизассемблинга и декомпиляции - Anonymizer. Это следующее поколение
защитных средств для .Net сборок, дающее более
эффективные результаты по сравнению с технологией antiILDASM.
Эта
технология сочетает такие методы защиты как обфускация кода и обфускация
метаданных, давая намного более эффективные результаты по сравнению с codeflow obfuscation (т.к codeflow obfuscation
базируется на применении «шаблонных» способов запутывания кода,
они легко распознаются хорошими декомпиляторами), в данном случае сделать это
будет труднее если вообще невозможно (разработчики предусмотрели защиту от
распознавания анонимизированных участков кода).
Эта
технология позволяет максимально скрыть и исказить IL-code,
тем самым делая код, генерируемый декомпиляторами некорректным и невозможным
для использования.
Итоги
тестов показали что Anonymizer превратит сборку неудобочитаемый
«фарш», представьте себе спутанный клубок проводов, который предстоит
распутать, где каждый провод спутан как минимум с тремя другими.
Anonymizer – это комплексное решение
по защите сборок от дизассемблинга, декомпиляции и деобфускации.
Рассмотрим
средства защиты предлагаемые технологией Anonymizer:
1. Маскирование обращений к «видимым» в IL-code обращениям к внешним
типам, методам и полям, анонимизацию этих обращений. (Использование опций AnonymizeOptions.ReferencedMethods и AnonymizeOptions.ReferencedFields)
Посмотрим на это со стороны IL-code,
это исходный IL-code:
IL_0000:
ldstr "Test1:"
IL_0005:
ldarga.s
IL_0007:
call instance string [mscorlib]System.Int32::ToString()
IL_000c:
call string [mscorlib]System.String::Concat(string, string)
IL_0011:
call void [mscorlib]System.Console::WriteLine(string)
|
Это результаты обработки этого кода технологией Anonymizer:
IL_0000:
call class object smallTest.┌::2()
IL_0005:
ldarga.s
IL_0007:
call class object smallTest.│::│5(class object)
IL_000c:
call class object smallTest.│::│2(class object, class
object)
IL_0011:
call void smallTest.│::│7(class object)
|
Как
видите, обращения к методам Int32.ToString(), String.Concat, System.Console.WriteLine
были анонимизированы.
a)
было
затруднено понимание выполнения метода,
b)
выполнение
метода производится в анонимизированном методе с анонимизированным списком
параметров
c)
return type
метода также анонимизирован и затруднительно опознать что же возвращает метод.
2. Анонимизация
внутренних обращений. (Использование опций AnonymizeOptions.InternalMethods и AnonymizeOptions.InternalFields)
Подобным же образом Anonymizer
обрабатывает и обращение к внутренним методам и полям. Единственное различие
перед предыдущим методом – здеьс в обработку попадают члены сборки, которые не
были обфусцированы или исключены при помощи атрибута NineRays.Obfuscator.DontAnonymize.
NB: Это средство необходимо
только для усиления защиты, возможно достаточным для применения в большинстве
случае будет использование опции AnonymizeOptions.Stubs т.е скрытия тел необфусцированных
членов сборки.
3. Анонимизация
шифрования строк. (Использование опций AnonymizeOptions.StringEncryption)
Технология Anonymizer имеет в своем арсенале и
средство для анонимизации шифрования строк (string
encryption).
String Encryption
позволяет не только скрыть загрузку строк от исследователя сборки, но и
зашифровать строку для того чгобы невозможно было восстановить секретную информацию
из IL-кода. Некторые
декомпиляторы могут опознавать код string encryption
и дешифровать строку. Anonymizer позволяет максимально
скрыть информацию о передаваемых параметрах и возвращаемых данных из методов
дешифрации. Эти дополнительные меры затрудняют работу декомпилятора, делают
генерируемый декомпилятором или полученный утитилитой ILDASM код невозможным для использования .
NB: дополнительные меры защиты
препятствуют дизассемблингу сборки а также использованию листинга генерируемого
ILDASM для создания копии дизаcсемблированной сборки утилитой ILASM(roundtrip –ILDASM-ILASM).
4.
Установка заглушек (Использование опции AnonymizeOptions.Stubs)
Эта опция из арсенала технологии позволяет заместить
необфусцированные методы анонимизированными методами-заглушками.
Рассмотрим пример:
public
bool PrintMessage(string msg)
{
System.Console.WriteLine(msg);
}
//----
usage ------
if
(PrintMessage(“Hello!”))
{
…
}
|
Это результаты обработки этого кода технологией Anonymizer:
//original
public
bool PrintMessage(string msg)
{
0(msg);
}
//stub
internal
void 0(object a_0)
{
System.Console.WriteLine(a_0);
}
//----
usage ------
if
(0(s.1())//use stub and encrypted string(s.1 method)
{
…
}
|
Как мы видим:
a)
метод был замещен методом 0.
b)
его обращения
в телах других методов – также замещены.
c)
При применении
анонимизации referenced members
будет анонимизировано также и тело метода 0, это позволяет
избежать лишних вызовов и оптимизировать производительность сборки :
//original
public
bool PrintMessage(string msg)
{
0(msg);
}
//stub
internal
void 0(object a_0)
{
q.0(a_0);
}
//----
usage ------
//use
stub and encrypted string(s.1 method)
if
(0(s.1())
{
…
}
|
5. Дополнительная
информация.
a)
Средства
технологии Anonymizer будут очень полезны
при работе со сборками требующими минимальной обфускации, т.е содержащие
большое количество публичных членов используемых в сериализации или reflection и помогут
дополнительно защитить подобного рода сборки.
b)
Как
дополнительное средство защиты можно использовать antiILDASM.
c)
Код
производимый Anonymizer конечно же скажется на
производительности исполнения кода (assembly performance, IL-code performance), т.к производятся
редиректы вызовов, для избежания применения Anonуmizer на критическом коде, пользователь
может пометить код, не предназначенный для анонимизации специальным атрибутом (NineRays.Obfuscator.DontAnonymize), а для отмены установки
заглушек на методе специальным атрибутом (NineRays.Obfuscator.DontStub).
d)
Верификация
- код производимый Anonymizer не будет проходить верификацию
утилитой PEVerify, т.к искажает информацию о
типах, листе параметров анонимизируемых обращений или замещаемых методов к
членам сборки и referenced members.
Но искажение этой информации не влияет на корректность выполнения кода.