Как обнаружить рутированное / взломанное устройство Android

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

3 ответа

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

Теперь вы можете использовать SafetyNet Attestation API,

Вот ссылка на документацию.

Вот фрагмент того, как использовать API, взятый из документации.

// The nonce should be at least 16 bytes in length.
// You must generate the value of API_KEY in the Google APIs dashboard.
SafetyNet.getClient(this).attest(nonce, API_KEY)
    .addOnSuccessListener(this,
        new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
            @Override
            public void onSuccess(SafetyNetApi.AttestationResponse response) {
                // Indicates communication with the service was successful.
                // Use response.getJwsResult() to get the result data.
            }
        })
    .addOnFailureListener(this, new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            // An error occurred while communicating with the service.
            if (e instanceof ApiException) {
                // An error with the Google Play services API contains some
                // additional details.
                ApiException apiException = (ApiException) e;
                // You can retrieve the status code using the
                // apiException.getStatusCode() method.
            } else {
                // A different, unknown type of error occurred.
                Log.d(TAG, "Error: " + e.getMessage());
            }
        }
    });

Чтобы использовать следующий API, вам необходимо сгенерировать ключ API из консоли API Google. Этот ключ - то, что вы передаете .attest() метод.

Также добавьте зависимость SafetyNet.

implementation 'com.google.android.gms:play-services-safetynet:15.0.1'

См. https://developers.google.com/android/guides/setup для получения последней версии зависимости.

API возвращает следующее:

{
  "nonce": "R2Rra24fVm5xa2Mg",
  "timestampMs": 9860437986543,
  "apkPackageName": "com.package.name.of.requesting.app",
  "apkCertificateDigestSha256": ["base64 encoded, SHA-256 hash of the
                              certificate used to sign requesting app"],
  "apkDigestSha256": ["base64 encoded, SHA-256 hash of
                  the APK installed on a user's device"],
  "ctsProfileMatch": true,
  "basicIntegrity": true,
}

куда ctsProfileMatch а также basicIntegrity целостность устройства.

введите описание изображения здесь

Проверьте RootTools, это фантастическая библиотека, предназначенная для облегчения разработки приложений для корневых устройств.

Из их примеров:

if (RootTools.isRootAvailable()) {
    // su exists, do something
} else {
    // do something else
}

Есть много методов, используемых для джейлбрейка телефона; большинство из них зависят от аппаратного и / или программного обеспечения. Некоторые телефоны даже поставляются с доступом суперпользователя по умолчанию! Нет смысла проверять все эти способы, потому что конечный результат один и тот же: у вас есть права суперпользователя. Так что да, самый простой / самый простой / лучший ответ - попытаться выполнить команду суперпользователя.

Если вы обеспокоены тем, что этого недостаточно, возможно, вы сможете объяснить больше о том, что вы пытаетесь сделать.

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