Как скрыть алгоритм от дизассемблера?

В двух словах о задаче.
Есть приложение в Play Market-те и его основная часть - это обычное приложение и его код не содержит никакой ценной информации. Так же в этом приложении есть интерфейс:
public interface IEncoder {
    byte [] encode(int id1, int id2, Context context) throws Exception;
}

Класс реализующий данный интерфейс нужно спрятать от возможного просмотра этого алгоритма. Этот класс по определенному алгоритму генерирует ключ (AES 128) и этим ключом шифруем id1 + id2 + random() и передаем эту строку на устройство, которое использует ключ сгенерированный по тому же алгоритму, расшифровывает этим ключом данные и если последовательность совпадает, то делает определенные действия.

Возможное решение:
Алгоритм генерируется на сервере (jar файл или класс) и передается в приложение в зашифрованном виде. Приложение скачивает этот файл и перед исполнением его расшифровывает. Главная проблема - это куда записать ключ для расшифровки этого класса, чтобы пользователь не смог получить этот ключ.
  • Вопрос задан
  • 625 просмотров
Пригласить эксперта
Ответы на вопрос 3
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
Security through obscurity обычно приводит к тому, что некто пряморукий, с большим количеством времени и желания (идеальный нарушитель - мотивирован, подготовлен, обеспечен временем :) ) хачит этот Ваш алгоритм и потом ржет на весь тырнет...
Ответ написан
Комментировать
@jacob1237
Если Вы хотите "спрятать" реализацию алгоритма, лучше всего это сделать на сервере. В таком случае Вам нужно будет отправить всего лишь один запрос с минимальным количеством данных (по защищенному каналу).

В качестве альтернативного варианта транспорта можете использовать СМС: приложение будет отправлять зашифрованное СМС на определенный номер, а на другом конце сервер обработает СМС и отправит назад такое же зашифрованное СМС, в котором будет ключ.

Если ни один подобный вариант не подходит, лучше всего написать реализацию алгоритма на C (как уже советовали выше), но C точно также можно декомпилировать, если очень захотеть. Софт типа IDA Pro решает подобные задачи на ура.

Единственный способ хоть как-то скрыть и усложнить дизассемблирование - это применение различных техник обфускации бинарного кода. Эта тематика особенно популярна в среде вирусописателей. Они используют т.н. "крипторы", одна из разновидностей которых - это полиморфный криптор.

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

Чтобы не писать все самому с нуля, посмотрите вот эти ссылки и погуглите на тему virtualization obfuscation:
vmpsoft.com - софт который делает как раз то что Вам нужно
https://oreans.com/codevirtualizer.php - похожий софт
https://www.reddit.com/r/ReverseEngineering/commen...
https://github.com/fritzone/obfy - небольшой фреймворк на C++ для обфускации кода.

В целом же все эти варианты (кроме варианта с запросами на сервер) не дадут 100% защиты от декомпиляции кода.
Ответ написан
Комментировать
@stul5tul
Зацепить бинарную библиотеку, сделанную с Android NDK.
Код пишется на C/С++/Go и т.п.
Она тоже дизассемблируется, но уже нааааааааамного более сложнее, чем код для JVM
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы