В этой статье я расскажу о очень необычной защите приложения от вырезанного активити (чтоб лишний раз не пиарить продукт назовём его «приложение-N»).
Итак, я скачал N, использующее разрешение на интернет.
<uses-permission android:name="android.permission.INTERNET" />
Ну-с, приступим
Логично предположить, что после того как я проверил работу приложения с выключенным интернетом, я тут же вырезал это activity, пересобрал и запустил нашего пациента. Сразу скажу, я рассчитывал на многое, на уведомление о сбое permission, на нормальный запуск, признаюсь даже думал об обычном вылете. Однако все мои предположения в миг рухнули как только N зависло в стадии загрузки.
После не долгих проверок о включение и выключение интернета, можно сделать вывод о том, что где-то в Smali-коде есть функция, проверяющая все разрешения, но вот где она находится. На этот вопрос ответа у меня не было.
Я думал это будет обычная рядовая операция по типу: «изменить шестнадцатеричную дамбу и вуаля, куча ресурсов, всё работает, все счастливы.
Будем разбираться
Итак есть очень много программ по декомпиляции dex в smali, однако мне необходимо декомпилировать сначала в java, т.к там всё более-менее понятно нежели в байт-коде.
Я воспользовался обычным онлайн ресурсом по такому случаю:
джавулька декомпилер.
После моих деяний я сделал поиск по всем файлам с запросом INTERNET
.
И нашёл тот заветный файл, не дающий запуск приложения с отсутствием activity.
Вот кусок его кода (Java)
package com.N;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
далее сама функция проверки на Smali
.line 896
.local v3, "neededActivityInfo":[Ljava/lang/String;
array-length v10, v3
const/4 v8, 0x0
move v9, v8
:goto_27
if-lt v9, v10, :cond_37
.line 917
const/4 v8, 0x1
new-array v4, v8, [Ljava/lang/String;
const/4 v8, 0x0
.line 918
const-string v9, "android.permission.INTERNET" #Нужно вырезать
aput-object v9, v4, v8 #Нужно вырезать
То есть с вырезкой этого кода
const-string v9, "android.permission.INTERNET"
aput-object v9, v4, v8
наше хитрое N после своего парсинга возвращает верные объекты и прога запускается.
Конечный итог
Благополучно скомпилировавший, приложение запустилось и работало долго и счастливо.