KMnO4y_Fish's Blog

返回

[基础预科] ADB、Android 终端、Android 用户权限Blur image

Android 是一个相对开放的系统,有着许多隐藏的可能性等待挖掘。

ADB ADB 全称 Android Debug Bridge,即安卓调试桥。使用 ADB,可以用电脑进行文件传输、应用安装(无需手机端反复点击确认)、执行终端命令等操作。【Android 官方的 ADB 文档】

Android 终端 Android 基于 Linux 系统的内核,因此继承了 Linux 的终端。使用终端命令,可以进行修改分辨率、禁用/启用应用(包括系统应用)、打开应用隐藏页面等操作。利用终端还可以像在 Linux 上一样进行编程。终端可以使用 ADB 访问,也可以用“终端模拟器”应用访问。【一款终端模拟器】

Android 用户权限 Android 终端中有一些操作,例如禁用/启用应用,只能由 ADB 终端执行,而不能由“终端模拟器”应用执行,这是因为每个应用以独立的用户身份运行(尽管这个说法并不严谨),而 ADB 终端以 shell 用户身份运行。Root 权限是对 Linux 系统的最高访问权,但出于安全性考虑,安卓系统中的用户无法直接使用 Root 权限。

本文将介绍关于 ADB、Android 终端和 Android 用户权限的基础知识。所有 PC 上进行的操作以 Windows 系统为例。

ADB 下载与安装#

ADB 不是 Windows 系统内置软件,需要自行安装才能使用。

1. 下载正确的 platform-tools。【platform-tools 官方下载】

2. 将压缩包解压至适当的文件夹,并将其设置为 Path。【搜索“设置为 Path”】

3. 打开命令行界面,输入 adb version。若正常显示 ADB 版本,说明安装已经完成。

Microsoft Windows [版本 10.0.22509.1000]
(c) Microsoft Corporation。保留所有权利。

C:\Users\[redacted]>adb version
Android Debug Bridge version 1.0.41
Version 31.0.3-7562133
Installed as D:\android_sdk\platform-tools\adb.exe

C:\Users\[redacted]>
plain

ADB 连接真机#

ADB 连接,即 USB 调试是开发专用的功能,Android 中默认不开启。

启用开发者选项#

1. 在设置中进入“关于设备”。

2. 连续点击“版本号”一项 7 次。

点击版本号

3. 在设置中找到新增的“开发者选项”,并进入。

开发者选项的位置

开启 USB 调试#

4. 打开“开发者设置”。

5. 找到“调试”分类目录,打开 USB 调试。

USB 调试选项的位置

连接到电脑#

6. 将设备在开机状态下用 USB 数据线连接至电脑。

7. 若设备使用“仅充电”模式连接(此状态提示会出现在通知栏中),请改用其他模式,然后拔下设备重新插入。

8. 打开命令行界面,输入 adb devices。此时移动设备上将显示 USB 调试授权窗口。点击“确认”。

C:\Users\[redacted]>adb devices
List of devices attached
0123456789ABCDEF        unauthorized
plain

调试授权窗口

9. 再次执行 adb devices。设备状态显示为 device,则连接成功。

C:\Users\yezhiyi9670>adb devices
List of devices attached
0123456789ABCDEF        device
plain

ADB 连接模拟器#

正常情况下,模拟器会使用内置的 adb 程序自动完成连接,连接后使用方法与真机一致。但若模拟器内置 adb 与用户安装的 adb 版本不兼容,则无法进行调试操作。

将模拟器的内置 adb 替换为新版#

1. 找到自己安装的(或 Android SDK 中的)adb.exe。

2. 打开模拟器安装目录,找到其中的 adb.exe。用自己的 adb.exe 将其替换。

ADB 常见命令#

多设备访问#

ADB 一次命令只能操作一个设备。若有多个设备连接至 ADB(实际使用时尽量避免这种情况),则执行命令时必须指定设备。

要指定设备,应当添加 -s <设备序列号> 参数。设备序列号即为 adb devices 命令中看到的名称。例如,命令 adb install com.android.chrome.apk 应当改为 adb -s 0123456789ABCDEF install com.android.chrome.apk

下文的操作不再考虑多个设备连接至 ADB 的情况。

重启设备#

