ADB,全称 Android Debug Bridge,即 Android 调试桥,是一个对 Android 开发人员和测试人员都必不可少的工具。adb 包含在 Android SDK 平台工具软件包中。可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/
下。如果需要独立的 Android SDK 平台工具软件包,请点击此处进行下载。
关于 adb 的详细用法,无论是 Android 官方站点还是其他博客已经有相当细致的描述,可以参考如下文章 。本篇博客是总结笔者在安全测试中,常用的 adb 命令。
- Android 调试桥 (adb) (官方文档,可能需要科学上网)
- ADB Usage Complete / ADB 用法大全
安全测试常用 ADB 命令
当前系统前台 Activity
用户当前的前台 Activity 即我们的栈顶 Activity
方法一
adb shell dumpsys activity activities | findstr mResumedActivity
方法二
adb shell dumpsys activity activities | grep mResumedActivity
输出
mCurrentFocus=Window{86c6209 u0 shengivictor.androidcomm/com.example.shengivictor.androidcomm.MainActivity}
系统运行的所有 Activity
命令
adb shell dumpsys activity | findstr Run
输出
Running activities (most recent first):
Run #0: ActivityRecord{8240a87 u0 shengivictor.androidcomm/com.example.shengivictor.androidcomm.MainActivity t577}
Running activities (most recent first):
Run #0: ActivityRecord{84a6505 u0 com.huawei.android.launcher/.unihome.UniHomeLauncher t1}
Running activities (most recent first):
Run #0: ActivityRecord{8240b83 u0 com.huawei.health/.MainActivity t581}
APK 安装路径
命令
adb shell pm path shengivictor.androidcomm
输出
package:/data/app/shengivictor.androidcomm-40RDkYJdHTo3JwTI8ohknA==/base.apk
应用安装文件目录说明
/system/app
存放 rom 本身附带的软件即系统软件;/system/priv-app
存放手机厂商定制系统的系统级应用;/data/app
存放用户自行安装的软件
请注意,以上目录存放的都只是应用的安装数据,包括 apk 和相应的 lib 库文件,而非应用存储数据的文件。应用实际存储的数据,一般放在其私有目录下 /data/data/com.kugou.android
,只有 root 用户和 app 本身能够读写该目录。
/system/app
下的文件,普通用户无法自行卸载(利用 CVE-2022-20611 漏洞,普通用户可卸载系统应用),而 /data/app
下的文件,用户可以自行卸载。
有用的脚本:下载系统所有 APK 到本地
正在运行的 Services
命令
adb shell dumpsys activity services [<packagename>]
输出
Activity Resolver Table:
Non-Data Actions:
android.intent.action.MAIN:
5b4cba8 org.mazhuang.guanggoo/.SplashActivity filter 5ec9dcc
Action: "android.intent.action.MAIN"
Category: "android.intent.category.LAUNCHER"
AutoVerify=false
Registered ContentProviders:
org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider:
Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
#...
系统已定义的权限
命令
adb shell pm list permissions -f | grep -A4 ACCESS_NOTIFICATION_SERVICE
输出
+ permission:com.android.systemui.permission.ACCESS_NOTIFICATION_SERVICE
package:com.android.systemui
label:null
description:null
protectionLevel:signature|privileged
系统日志
命令
adb logcat [<option>]
输出
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action...}
注意:上述命令每次重新运行,都会打印以前所有缓存的日志,可以通过 -c
选项清除缓存日志
adb logcat -c
其他日志存放路径
/data/system/dropbox/
用于记录 Android 运行过程中,内核,系统进程,用户进程等出现严重问题时的 log/data/tombstone
存放 Native 层崩溃日志
系统信息
系统架构
adb shell getprop ro.product.cpu.abi
Android 版本
adb shell getprop ro.system.build.version.release
其实这些信息都可以在 /system/build.prop
文件看到。
与应用交互(传递 intent)
利用 ADB 可以很方便的与四大组件进行通信(am
命令)
command | 用途 |
---|---|
start [options] | 启动 指定的 Activity |
startservice [options] | 启动 指定的 Service |
broadcast [options] | 发送 指定的广播 |
force-stop | 停止 相关的进程 |
1.拉起应用(Activity)
# 拉起应用
adb shell am start -n com.tencent.mm/.ui.LauncherUI
# 停止应用
adb shell am com.tencent.mm
2.拉起服务
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
3.发送广播
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
4.参数讲解
start [options] intent
-D
:启用调试功能。-W
:等待启动完成。--start-profiler file
:启动性能剖析器并将结果发送至 file。-P file
:类似于 --start-profiler,但当应用进入空闲状态时剖析停止。-R coun
t:重复启动 Activity count 次。在每次重复前,将完成顶层 Activity。-S
:在启动 Activity 前,强行停止目标应用。--opengl-trace
:启用 OpenGL 函数的跟踪。--user user_id | current
:指定要作为哪个用户运行;如果未指定,则作为当前用户运行。
Intent
-a action
指定 intent 操作,如 android.intent.action.VIEW。只能声明一次。-d data_uri
指定 intent 数据 URI,如 content://contacts/people/1。只能声明一次。-t mime_type
指定 intent MIME 类型,如 image/png。只能声明一次。-c category
指定 intent 类别,如 android.intent.category.APP_CONTACTS。-n component
指定带有软件包名称前缀的组件名称以创建显式 intent,如 com.example.app/.ExampleActivity。-f flags
向 setFlags() 支持的 intent 添加标记。--esn extra_key
添加一个空 extra。URI intent 不支持此选项。--es extra_key extra_string_value
以键值对的形式添加字符串数据。--ez extra_key extra_boolean_value
以键值对的形式添加布尔值数据。--ei extra_key extra_int_value
以键值对的形式添加整数型数据。--el extra_key extra_long_value
以键值对的形式添加长整型数据。--ef extra_key extra_float_value
以键值对的形式添加浮点型数据。--eu extra_key extra_uri_value
以键值对的形式添加 URI 数据。
利用 ADB 的相关工具
scrcpy
scrcpy 通过 ADB 调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制 Android 设备。支持 Linux、Windows 和 macOS。在最新版 Android 系统上(API 30:Android 11)还支持 音频转发。
QtScrcpy
QtScrcpy 可以通过 USB / 网络连接 Android 设备,并进行显示和控制。无需root权限。也支持 Linux、Windows 和 macOS。与 scrcpy 最大的不同之处在于,QtScrcpy 支持自定义按键映射。
Android Device Monitor
Android SDK 提供的工具,用于查看Android 系统资源、APP 以及文件系统操作等。个人觉得挺好用,但是 Android Device Monitor 已在 Android Studio 3.1 中弃用,并已从 Android Studio 3.2 中移除。
当然还有更多工具,不一一列举,绝大部分 Android 安全测试工具都会用到 ADB,这里只是列举了完全利用 ADB 实现的工具。
总结
ADB 是 Android 提供的原生工具,其实是一个功能强大的工具集,包含各个子二进制,分布在 Android 文件系统的各个位置。普通开发既可以利用 ADB 进行常规调试和测试,渗透人员也可以利用 ADB 进行安全测试。了解常用的 ADB 命令是 Android 安全测试必不可少的基本技能。我们在这里只是阐述安全相关的一些测试命令,如果想了解更多,可以参考文章开头提到的官方和三方手册。