Как предотвратить установку моего приложения на Android-телефоны с рутовым доступом?

Цель в этом контексте - предотвратить появление в LeaderBoard ложных рекордов (мое приложение - игра). Это произошло для Flappy Birds - см. Эту ссылку - http://www.androidpit.com/forum/589832/flappy-bird-high-score-cheat-set-your-own-high-score

Поскольку пользователь root может делать со своим мобильным устройством все, что он захочет, я полагаю, что никакие другие обходные пути не сработают, и единственное решение состоит в том, чтобы предотвратить установку приложения пользователями с правами root. Я прав? Есть ли способ сделать это?

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

6 ответов

Решение

У меня было похожее требование. Я не смог добиться того, чтобы приложение не устанавливалось на рутированное устройство, но я использовал обходное решение для этого:

  • Убедитесь, что ваше устройство связано с вашей деятельностью onResume,
  • Если он рутирован, просто покажите ему предупреждение "Это устройство рутировано. Вы не можете использовать это приложение." И выйдите из приложения.

Пример:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();
    if(new DeviceUtils().isDeviceRooted(getApplicationContext())){
        showAlertDialogAndExitApp("This device is rooted. You can't use this app.");
    }
}


public void showAlertDialogAndExitApp(String message) {

    AlertDialog alertDialog = new AlertDialog.Builder(MainActivity.this).create();
    alertDialog.setTitle("Alert");
    alertDialog.setMessage(message);
    alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    Intent intent = new Intent(Intent.ACTION_MAIN);
                    intent.addCategory(Intent.CATEGORY_HOME);
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(intent);
                    finish();
                }
            });

    alertDialog.show();
}

DeviceUtis.java был класс Utility, который возвращался, если устройство рутировано или нет.

public class DeviceUtils {

    public Boolean isDeviceRooted(Context context){
        boolean isRooted = isrooted1() || isrooted2();
        return isRooted;
    }

    private boolean isrooted1() {

        File file = new File("/system/app/Superuser.apk");
        if (file.exists()) {
            return true;
        }
        return false;
    }

    // try executing commands
    private boolean isrooted2() {
        return canExecuteCommand("/system/xbin/which su")
                || canExecuteCommand("/system/bin/which su")
                || canExecuteCommand("which su");
    }
}

Мы использовали 5 методов для тестирования, и я только что показал 2 здесь. Вы можете использовать любой из методов, которые вы найдете хорошими.

Надеюсь это поможет.

PS: я поместил этот вызов во все виды деятельности onResume пользователь (с целью взлома) может установить приложение, перейти к какому-либо другому действию, а затем к корневому устройству.

private static boolean canExecuteCommand(String command) {
        boolean executedSuccesfully;
        try {
            Runtime.getRuntime().exec(command);
            executedSuccesfully = true;
        } catch (Exception e) {
            executedSuccesfully = false;
        }

        return executedSuccesfully;
    }

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

Игрок хочет обмануть свой путь к последнему уровню или к вершине местной (!) Таблицы лидеров? Где ущерб?

Запрет на запуск вашей игры на рутированных устройствах не даст вам ничего, кроме отпугивания законных пользователей вашего приложения.

Редактировать:

Используйте сервис облачного сохранения, чтобы сохранить рекорды игрока. в автономном режиме он будет зашифрован и сохранен на устройстве. В следующий раз онлайн вы прочитаете рекорд и отправите его в сервис Play. Сервис play предоставляет функцию защиты от пиратства, которую вы также можете захотеть.

С помощью Kotlin Extension вы можете легко проверить, внедрено устройство или нет. ниже приведен код, который может вам помочь

DeviceUtils.kt

object DeviceUtils {
    fun isDeviceRooted(context: Context?): Boolean {
        return isRooted1 || isRooted2
    }

    private val isRooted1: Boolean
        get() {
            val file = File("/system/app/Superuser.apk")
            return file.exists()
        }

    // try executing commands
    private val isRooted2: Boolean
        get() = (canExecuteCommand("/system/xbin/which su")
                || canExecuteCommand("/system/bin/which su")
                || canExecuteCommand("which su"))

    private fun canExecuteCommand(command: String): Boolean {
        return try {
            Runtime.getRuntime().exec(command)
            true
        } catch (e: Exception) {
            false
        }
    }
}

Extention.kt

fun Activity.checkDeviceRoot(): Boolean {
    return if (DeviceUtils.isDeviceRooted(this)) {
        AlertDialog.Builder(this)
                .setMessage("Your device is rooted. you can not use this app into rooted device.")
                .setCancelable(false)
                .setPositiveButton(R.string.alert_ok) { _, _ ->
                    exitProcess(0)
                }.show()
        true
    } else {
        false
    }
}

Как использовать это расширение:

class MyActivity : Activity{
    ...
    override 
    fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_splash)

        if(checkDeviceRoot())
            return
        ....
        ....
    }
}

Надеюсь, этот ответ вам поможет.

Если вы используете сбойную аналитику Firebase в своем проекте.Вы можете использовать этот метод там, где вам удобно. рекомендуется использовать его в onResume вашей активности, а затем показывать диалоговое окно для выхода из приложения. Я проверил это на эмуляторе Nox и все работало нормально. Однако в ходе моего исследования с этой целью я не нашел способа, охватывающего все случаи, когда пользователь всегда может использовать обходной путь для использования приложения.

      CommonUtils.isRooted()

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

Существует Safety Net Аттестационная API из услуг в Google Play, с помощью которого мы можем оценить устройство и определить, если она коренится / подделана.

Тем, кто хочет иметь дело с рутированным устройством, просмотрите мой ответ: /questions/15769359/kak-najti-rutovannoe-ustrojstvo-programmno/55211600#55211600

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