关于使用runtime执行root权限命令的问题

背景是这样的,有个客户手机中毒了,常规查杀失效,遂需要一个专杀,说白点就是定位恶意APK包,然后删除之,但是发现该病毒最终安装在了/system/priv_app目录下,该目录权限较高,要是root权限才能删除。

  最开始我想到找到apk的绝对路径,然后使用"su rm apk_path"一条命令应该就能搞定了,然而并不能,并没有报错或是异常,反正就是删不掉(弹出root授权窗口了),然后半天搞不定,组长还是老司机的,他想到了RootExplorer这个软件通杀所有,所以就找到一篇文章,发现它用的是如下手段:
try {  
    Process proc = pb.start();  
    //获取输入流,可以通过它获取SHELL的输出。  
    BufferedReader in = new BufferedReader(new InputStreamReader(proc.getInputStream()));  
    BufferedReader err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));  
    //获取输出流,可以通过它向SHELL发送命令。  
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(proc  
                    .getOutputStream())), true);  
    out.println("pwd");  
    out.println("su root");//执行这一句时会弹出对话框(以下程序要求授予最高权限...),要求用户确认。  
    out.println("cd /data/data");//这个目录在系统中要求有root权限才可以访问的。  
    out.println("ls -l");//这个命令如果能列出当前安装的APK的数据文件存放目录,就说明我们有了ROOT权限。  
    out.println("exit");  
    // proc.waitFor();  
    String line;  
    while ((line = in.readLine()) != null) {  
        System.out.println(line);  
    }  
    while ((line = err.readLine()) != null) {  
        System.out.println(line);  
    }  
    in.close();  
    out.close();  
    proc.destroy();  
} catch (Exception e) {  
    System.out.println("exception:" + e);  
}  
可以看出和常规的命令行执行不同,这里使用PrintWriter作为管道连接Process,然后用println方法向管道中传递命令,命令最终被Process接收并被执行(之所以能执行,注意使用的是println,这相当于print(cmd + "\n"),对了就是那个回车的效果)
其实之所以这样是因为,如果使用runtime().exec()来分条执行多个命令的话,多条命令实际上在执行的时候是在对个线程所执行的,命令1申请到了root权限,命令2就不行了,所以采用上面这种管道连接的方式来执行是比较好的解决办法。
然而发现还是删不掉,删不掉,删不掉。。。
不信邪,adb shell连上手机,直接cd到目录下,执行rm,尼玛,还是删不掉,但是暴露一个很关键的信息“read only”,可能是没挂载/system导致的
于是,在执行rm之前,加了一句"mount -o remount rw /system",搞定!

猜你喜欢

转载自blog.csdn.net/u014021893/article/details/67640557