ЗАЩИТА 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" может быть подставлен совершенно любой функциональный блок, не имеющий никакого отношения к данной программе. Декомпилятор этого все равно не знает :).

Это очень упрощенный пример для наглядности. Реально дела обстоят намного сложнее. Проще говоря, после применения этой защиты появляются совершенно левые логические ветви, не влияющие на работоспособность апплета. В результате этого после декомпиляции появляется куча мусора, которая превратит анализ полученного "исходника" в затяжной кошмар.

ЗАЩИТА: ИЗМЕНЕНИЕ СТРУКТУРЫ ДАННЫХ

Самый продвинутый способ защиты, позволяющий полностью изменить первоначальную структуру байт-кода. Шифрованный код усложняется настолько, что воссоздание исходного кода становится практически невозможным. Алгоритмов и методов этой защиты существует довольно много. Вот только некоторые из реализуемых подходов:

- усложняется наследование при помощи создания дополнительных классов (увеличивающих дерево наследования) или использования ложного дробления классов;

- массивы реструктуризируются увеличением или сокращением их размерности (путем их объединения или дробления);

- методы клонируются, а в полученные клоны одного и того же метода вносятся различные запутывающие изменения;

Назад на стр. 053-066-1  Содержание  Вперед на стр. 053-066-3