SuDroid: Executando comando como super usuário (root) no Android

Android Hacker Super User RedRails

Implementação do sistema de sondagem de sinal

Para realizarmos um ping no Android precisamos executar chamadas em recursos do sistema através de métodos presentes no Java, já que esse recurso não está presente na API do sistema da Google. Um problema na realização dessa técnica para executar o PING é que ela necessita de permissões de super usuário para ser realizada em um

Para realizar um ping no java, podemos utilizar o método Runtime.getRuntime().exec(); que realiza uma chamada no sistema, permitindo executar comandos como se estivessemos no console do sistema operacional. O problema desse procedimento é que o executável ping (/system/bin/ping) está limitado para usuários normais (figura 1), essa limitação permite que o ping serja feito apenas em endereço local (figura 2). Dessa maneira necessitamos de acesso de super usuário para que possamos realizar o ping sem tal empecilho.

O processo de conceder acesso de super usuário (root) para um dispositivo é conhecido como rootear. um dispositivo rooteado (rooted) permite que usuários comuns executem ações de super usuário no dispositivo. Podemos rootear um dispositivo através de modificações no SO obtidas com por exemplos outros aplicativos que realizam esse processo.

Em nosso exemplo utilizaremos um aplicativo chamado Superuser (https://market.android.com/details?id=com.noshufou.android.su) para auxilio no gerenciamento de permissões do Android

Abaixo a descrição da classe necessária para execução como super usuário.

[java]

package br.com.redrails;
/*
* Luiz Carvalho
* @LuizCarvalho
* luizcarvalho@redrails.com.br
* www.redrails.com.br
* http://br.linkedin.com/in/luizkarvalho (recommend me)
* more in http://www.redrails.com.br/tags/QoV/
* */

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;

public class SuDroid {
// private static final String TAG = "sudroid";

public String success_msg = null;
public String error_msg = null;
public Boolean success = false;

public SuDroid(String command) {
Process proc = run(command);

try {

if (proc.waitFor() == 0)
success = true;

success_msg = getResult(proc.getInputStream());
error_msg = getResult(proc.getErrorStream());

} catch (InterruptedException ex) {
success = false;
print("Error in execute command: " + ex.toString());
} catch (NullPointerException ex) {
success = false;
print("Error in execute command: " + ex.toString());
}

}

public String result() {
return "";
}

public Process run(String command) {
Process proc = null;
try {
proc = Runtime.getRuntime().exec("sudo");
DataOutputStream dataProc = new DataOutputStream(proc.getOutputStream());
dataProc.writeBytes("exec " + command + "\n");
dataProc.flush();
} catch (Exception ex) {
print(ex.getMessage());
success = false;
proc = null;
}
return proc;
}

private String getResult(InputStream istream) {
String line = null;
StringBuffer result = new StringBuffer();
BufferedReader dataIstream = new BufferedReader(new InputStreamReader(
istream));

try {
while ((line = dataIstream.readLine()) != null) {
result.append(line + "\n");
}
dataIstream.close();
} catch (Exception ex) {
success = false;
print(ex.getMessage());
}

if (result != null) {
return result.toString();
} else
return null;

}

public void print(String msg) {
System.out.println(msg);
// Log.e(TAG, "A Error Occurred: " + e.toString());
}

}

[/java]