Как предотвратить установку моего приложения на 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