# android-su-without-dialog **Repository Path**: janksenhu/android-su-without-dialog ## Basic Information - **Project Name**: android-su-without-dialog - **Description**: android app 获取root权限,在root过的手机上,不弹出授权对话框 - **Primary Language**: Android - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 6 - **Forks**: 2 - **Created**: 2014-12-15 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##android-su-without-dialog是什么? android-su-without-dialog是一个能够自动获取root权限执行命令行的工具,是一个能够绕过“弹出授权对话”而不需要用户在UI上确认而能够获root权限的工具 ##android-su-without-dialog有哪些功能? * 项目有3个分支,v1.2--------;v.13--------;v1.4 * v1.3 分支里面的,runasroot命令,可以直接以root权限运行各种命里行 * v1.2 分支里面的run_root_shell运行命里的时候,会静默权限升级到root权限,再执行相关的命里,但是对小米m1等手机兼容性不够友好 * v1.4 分析里面的,su命里也是一个静默权限升级到root,不需要弹出授权对话框,不需要用户授权,就能自动获取root权限执行命令 ##android-su-without-dialog如何使用? * 使用场景:前提是手机已经root过了,但是是一个假root。 * adb shell的时候不能直接进入root,例如adb shell进入例如:shell@android:/data/local/tmp $ * 需要再执行一次su,才能进入#超级shell,或者android系统会弹出一个对话框,询问是否授予root权限,需要手动点击“确定” * 从libs/armeabi下载相关命令行文件,之后push到anroid手机上,修改相关权限就OK * 举例: * runasroot的用法,首先到[download runasroot](http://git.oschina.net/janksenhu/android-su-without-dialog/raw/v1.3/runasroot)下载,需要经过赋予权限,root用户组所有,可执行,拷贝到/system/bin,再切换到普通用户,然后就万事大吉,可以在普通shell里面执行需要root权限才能执行的命令
        $adb push runasroot /data/local/tmp/
        $adb shell
        shell@android:/data/local/tmp $ chmod 6777 runasroot
        shell@android:/data/local/tmp $ su
        shell@android:/data/local/tmp # chown 0:0 runasroot
        shell@android:/data/local/tmp # chmod 4755 runasroot
        shell@android:/data/local/tmp # mount -oremount,rw /dev/block/mmcblk0p15 /system
        shell@android:/data/local/tmp # cp ./runasroot /system/bin
        shell@android:/data/local/tmp $ runasroot "ls /data/data"
        Running the script 'ls /data/data' as root user...
        androidhwext
        com.android.backupconfirm
        com.android.bluetooth
    
以上的这种方法在PC的命令行里面$ adb shell "runasroot 'ls /data/data/'"执行命里行,以及在adb shell之后runasroot执行命里行也是没有问题的,但是在具体实际的操作过程中发现了一个问题 ```java Process ps =Runtime.getRuntime().exec("runasroot \"ls /data/data/\"") ps.waitFor() //以上的代码waitFor()是0,运行正常退出 ``` --- --- ```java Process ps =Runtime.getRuntime().exec("runasroot \"am dumpheap 3603 /data/local/tmp/1.hprof\"") ps.waitFor() //返回值1,运行异常,没有dump出进程的内存hprof文件 ``` * run_root_shell就是为了解决以上的问题,[下载run_root_shell](http://git.oschina.net/janksenhu/android-su-without-dialog/raw/v1.2/android_run_root_shell/libs/armeabi/run_root_shell),[下载device.db](http://git.oschina.net/janksenhu/android-su-without-dialog/raw/v1.2/android_run_root_shell/libs/armeabi/device.db) 通过命令行操作把以上的2个文件push到/data/local/tmp/目录底下,并修改权限
        $ adb push device.db /data/local/tmp
        $ adb push run_root_shell /data/local/tmp
        $ adb shell
        $ cd /data/local/tmp
        $ chmod 777 ./run_root_shell
        #这个过程有点长,需要给android的系统打补丁,有些手机的rom型号是不支持的
        $ ./run_root_shell
        hell@android:/data/local/tmp # ls /data/data
        androidhwext
        com.android.backupconfirm
        com.android.bluetooth
        com.android.browser
    
以上的这种方法相当于,在执行su和用户弹出UI界面给予root授权之间做了一个补丁,直接跳过了UI弹出对话框,而自动就获取root权限,这样做的好处是,在做自动化的时候例如:功能自动化,mttf等是没有人工参与的,那么静默获取root是必要的 再看run_root_shell执行命里行的java写法 ```java //需要remount android系统目录,把run_root_shell命令拷贝到/system/bin/目录底下,或者“/data/local/tmp/run_root_shell”也是可以的 Process process1 = Runtime.getRuntime().exec("run_root_shell"); DataOutputStream os = new DataOutputStream(process1.getOutputStream()); os.writeBytes("am dumpheap 3603 /data/local/tmp/1.hprof\n"); os.flush(); ``` --- * su,这个主要是为了既能满足java等语言的调用执行,又能对各种机型做比较好的兼容,而编译的一个su程序,只需要把[下载su](http://git.oschina.net/janksenhu/android-su-without-dialog/raw/v1.4/libs/armeabi/su)之后,push到/data/local/tmp,再移动到/system/bin,chmod 6777 /system/bin/su,替换掉系统里面原有的su即可,注:记得备份系统原有的su ##有问题反馈 在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流 * 邮件(janksen@foxmail.com) * QQ: 1983559851 ##关于作者 ```java /** * author:janksenhu * email:janksen@foxmail.com * QQ:19835595851 */ ```