SIM信息清理查看工具(重点在ROOT权限的利用)

2015-10-04(Sun) by chenjia.me

原理

通过查看/data/data/com.android.providers.telephony/databases/telephony.db这个数据库的信息来获取,需要ROOT权限,当然可以不需要ROOT权限进行内容查看,通过内容提供者来实现。

ROOT权限的利用

原以为网络上会有很多ROOT权限的利用代码,结果发现就那么几个,而且并不是很适用,因此做了一些总结。

通过调用su命令来获取ROOT权限

参考了一下网络上的代码进行改进的,并且対输出流的数据进行字符串编码。

public boolean RootCommand(String command)
{
    Process process = null;
    DataOutputStream os = null;
    //DataInputStream is = null;
    int result=-1;
    try
    {
        process = Runtime.getRuntime().exec("su");
        os = new DataOutputStream(process.getOutputStream());
        //is = new DataInputStream(process.getInputStream());
        BufferedReader is = new BufferedReader(new InputStreamReader(process.getInputStream()));
        os.writeBytes(command);
        os.flush();
        os.writeBytes("exit\n");
        os.flush();
        String line="";
        string="";
        while((line=is.readLine())!=null){
            Log.i("is out---","2134"+line);
            string+=line+"\n";
        }
        process.waitFor();
        result = process.exitValue();
        Log.i("is out---",result+"");

    } catch (Exception e)
    {
        Log.d("*** DEBUG ***", "ROOT REE" + e.getMessage());
        return false;
    } finally
    {
        try
        {
            if (os != null)
            {
                os.close();
            }
            process.destroy();
        } catch (Exception e)
        {
            Log.d("*** DEBUG ***", "Root SUC-e ");
        }
    }
    if(result==0){
        //tv_out.setText(string);
        //tv_out.append("Success!/执行成功!");
        return true;
    }else{
        //tv_out.setText("Faild,No ROOT?/失败,请先给root权限? ");
        return false;
    }

}

这里说一些坑,希望大家可以注意到:

  1. 注意input流和output流的顺序,和我们平时使用的是相反的
  2. input流可以用BufferedReader来处理,这样可以解决中文乱码的错误
  3. process的处理目前我测试的只有在终端窗口的input功能,例如进入sqlite后可以执行一条select语句,但是并不能继续输入指令,比如.exit这样的指令让他退出,有更好的方法可以进行交流,建议大家都用单行指令进行。比如"sqlite3 /data/data/com.android.providers.telephony/databases/telephony.db 'select * from siminfo;' " + "\n"这样的命令。
  4. 每行结束都要有"\n"进行输入回车
  5. 大坑:请注意try,catch的路径以及process的返回值,这里涉及到很多部分,比如 用户没有root走的路线,用户有root权限但是没有给程序授权走的路线等等
  6. 返回值处理要得当,以及输入部分要多次测试,不然很有可能会导致自己程序FC。

重启命令ROOT执行

Runtime.getRuntime().exec(new String[]{"/system/bin/su","-c","reboot now"});

同样这块通过这样的runtime直接执行命令,这里一般是单行命令的执行,数组是用来输入空格的0.0~

程序部分

程序源代码:https://github.com/fashioncj/SimClearTool/

程序下载地址:https://github.com/fashioncj/SimClearTool/blob/master/app-release-unaligned.apk?raw=true


Comments