|
ЗАЩИТА JAVA-АППЛЕТОВ Андрей Каролик Xakep, номер #053, стр. 053-066-2 ЗАЩИТА: ИЗМЕНЕНИЕ ПОТОКА УПРАВЛЕНИЯ Более сложная защита, внедряющая в код дополнительные условные операторы и, следовательно, ложные логические развязки. В результате изменяется способ группировки выражений, порядок выполнения операторов или скрывается от декомпилятора реальный поток управления. Поясню на наглядном схематическом примере. Допустим, в коде есть два функциональных блока A и B, которые выполняются безусловно и последовательно. Если применить рассматриваемую защиту, то одна из возможных реализаций подобного алгоритма следующая - будет добавлен дополнительный блок, образующий при помощи оператора условного перехода развязку с двумя ветвлениями. Сделать это можно как минимум тремя способами: 1-ый СПОСОБ Между блоками A и B внедряется условный блок IF, одна из логических веток (при ложном условии) которого идет в обход блока B. Но условие в блоке IF всегда заведомо "истина", поэтому апплет выполняется корректно. Ложное ветвление необходимо, чтобы сбить с толку декомпилятор и усложнить анализ кода после декомпиляции. 2-ой СПОСОБ Из блока B клонируется два блока B' и B", являющихся двумя идентичными копиями одного и того же блока B. Далее они шифруются по-разному, сохраняя при этом свою функциональность. Апплет остается работоспособным, а выполняется только один из блоков (B' или B") в зависимости от условия в блоке IF, которое генерируется случайным образом. Непредсказуемая ловушка для декомпилятора и зарядка для мозгов :). 3-ий СПОСОБ Из блока B клонируется два блока B' и B" аналогично предыдущему способу, но в блок B" вносятся фатальные изменения, после которых блок B" работает некорректно. При этом в блоке IF всегда генерируется условие для выбора ветви с B'. Вместо блока B" может быть подставлен совершенно любой функциональный блок, не имеющий никакого отношения к данной программе. Декомпилятор этого все равно не знает :). Это очень упрощенный пример для наглядности. Реально дела обстоят намного сложнее. Проще говоря, после применения этой защиты появляются совершенно левые логические ветви, не влияющие на работоспособность апплета. В результате этого после декомпиляции появляется куча мусора, которая превратит анализ полученного "исходника" в затяжной кошмар. ЗАЩИТА: ИЗМЕНЕНИЕ СТРУКТУРЫ ДАННЫХ Самый продвинутый способ защиты, позволяющий полностью изменить первоначальную структуру байт-кода. Шифрованный код усложняется настолько, что воссоздание исходного кода становится практически невозможным. Алгоритмов и методов этой защиты существует довольно много. Вот только некоторые из реализуемых подходов: - усложняется наследование при помощи создания дополнительных классов (увеличивающих дерево наследования) или использования ложного дробления классов; - массивы реструктуризируются увеличением или сокращением их размерности (путем их объединения или дробления); - методы клонируются, а в полученные клоны одного и того же метода вносятся различные запутывающие изменения; |