September 11, 2018

Обход запрета на использование reflection в Android Pie

Мой канал @VolfsChannel

Для того чтобы понять, что вообще тут происходит, прочитайте предыдущую статью на канале.

Как я могу отключить данные ограничения?

Данные ограничения можно отключить на 1-м конкретном устройстве с помощью команд ADB:

adb shell settings put global hidden_api_policy_pre_p_apps 1
 adb shell settings put global hidden_api_policy_p_apps 1

Команды принимают следующие входные параметры:

  • 0: отключение обнаружения использования non-SDK API. Это также отключит ведение журнала, а также нарушит строгий режим API, detectNonSdkApiUsage(). Не рекомендуется для повседневного использования.
  • 1: "только предупреждение" - разрешить доступ ко всем API, не связанным с SDK, но сохранять предупреждения в журнале. Строгий режим API будет продолжать работать.
  • 2: запретить использование темно-серого и черного списка API.
  • 3: запретить использование черного списка API, но разрешить использование темно-серого списка

Если у вас нет ПК, то вы можете прописать эти команды в эмуляторе терминала (потребуются права Root):

su
settings put global hidden_api_policy_pre_p_apps 1
settings put global hidden_api_policy_p_apps 1

Со стороны ПО вы можете использовать вариант выше через Runtime.getRuntime().exec("command")

Или же создать класс Application, и поместить вызов метода в onCreate():

public void hackVmPolicy() {
 
		if (Build.VERSION.SDK_INT >= 28) {
 
			StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
 
			StrictMode.setVmPolicy(builder.build());
 
		} else {
 
			Log.i("Lower android version " + Build.VERSION.SDK_INT);
 
		}
 
	}

Суть этого метода заключается в переопределении политики VM для конкретного приложения. Мы создаём новый (пустой) инстанс политики, и применяем его. Т.к. за рефлексию отвечает метод detectNonSdkApiUsage(), мы можем играть не по правилам.

@VolfsChannel