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

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

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

Возможное решение:
Алгоритм генерируется на сервере (jar файл или класс) и передается в приложение в зашифрованном виде. Приложение скачивает этот файл и перед исполнением его расшифровывает. Главная проблема - это куда записать ключ для расшифровки этого класса, чтобы пользователь не смог получить этот ключ.
  • Вопрос задан
  • 510 просмотров
Пригласить эксперта
Ответы на вопрос 4
OnYourLips
@OnYourLips
Security through obscurity, особенно непрофессионально сделанное, ни к чему хорошему не приведет.

Выносите часть логики на сервер, не доверяйте клиенту.
Ответ написан
CityCat4
@CityCat4
Если я чешу в затылке - не беда!
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
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Power Tech Рязань
от 200 000 до 220 000 ₽
Yolla Санкт-Петербург
от 100 000 до 100 000 ₽