Защитете своя APK от кражба на код с минимална конфигурация

Въведение

В съвременния свят сигурността е станала важна за почти всеки аспект от нашия живот. Същото важи и за кода, който пишем за нашите приложения. Всеки APK файл в PlayStore може да бъде деобфускиран. Тук говорим за обратно инженерство на APK файла. Това, което правим по време на нашата разработка, е, че полагаме усилия да конвертираме идеите си в код и след това да ги пакетираме в APK файл за внедряване.

Но това, което правят хакерите, е просто да изберат нашия APK файл, да го изтеглят от който и да е сайт на трета страна и да деобфускат APK файла, за да генерират файловете с изходния код или ресурсите, които разработихме. Като цяло не е добра идея да стартирате на живо, без да защитите кодовата си база. Отделете време и коригирайте този проблем със сигурността на кода, ако още не сте го направили.

APK файл без защита е като карта за банкомат без щифт: всеки може да получи достъп до него или да го използва за свои собствени цели. Ние създаваме нашите конкуренти тук. Разгледайте 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 Позволява свиване на ресурси, което се извършва от приставката Gradle за Android.

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 може да разбие вашия Release 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>;
}

Не можем да посочим всички, затова добавих няколко правила по-горе. Може да са необходими други правила в зависимост от използваните зависимости. За „преоборудване“, което е обща мрежова библиотека, проверете „правила за преоборудване на proguard“.

В случай на предупреждения, трябва да погледнем регистрационните файлове, които дават тези предупреждения, и да посочим -dontwarnвproguard-rules.pro:

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

Ако продължим да говорим, има много правила за обсъждане, така че нека да разгледаме този раздел в предстоящата ми статия.

Винаги пазете своя модел или POJO класове, в противен случай ще срещнете проблеми с classnotFound.

Неща, които трябва да запомните

  • Неправилното използване на ProGuard може да доведе до нежелани или неочаквани резултати, като сривове, което ще има голямо въздействие.
  • Въпреки че се прилага ProGuard, някои части от код или ресурси могат да бъдат достъпни за хакери, така че може да се наложи да използваме премиум инструменти, като DexGuard, които осигуряват пълна сигурност на известна цена.
  • Винаги използвайте правила за запазване за библиотеки и моделни класове на трети страни.

Резюме

Въпреки че има много повече неща, които можем да направим, ProGuard е основна конфигурация, която може да се внедри лесно дори от начинаещ. Мисля, че би било полезно за някои хора там.

Това е всичко за сега, хора. Нека се срещнем в друга статия, за да обсъдим подробно R8 свиването и първокласните инструменти за защита на нашата кодова база. Моля, уведомете ме за вашите предложения и коментари.

Благодаря ви, че прочетохте.

Препратки

„Свийте, объркайте и оптимизирайте приложението си“

Ръководство за ProGuard