Защита приложения. Часть 2. Обфускация
Обфускация — следующий уровень защиты приложения. Недостаточно защитить данные паролями и привязкой к железу: такую защиту легко обойти, пронанализировав код. Мы писали об этом в предыдущей статье — «Защита приложения. Часть 1». Чтобы код нельзя было так просто просмотреть и понять — запутывайте его. Для этого и была придумана обфускация, набор методов, которые превращают понятный код в непонятную кашу.
См. также: «Реверсинг и обфускация, как это работает»
Обфускация имеет под собой серьёзные теоретические основания. Важно не только выполнить основную задачу — запутать код, но и при этом не нанести серьёзного урона как скорости, так и функциональности приложения.
Наибольшую популярность в деле обфускации получил метод Колберга. Пусть ваша программа — А, тогда задача сводится к созданию выходного кода A’ с использованием преобразований T1, T2…Tn, опирающихся на использование библиотек L1, L2…Ln. Эффективность процессов оценивается функциями E1, E2…En. Множественность возникает из-за разбиения кода на разные по важности фрагменты, оцениваемые функциями I1, I2…ln. Так мы обеспечим максимальную защиту важнейшим участкам, при этом постараясь не проиграть в быстродействии.
Виды обфускации
Преобразования бывают четырех видов:
- лексическая обфускация;
- преобразование данных;
- преобразование управления;
- профилактическая обфускация.
Лексическая обфускация — замена названий переменных и функций. Например, понятная раннее final_cost[positions] превращается в бездушную f5rq[zlp]. Или вот ещё сравните:
int counter;
bool alarm;
for (counter = 0; counter < 100; counter++)
{
if (counter == 99)
{
alarm = true;
}
}
int plf5ojvb; bool jht4hnv; for(plf5ojvb=0; plf5ojvb<100; plf5ojvb++){if(plf5ojvb==99) jht4hnv=true;)
А если переменных не две, а полтора десятка? Читать и понимать такое сложно. Этот вид обфускации простой для быстрого применения, но малоэффективный: меняются только названия методов, а общая схема работы остается неизменной. Современные IDE умеют искать использования методов в коде, это очень упрощает анализ обфусцированного кода. Обход такой обфускации вопрос времени.
Преобразование данных более сложная и эффективная операция. Она включает в себя изменение и создание новых типов данных и применение к ним комбинаторики. Например, число 9 можно представить, как 10000000001 (количество нулей), 210019 (двоичное число между идентификаторами начала и конца), 32 (32) и ещё огромным количеством способов. Или замена выражения i=1 для простого цикла перечисления на i0=21 c последующим представлением через другие константы — i=i0/i1-i2, где i1=7, i2=2. Что касается типов данных, то в простейшем случае можно представлять 32-битные числовые данные перемножением 16-битным на некоторую переменную со значением 16.
Преобразование управления — нарушение естественного хода программы, для чего используются непрозрачные предикаты. То есть это случай, когда результат исполняемых действий трудно предугадать в ходе заданной процедуры. В простейшем случае это создание дополнительных блоков кода: в одном выполняются вычисления, в другом происходит наследование, а в каком-то общем — несколько ложных операций, лишь одна из которых действительная. В более сложных ситуациях создаётся комплексная карта замещений и трансформаций, до неузнаваемости меняющих общую структуру кода.
Профилактическая обфускация защищает ваш код от деобфускации специальными программами-деобфускаторами. Они основываются на обнаружении неиспользуемых кусков кода, нахождении наиболее сложных структур (фрагментов максимальной важности) и анализе статистических и динамических данных. Именно борьба с этими операциями — наиболее сложный и эффективный процесс обфускации. Здесь необходимо максимально точно подойти к анализу исходных данных, задействовать максимум предоставленных ресурсов, учесть подходы потенциальных оппонентов.
Без опыта ручной обфускации создать непроходимый лабиринт не получится, требуется помощь специалистов. В сети можно отыскать массу бесплатных, платных и взломанных обфускаторов. Последний вид наиболее бесполезен: программа защиты, не способная защитить себя — сомнительный выбор. Бесплатные обфускаторы неплохи, но в силу своего распространения имеют универсальный и не самый сложный подход. Плюс, надежность процедуры запутывания также можно поставить под вопрос — если программа легко доступна, то ее алгоритмы несложно проанализировать и найти обратный алгоритм. Поэтому, если вы действительно собрались хорошо заработать на своем коде — не пожалейте денег на организацию грамотной обфускации.
Хорошо запутанная программа, закрытая надёжным паролем — уже головная боль для потенциального взломщика. Но и обфускация еще не финальный оплот защиты.
В следующей части — защита от отладчиков, протекторы, лицензии и программы слежения.
А тем, кто определился с тем, что хочет стать программистом, рекомендуем профессию «Веб-разработчик».