Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Сложность защиты кода


Автор: ДобренькийПапаша 9.1.2010, 10:37
Точнее меня интересует ответ на вопрос. Почему защита кода, компилирующегося в машинный код проще и надёжней, чем кода компилируемого в байт-код? Хочу знать, почему, конкретно? Ещё хочу краткий ответ об отличии механизмов защиты.

Автор: Heinzz 9.1.2010, 11:16
Цитата(ДобренькийПапаша @  9.1.2010,  10:37 Найти цитируемый пост)
Почему защита кода, компилирующегося в машинный код проще и надёжней

байт код  это IL - вообще говоря читаемый код, при хорошей усидчивости в нем можно разобраться и повторить.
машинный код - специфичен для процессора и нечитаем.

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

Автор: ДобренькийПапаша 9.1.2010, 17:20
Да-да, то, что вы сказали ясно. А есть ли другие проблемы? 
Есть (насколько мне известно) 4 подхода к защите.

1)Запутывание кода.
2)Упаковка кода.
3)Управление JIT-компиляцией.
4)Виртуализация байт-кода.

Просьба вкратце рассмотреть эти подходы и расставить их по приоритету. Кто что думает по этому поводу? Мне интересно Ваше мнение.

Автор: jonie 9.1.2010, 18:10
машинный код защищают десятилетиями и уже кое-чего добились 8)
В процессе выполнения на уровне процессора можно замутить намного более сложные вещи, чем на уровне IL. Например, можно использовать фишки операционки делая отладку запущенного процесса. В кратце данная техника подразумевает, что процесс запускается под отладчиком (собой же), а сам код и данные процесса зашифрованы. При этом распаковка и дешифрование производится страницами в память. Суть отладчика - перехыватывать PAGE_FAULT ошибку, зашифровывать ранее расшифрованную страницу и дешифровать ту, куда процесс попытался стукнутся.. в общем техника реализована в защитах вроде Armadillo....
А еще на уровне процессора можно более эффективно противостоять отладчикам, вытворять всякие непоребности вроде адресация по нечетным адресам, вызов ошибок в совокупности с SEH и VEH .... или даже установке драйверов (как, например, StarForce)...


Я так понимаю в .net можно сделать нечто, что будет создавать код и выполнять его (через тот же CodeDOM например), но, учитывая что .net и так-то не быстр, это съест всю скорость...

Автор: ДобренькийПапаша 13.1.2010, 09:17
Ну вот я сделал небольшой обзор этих четырёх пунктов:

1)Обфускация.
Назначение обфускатора – запутать сам код, переименовывая имена членов (методов, переменных).
Перед обфускацией:
Код

private void CalcPayroll(SpecialList employeeGroup)
{
while(employeeGroup.HasMore())
    {
       employee = employeeGroup.GetNext(true);
       employee.UpdateSalary(); DistributeCheck(employee);
    }
}


После обфускации:
Код

private void _1(_1 _2)
{
     while(_2._1())
     {
            _1 = _2._1(true);
            _1._1();
            _1(_1);
     }
} 


2)Упаковка кода.

Сжатие исполняемого файла и прикрепление к нему кода, необходимого для распаковки и исполнения содержимого файла. Упаковка производится по ряду причин:
•    Упакованный файл занимает меньше места на жёстком диске, что помогает ускорить его загрузку в память
•    Некоторые виды упаковки совмещены с шифрованием содержимого файла для того, чтобы предотвратить обратную разработку программы.

3)Управление JIT-компиляцией.

Современные средства защиты позволяют изменить код программы для задания интеллектуального поведения самой программы во время выполнения по отношению к процессу выполняющему программу. Это позволяет обеспечить защиту от «отладки программы без  исходного кода». 

4)Виртуализация байт-кода.

Виртуализация кода – это следующий шаг в области защиты программного обеспечения от анализа. Большинство систем защит шифруют исполняемый код и расшифровывают его при запуске программы. Существуют защитные средства, которые никогда не расшифровывает код. В процессе защиты они способны переводить код программы в код, работающий на виртуальном процессоре. Набор команд этого процессора не похож на команды процессоров x86 или x64 и меняется при каждой защите программы.

Преимущества подхода к защите с использованием виртуализации кода:
  • Генерация уникальной среды выполнения 
  • Полиморфизм на уровне потока выполнения команд
  • Возможность портирования VM для выполнения на различных аппаратных платформах

Методы построения виртуальной среды выполнения:
  • Построение виртуальной среды выполнения опираясь на технологии отложенной компиляции Reflection.Emit (полностью managed вариант)
  • Построение полностью Native виртуальной среды выполнения
  • Построение гибридной виртуальной среды выполнения основанной на технологиях Managed C++ (Mixed mode)

Вывод:
Осложнить взлом программного кода можно используя комплексный подход к защите: обфускацию, упаковку, настройку на интеллектуальное поведение JIT-компиляции и виртуализацию

Стоимость пакетов для защиты программного кода колеблется от 800$ до 2.000$.
Они предоставляют возможность мутации кода, виртуализации, защиты памяти, защиты импорта, упаковки, определения отладчика, определение средств виртуализации. Помимо этого включают в себя полезные средства лицензирования: ограничение срока действия ключа, ограничение времени бесплатных обновлений, привязка ключа к оборудованию, привязка кода к ключу, ведение чёрных списков, веб-генераторы серийных номеров.






Автор: Voyager 9.2.2012, 14:35
А в каких продуктах реализована виртуализация байт-кода?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)