Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ANDROID: How to gain root access in an Android application?

Tags:

java

android

root

I'm developing my first Android application, and I'm curious if there are any "standard" ways for executing privileged shell commands. I've only been able to find one way to do it, by executing su, and then appending my commands to stdin of the su process.

DataOutputStream pOut = new DataOutputStream(p.getOutputStream()); DataInputStream pIn = new DataInputStream(p.getInputStream());  String rv = "";  // su must exit before its output can be read pOut.writeBytes(cmd + "\nexit\n"); pOut.flush();  p.waitFor();  while (pIn.available() > 0)     rv += pIn.readLine() + "\n"; 

I've read about wrapping privileged (superuser) calls up in JNI: is this possible? If so, how would one go about accomplishing it? Other than that, are there any other ways of calling privileged instructions from Java?

like image 693
Emma Avatar asked Feb 05 '11 07:02

Emma


People also ask

How do I get root permission for Android app?

In most versions of Android, that goes like this: Head to Settings, tap Security, scroll down to Unknown Sources and toggle the switch to the on position. Now you can install KingoRoot. Then run the app, tap One Click Root, and cross your fingers. If all goes well, your device should be rooted within about 60 seconds.

What does it mean to gain root access?

Rooting is the process of allowing users of the Android mobile operating system to attain privileged control (known as root access) over various Android subsystems.


1 Answers

As far as I know, you can only run command-line commands using root privileges. You can use this generic class I made that wraps the root access in your code: http://muzikant-android.blogspot.com/2011/02/how-to-get-root-access-and-execute.html

All you need to do is extend this class and override the getCommandsToExecute method to return the commands you want to execute as root.

public abstract class ExecuteAsRootBase {    public static boolean canRunRootCommands()    {       boolean retval = false;       Process suProcess;        try       {          suProcess = Runtime.getRuntime().exec("su");           DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());          DataInputStream osRes = new DataInputStream(suProcess.getInputStream());           if (null != os && null != osRes)          {             // Getting the id of the current user to check if this is root             os.writeBytes("id\n");             os.flush();              String currUid = osRes.readLine();             boolean exitSu = false;             if (null == currUid)             {                retval = false;                exitSu = false;                Log.d("ROOT", "Can't get root access or denied by user");             }             else if (true == currUid.contains("uid=0"))             {                retval = true;                exitSu = true;                Log.d("ROOT", "Root access granted");             }             else             {                retval = false;                exitSu = true;                Log.d("ROOT", "Root access rejected: " + currUid);             }              if (exitSu)             {                os.writeBytes("exit\n");                os.flush();             }          }       }       catch (Exception e)       {          // Can't get root !          // Probably broken pipe exception on trying to write to output stream (os) after su failed, meaning that the device is not rooted           retval = false;          Log.d("ROOT", "Root access rejected [" + e.getClass().getName() + "] : " + e.getMessage());       }        return retval;    }     public final boolean execute()    {       boolean retval = false;        try       {          ArrayList<String> commands = getCommandsToExecute();          if (null != commands && commands.size() > 0)          {             Process suProcess = Runtime.getRuntime().exec("su");              DataOutputStream os = new DataOutputStream(suProcess.getOutputStream());              // Execute commands that require root access             for (String currCommand : commands)             {                os.writeBytes(currCommand + "\n");                os.flush();             }              os.writeBytes("exit\n");             os.flush();              try             {                int suProcessRetval = suProcess.waitFor();                if (255 != suProcessRetval)                {                   // Root access granted                   retval = true;                }                else                {                   // Root access denied                   retval = false;                }             }             catch (Exception ex)             {                Log.e("ROOT", "Error executing root action", ex);             }          }       }       catch (IOException ex)       {          Log.w("ROOT", "Can't get root access", ex);       }       catch (SecurityException ex)       {          Log.w("ROOT", "Can't get root access", ex);       }       catch (Exception ex)       {          Log.w("ROOT", "Error executing internal operation", ex);       }        return retval;    }    protected abstract ArrayList<String> getCommandsToExecute(); } 
like image 126
Muzikant Avatar answered Sep 22 '22 04:09

Muzikant