Действительно ли невозможно защитить приложения Android от обратного инжиниринга?

Как известно, приложения для Android написаны на Java. В Java, независимо от того, что вы делаете, невозможно защитить скомпилированный код от декомпиляции или обратного инжиниринга, как вопрос переполнения стека Как заблокировать скомпилированные классы Java, чтобы предотвратить декомпиляцию? предлагает.

Как можно защитить приложение, содержащее алгоритмические торговые секреты, от обратного инжиниринга?

Под "как" я подразумеваю не только программные методы, но и другие творческие подходы.

10 ответов

Решение

Первой остановкой для меня было бы оптимизировать и запутать код с помощью ProGuard, который, как известно, работает с байт-кодом, предназначенным для Android Dalvik VM (через Dex). Это действительно отличный инструмент, и он может увеличить сложность "перевернуть" ваш код, в то же время сократив объем кода (в некоторых случаях резко: мой недавний апплет уменьшился с примерно 600 КБ до примерно 50 КБ).

Как говорят другие, вы никогда не получите 100% -ную безопасность деталей вашего алгоритма, пока его реализация распространяется среди клиентов. Для этого вам нужно хранить код только на своих серверах. Попытки почти 100% -ной защиты клиентского кода фактически равносильны DRM и могут сделать ваш клиентский код хрупким перед лицом перебоев в работе сети и просто в целом расстроить (законных) пользователей.

В блоге разработчиков Android есть несколько полезных статей по теме "устойчивых к взлому" приложений Android (и они рекомендуют использовать ProGuard как часть общего подхода).

Что касается "креативных" подходов: некоторые разработчики используют методы обнаружения отладчика для предотвращения анализа во время выполнения и сочетают это с шифрованием частей двоичного кода (для предотвращения статического анализа), но, честно говоря, достаточно решительный злоумышленник может их обойти, в то время как это может вызвать законное недовольство пользователя, как показано в статье Windows KB. Игры: Сообщение об ошибке: Обнаружен отладчик: выгрузите отладчик и попробуйте снова. По этой причине DVD-диск моей подруги "Учись водить" не будет работать под VirtualBox, но она, конечно, винит Linux!

Статьи OpenRCE и Wikipedia об обфусцированном коде могут быть хорошими отправными точками, если вы хотите изучить это дальше. Но будьте осторожны, вы можете потерять больше из-за усердного использования этих методов, расстраивающих ваших пользователей, чем вы потеряли бы коммерческие секреты из-за обратного инжиниринга. Как говорит Антон С., возможно, самый "творческий" подход заключается в настройке бизнес-модели, а не технологии.

Последнее обновление Android SDK от 6 декабря 2010 года (совпадает с выпуском Android 2.3 Gingerbread):

Интегрированная поддержка ProGuard: ProGuard теперь поставляется с SDK Tools. Теперь разработчики могут запутывать свой код как интегрированную часть сборки релиза.

Если это возможно: удаленные вызовы процедур для хорошо защищенного сервера (на сервере есть код, который вы хотите защитить).

Сделайте это настолько дешевым, чтобы не беспокоиться и не строить свою бизнес-модель на основе секретов, которые выполняются на стороне клиента. Другими словами, не делитесь своими секретами.

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

Так что, если у вас есть алгоритмические секреты, разместите их на стороне сервера.

Как заблокировать скомпилированные классы Java, чтобы предотвратить декомпиляцию

Ты не можешь Любая схема может быть побеждена человеком с достаточными навыками, временем и мотивацией.

(Между прочим, это также относится к программному обеспечению, скомпилированному в двоичный файл. Единственная разница заключается в количестве усилий, необходимых для декомпиляции.)

Мой вопрос заключается в том, как можно защитить приложение, содержащее алгоритмические торговые секреты, от обратного инжиниринга?

Просто не устанавливайте приложение на телефон пользователя. Или (что более полезно), запустите код, содержащий торговые секреты, на удаленном (должным образом защищенном) сервере.

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

Однако вы можете помешать им сделать это, сделав ваше приложение бесплатным или, по крайней мере, слишком дешевым, чтобы люди не беспокоились.

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

Независимо от того, что вы делаете, возможно, по крайней мере, вы можете сделать это очень трудно для декомпиляции, но: если что-то выполняется / вычисляется в программе, информация об алгоритме должна быть там, и всегда будет возможность узнать как получить это (достаточно навыков и мотивации на стороне соперника). Всегда.

Вы хотите творческий подход, вот один.

Какова основная программа на телефонах, которые не были декомпилированы сегодня? Радио прошивки. Зачем? Он работает не на чипсете ARM телефона, а на отдельном шестиграннике Qualcomm, который все больше присутствует в смартфонах. Это не x86, это не ARM, он использует собственную архитектуру и инструкции Qualcomm.

  • Декомпиляция Java проста.

  • Декомпиляция ARM более сложна (лицензии на декомпилятор Hex-Rays начинаются с 1129 долларов США... и сочетание большого пальца и стандартного кода ARM в двоичных файлах - трудная задача) => вы можете попробовать скомпилировать с помощью Android NDK.

  • На данный момент нет декомпиляторов Hexagon! И спецификации QDSP не являются общедоступными, даже пиратские версии.

Вопрос в том, может ли независимый поставщик программного обеспечения использовать прошивку Hexagon, входящую в состав телефонов массового рынка? Кажется, это направление, которое выбирает Qualcomm. Проверьте их веб-сайт и продукты SnapDragon.

NB: я не Pro-Qualcomm и не Pro-закрытый источник. Но эта тема обращается к такому решению.

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

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

Другие вопросы по тегам