使用命令 adb reboot 可以立即重启设备。

  • adb reboot 正常重启。
  • adb reboot recovery 重启进入 recovery,此模式用于进行系统更新,也可用来刷入官方刷机包修复受损的系统。
    通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。
  • adb reboot bootloader 重启进入 fastboot 模式,此模式用于刷入自定义镜像。
    通常,也可以通过关机状态下长按电源+音量上(若有实体 HOME 键,可能也需要按)进入。

关于启动模式的介绍

访问终端#

命令 adb shell 可以以 shell 身份(权限)打开 Android 系统的终端。adb shell <命令> 将立即执行命令并退出终端。

安装应用#

使用命令 adb install <apk软件包路径> 安装软件。大多数设备中,这会直接安装软件,不需要用户确认;少数设备需要用户选择是否允许安装。

卸载应用#

使用命令 adb uninstall <软件包名> 即可卸载软件。

使用 adb uninstall -k <软件包名> 会保留数据。若需要重新安装该软件,则新的安装包必须满足覆盖安装条件(应用签名一致,版本相同或更新),否则无法安装。若要清除数据和覆盖安装条件,使用 adb shell pm clear <软件包名>

Root 模式(仅限模拟器)#

命令 adb root 可以使 ADB 命令直接以 root 身份执行,此时可以执行 adb remount 等操作,且 adb shell 会默认以 root 身份运行。adb unroot 可以撤销。

这是非常不安全的,故生产环境下的设备不能使用,即使设备已经获取 Root 权限。

挂载系统分区为可读写(仅限模拟器)#

系统文件分区默认为只读挂载,无法修改。

Root 模式下,命令 adb remount 将暂时挂载 /system 系统分区为可读写,这样可以修改系统文件。

等效的 Android 终端命令为 remount -o rw,remount /system

传递文件#

传入文件:adb push <Windows 上的文件或文件夹> <Android 上的目标目录>

仅传入修改日期更晚的文件:adb push --sync <Windows 上的文件或文件夹> <Android 上的目标目录>

取出文件:adb pull <Android 上的文件或文件夹> <Windows 上的目标目录>

注意,Android 内置存储器的路径是 /storage/emulated/0/(或简写 /sdcard/)。此命令也能操作内置存储器以外的文件。

备份还原#

使用命令 adb backup <package> 可以将应用的数据备份到电脑。

使用 adb restore <package> 可以还原备份。

注意这两个命令执行后,需要在移动设备上确认。

应用数据内带有签名验证,因此应用的签名必须一致,数据才能够还原。并不能在破解游戏后通过这种方法恢复进度。

使用 Android 终端#

进入终端#

设备已连接 ADB 的情况下,在 Windows 端命令行界面输入 adb shell,即可进入终端。

C:\Users\[redacted]>adb shell
shell@m2:/ $
plain

在 Android 系统下,可以通过“终端模拟器”应用访问终端。【一款终端模拟器】

u0_a64@m2:/ $
plain

需要注意,这两种方式进入的终端是相同的,但能执行的操作却不一样。这是因为 adb shell 进入终端,终端以 shell 身份权限打开;终端模拟器进入终端,终端以应用本身的身份(u0_a64)打开。shell 权限对设备的访问权更高,而应用本身则不能执行大部分常用命令。

基本初等命令#

使用终端,可以完成基础的文件操作。【搜索“Linux 终端入门”】

命令用途
cd <dir>切换到目录
exitCtrl-D,退出终端
rm <-rf> <filename>删除文件,参数 r 允许删除目录,参数 f 强制
cat <filename>输出文本文件的内容(不是文本文件也行,随便)
mkdir <dirname>创建文件夹
mv <old-path> <new-path>重命名,或同分区内文件移动
cp <old-path> <new-path>复制
ls <-la> [<dir>]列出目录内文件,默认为当前目录
chmod <mode> <filename>修改文件的权限
chown <mode> <filename>修改文件的所有者
组合符号用途
<command> & <command>同时执行命令
<command> && <command>顺序执行直到出现返回值不为 0 为止
<command> > <filename>执行结果输出到文件
<command> < <filename>文件作标准输入
<command> | <command>执行多个命令,无论返回值,并将前一个的输出作为下一个的输入

