Защитите свой APK от кражи кода с помощью минимальной настройки

Вступление

В современном мире безопасность стала важна почти для каждого аспекта нашей жизни. То же самое относится к коду, который мы пишем для наших приложений. Любой файл APK в PlayStore можно деобфускировать. Здесь мы говорим о реверс-инжиниринге файла APK. Во время разработки мы прилагаем все усилия для преобразования наших идей в код, а затем упаковываем их в файл APK для развертывания.

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

Файл APK без защиты похож на карту банкомата без PIN-кода: любой может получить к нему доступ или использовать его для своих целей. Здесь мы создаем конкурентов. Взгляните на PlayStore и посмотрите, сколько там дублированных приложений. Будьте осторожны с кражей кода.

Что такое ProGuard?

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

  • Обфускация: наши классы и их члены переименовываются в произвольные короткие формы, что приводит к уменьшению размеров файлов DEX. А декомпилированный код будет трудно читать и понимать.
  • Оптимизация: анализирует и оптимизирует код.
  • Сжатие: убирает неиспользуемые части из окончательного APK. Это в основном выполняется в два этапа:
  1. Сокращение кода - обнаруживает и безопасно удаляет неиспользуемые переменные, методы, классы и т. д. из зависимостей нашего приложения и его библиотек.
  2. Уменьшение ресурсов - удаляет неиспользуемые файлы ресурсов из зависимостей нашего приложения и его библиотек.

ProGuard - это встроенный в SDK инструмент, доступный для использования, поэтому нет необходимости добавлять дополнительные зависимости.

Зачем нам ProGuard?

Чтобы защитить кодовую базу нашего приложения от кражи кода с минимальными настройками, мы можем использовать ProGuard. Это затруднит понимание и повторное использование после декомпиляции файла APK, к которому применен ProGuard. Когда применяется ProGuard, имена переменных, методов и классов будут заменены бессмысленными именами или символами, которые будет трудно прочитать и понять. Таким образом мы можем в некоторой степени защитить себя.

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

Как получить информацию обфускации для трассировки стека

Что на самом деле ProGuard делает под капотом во время обфускации, так это то, что он создает файл сопоставления. Файл сопоставления содержит отношения между исходными именами и скрытыми именами полей, методов и классов. Файл сопоставления будет полезен в будущем для отслеживания некоторых ошибок или вещей, которые мы не можем понять в запутанном коде. Например, мы применили ProGuard и выпустили приложение в PlayStore. Если возникают какие-то ошибки, в большинстве случаев будут отображаться запутанные имена, которые будет трудно отладить. Поэтому для анализа или решения проблем будет лучше иметь эту информацию о сопоставлении обфускации.

Пример файла сопоставления:

Как использовать ProGuard

Использование ProGuard требует минимальных усилий, потому что мы просто добавляем несколько флагов в наш build.gradle файл уровня приложения.

minifyEnabled - Позволяет сжать, запутать и оптимизировать код.

shrinkResources - Включает сжатие ресурсов, которое выполняется подключаемым модулем Android Gradle.

proguardFiles - Настройка ProGuard выполняется путем указания правил ProGuard по умолчанию (proguard-android-optimize.txt файл, который является частью SDK).

proguard-android-optimize.txt

Обычно он находится по пути к папке sdk/tools/proguard. Ниже приведен путь на моем Mac, и ваш путь может отличаться, но в идеале он должен находиться в папке инструментов SDK.

/Users/username/Library/Android/sdk/tools/proguard/proguard-android-optimize.txt

proguard-rules.pro

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

Как ProGuard может нарушить ваш релиз APK

Применение ProGuard и создание подписанной сборки может вызвать предупреждения из-за отсутствия некоторых ссылок или любых других проблем, связанных с кодом. В конечном итоге мы можем их исправить, что требует времени, чтобы понять. Или мы можем просто указать -dontwarn правила, чтобы пропустить предупреждения. Ошибки будут отображаться в журнале сообщений.

Если вы применяете ProGuard впервые, вам необходимо тщательно собрать и протестировать подписанный APK-файл релиза перед развертыванием. В большинстве случаев из-за обфускации, применяемой ProGuard, возникают сбои или ошибки с надписью «класс не найден» и т. Д. Нам нужно правильно указать правила для некоторых классов, чтобы избавиться от этих ошибок.

Всегда рекомендуется доводить до ума подписанную сборку выпуска перед ее развертыванием.

Наиболее часто используемые правила Proguard

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

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

Чтобы исправить такие ошибки и заставить R8 сохранить определенный код, добавьте строку -keep в файл правил ProGuard с указанным именем класса. Например:

-keep public class MyClass

Вышеупомянутое было бы обычным случаем, если бы мы использовали функции интерфейса JavaScript в нашем приложении. Методы JavaScript будут удалены, поскольку их невозможно будет отследить. Итак, нам нужно добавить параметры сохранения в proguard-rules.pro:

-keepclassmembers class * {
	@android.webkit.JavascriptInterface <methods>;
}
-keepattributes JavascriptInterface

Далее, если мы используем какую-либо стороннюю библиотеку, мы должны соблюдать указанные ими правила ProGuard.

####### Glide #######
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.module.AppGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
##== Wootric ==
-keep class com.wootric.** { *; }

### Agora ###
-keep class io.agora.**{*;}
### Retrofit ###
-keep class retrofit2.** { *; }
-keepclasseswithmembers class * {
    @retrofit2.http.* <methods>;
}

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

В случае предупреждений нам необходимо просмотреть журналы, в которых выдают эти предупреждения, и указать -dontwarn в proguard-rules.pro:

-dontwarn <classes_name>
-dontwarn retrofit2.**
-dontwarn okio.**

Если мы продолжим разговор, нужно обсудить множество правил, поэтому давайте проверим этот раздел в моей следующей статье.

Всегда сохраняйте свою модель или классы POJO, иначе вы столкнетесь с проблемами classnotFound.

То, что нужно запомнить

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

Резюме

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

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

Спасибо за чтение.

использованная литература

Сжимайте, скрывайте и оптимизируйте приложение

Руководство ProGuard