做系统开发的过程中经常需要抓取一下只有system组才能拿到的信息,而这个时候一般用户使用的是user版本,问题又很难复现,这个时候刷机可能信息都没有了,所以产生了一个需求,在adb shell里面以system权限执行命令,下面提供了一个这个办法,前提是你拥有系统签名,我们开发一个程序,在AndroidManifest.xml里面配置systemuid
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:sharedUserId="android.uid.system"
xmlns:tools="http://schemas.android.com/tools">
然后在build.gradle里面加上系统签名
我们在MainActivity里面加上
java
try {
Runtime.getRuntime().exec("toybox nc -s 127.0.0.1 -p 1234 -L /system/bin/sh -l");
} catch (IOException e) {
throw new RuntimeException(e);
}
这段代码的作用,就是监听一个端口,执行命令
toybox nc
:使用Toybox工具集中的netcat
(网络工具)。-s 127.0.0.1
:绑定到本地回环地址,仅允许本地连接。-p 1234
:监听1234端口。-L
:持续监听模式(接受连接后保持运行,继续等待新连接)。/system/bin/sh -l
:连接建立后执行的命令(启动一个登录Shell)。
上述apk编译后放到安卓设备里面打开即可
然后我们进入adb shell,在里面执行
java
toybox nc 127.0.0.1 1234
运行后没有其他提示,输入whoami,可以看到当前已经是system用户组了,这个时候就可以执行一些操作了,例如查看和复制/data目录下等需要system用户权限的动作了

其实,如果你有系统签名,本身也可以写一个system权限的apk来获取你想要的信息,但是没有通过命令行交互来的这么方便
当然了,如果以root用户执行那段代码,然后nc打开这个端口,你就是root用户了