软件包管理器 - pm#

pm 命令用于管理系统上已经安装的软件包。

包名是系统中软件包的唯一标识符。系统设置的“应用”页面一般不会显示包名,可以使用幸运破解器等软件查看包名。【幸运破解器 下载】 幸运破解器 × 应用工具箱 √

命令用途
pm list packages列出所有软件包名
pm list packages -s列出系统内置软件包名
pm list packages -3列出用户安装的软件包名
pm install <filename>安装 APK 文件
pm uninstall <package>卸载软件
pm uninstall -k <package>卸载软件但保留数据,重新安装的软件必须满足覆盖安装条件
pm clear <package>清除软件数据(若软件包已卸载,同时移除覆盖安装条件)
pm uninstall --user 0 <package>为默认用户卸载,可以卸载系统内置软件
pm hide <package>禁用应用[仅 6 及以下]
pm disable-user <package>禁用应用[仅 7 及以上]
pm unhide <package>启用应用[仅 6 及以下]
pm enable <package>启用应用[仅 7 及以上]
pm path <package>获取应用在系统内的 APK 路径

注:所谓“系统内置”,不是“系统预装”,而是指不能卸载的系统预装应用。

显示(窗口)管理器 - wm#

使用 wm 命令,可以为设备设置自定义分辨率和 DPI(DPI 相当于 Windows 的缩放比例)。

命令用途
wm size查看当前分辨率
wm size <width>x<height>设置分辨率
wm size reset重置默认分辨率
wm density查看当前 DPI
wm density <dpi>设置 DPI
wm density reset重置 DPI

在终端模拟器中获取 shell 权限#

终端模拟器打开的终端使用的是应用的身份,而非 shell 身份。这导致很多命令(例如 pm wm)不能执行。

若要不借助电脑执行这些命令,则需要找到在终端模拟器中获取 shell 权限的方法。

此处介绍的方法仅有少数设备能成功。

1. 打开 USB 调试,断开与电脑的连接,然后重启设备。

2. 在终端模拟器中输入 adb shell。(若系统内没有 ADB,可以尝试使用 Termux 终端模拟器,然后执行 pkg install android-tools

3. 系统应当弹出授权窗口。尽快点击“确定”,几秒后,具有 shell 权限的终端将会打开。

Shell、Root 和应用权限#

Root 权限#

Android 基于 Linux 内核,Root 权限就是 Linux 中对系统的最高访问权。为保证基本的安全性,Android 系统不对用户开放这一权限。通过漏洞或刷机获得这一权限的过程称为“Root”。

获取到 Root 权限的应用几乎无所不能,因此,Root 权限也常常被称为“超级用户”权限(Superuser Access)。按通常的方案获得 Root 权限后,申请 Root 权限的终端命令也因此称为 su

通常,获取 Root 权限有三类手段:

  • 漏洞破解。通常,一键 Root 软件以这种方式工作。如今,这种方式比较难成功。
  • 开启 Root。部分设备制造商会内置 Root 权限,并允许用户自行按需要启用。
  • 刷机修改。这种方法具有理论可行性,是公认的“通解通法”,也这是目前的主流方法。这种方法需要设备制造商允许刷机。

此处不赘述获得 Root 权限的具体方法。

Shell 权限#

使用 ADB 打开的终端具有 Shell 权限。Shell 权限能够操作 Android 中大多数命令,但限制仍然较多,不能修改系统文件,也无法访问应用的数据。

在具有 shell 权限的终端下,可以执行 run-as <package>(目标应用包必须被指定为“可调试”)。执行后,终端仍然以 shell 身份运行,并且会被额外授予对该应用数据的访问权(还会自动帮你切到应用的数据目录)。这对游戏破解等工作的帮助较大。

应用权限#

系统内应用及其打开的终端将具有应用本身的权限。应用权限受到严格限制(显然受 Android 权限管理限制),无法执行大多数终端命令。但是,应用可以访问自己的数据文件。

封面图来自网络,未经明确授权。
[基础预科] ADB、Android 终端、Android 用户权限
https://ak-ioi.com/blog/play-android/preintro-adb
作者 KMnO4y_Fish
发布于 2021年12月18日
评论似乎无法加载。试试刷新?✨