ADB,全称 Android Debug Bridge,即 Android 调试桥,是一个对 Android 开发人员和测试人员都必不可少的工具。adb 包含在 Android SDK 平台工具软件包中。可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下。如果需要独立的 Android SDK 平台工具软件包,请点击此处进行下载

关于 adb 的详细用法,无论是 Android 官方站点还是其他博客已经有相当细致的描述,可以参考如下文章 。本篇博客是总结笔者在安全测试中,常用的 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命令)

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 count:重复启动 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 设备。支持 LinuxWindowsmacOS。在最新版 Android 系统上(API 30:Android 11)还支持 音频转发

安全测试常用 ADB 命令-LMLPHP

QtScrcpy

QtScrcpy 可以通过 USB / 网络连接 Android 设备,并进行显示和控制。无需root权限。也支持 LinuxWindowsmacOS。与 scrcpy 最大的不同之处在于,QtScrcpy 支持自定义按键映射

安全测试常用 ADB 命令-LMLPHP

Android Device Monitor

Android SDK 提供的工具,用于查看Android 系统资源、APP 以及文件系统操作等。个人觉得挺好用,但是 Android Device Monitor 已在 Android Studio 3.1 中弃用,并已从 Android Studio 3.2 中移除

安全测试常用 ADB 命令-LMLPHP
当然还有更多工具,不一一列举,绝大部分 Android 安全测试工具都会用到 ADB,这里只是列举了完全利用 ADB 实现的工具。

总结

ADB 是 Android 提供的原生工具,其实是一个功能强大的工具集,包含各个子二进制,分布在 Android 文件系统的各个位置。普通开发既可以利用 ADB 进行常规调试和测试,渗透人员也可以利用 ADB 进行安全测试。了解常用的 ADB 命令是 Android 安全测试必不可少的基本技能。我们在这里只是阐述安全相关的一些测试命令,如果想了解更多,可以参考文章开头提到的官方和三方手册。

05-29 07:01