¿Cómo comprobar el acceso de root en android?
He creado un método para comprobar si el teléfono Android está enraizado o no. Esto se hace de la siguiente manera
public int checkrootcommand(String string) { // TODO Auto-generated method stub Process exec; try { exec = Runtime.getRuntime().exec(new String[]{"su","-c"}); final OutputStreamWriter out = new OutputStreamWriter(exec.getOutputStream()); out.write("exit"); out.flush(); Log.i(SUPER_USER_COMMAND, "su command executed successfully"); return 0; // returns zero when the command is executed successfully } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return 1; //returns one when the command execution fails }
Pero el problema es que el método checkrootcommand () se ejecuta primero funciona perfectamente, pero cuando el mismo método vuelve a llamarse la sesión del superusuario sigue funcionando. ¿Hay alguna manera de terminar la sesión de superusuario una vez que el método se ejecuta ??
No hay medios confiables para detectar una condición arraigada en un dispositivo donde las protecciones de hardware han sido superadas mediante la explotación de vulnerabilidades de software.
En el mejor de los casos puede detectar la presencia de determinados conjuntos de herramientas o buscar cosas que no se supone que están allí o cambios en los archivos que son – pero que requiere conocimiento de lo que una instalación dada debe ser similar, y asume que la funcionalidad del sistema operativo que está Utilizando para realizar las comprobaciones no se ha modificado para ocultar los cambios.
Para escanear de forma fiable, debe asegurarse de que el código de confianza se ejecuta a un nivel inferior al código no confiable; Un dispositivo enraizado es aquel donde esta garantía ha sido fundamentalmente roto, o donde el usuario final es de confianza más que usted el desarrollador.
Método 1: La aplicación solicita acceso a la raíz:
Agregue esto en su archivo de compilación de nivel de aplicación:
dependencies { compile 'eu.chainfire:libsuperuser:201501111220' }
Ahora,
System.out.println(Shell.Su.available()); //Outputs true if user-granted else false
Método 2: La aplicación no pide ROOT:
boolean deviceisRooted() { String[] filespaths = {"/system/app/Superuser.apk","/sbin/su", "/system/bin/su","/system/xbin/su"}; for (String xyz : filespaths) { if (new File(xyz).exists()) return true; } return false; } System.out.prinln(deviceisRooted()); //Outputs true if device is ROOTED else false //Doesn't asks user //Also returns true IF NOT PROPERLY ROOTED (But ROOTED somehow)
En su caso, debe eliminar el proceso después de ejecutarlo para el trabajo que se realiza antes de volver. Los siguientes cambios en su código deben hacer la cosa.
public int checkrootcommand(String string) { // TODO Auto-generated method stub Process exec = null; try { exec = Runtime.getRuntime().exec(new String[]{"su","-c"}); final OutputStreamWriter out = new OutputStreamWriter(exec.getOutputStream()); out.write("exit"); out.flush(); Log.i(SUPER_USER_COMMAND, "su command executed successfully"); return 0; // returns zero when the command is executed successfully } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if (exec != null) { try { exec.destroy(); } catch (Exception ignored) { } } } return 1; //returns one when the command execution fails }
Es posible que no pueda detectar universalmente si el teléfono está enraizado o no, pero debería poder solicitar y confirmar que su aplicación puede acceder a root ejecutando id como root, por ejemplo, su -c id
validar si el comando ejecutado correctamente y la salida Contiene uid=0
, es decir, el uid del usuario root .
Utilice este código:
Process executor = Runtime.getRuntime().exec("su -c ls /data/data"); executor.waitFor(); int iabd = executor.exitValue(); if(iabd != 0){ /*process exit value is not 0, so user is not root*/ }else{ /* user is root*/ }