Android 服务的安装目录

Install directory of Android service

我正在分析自定义 Android 设备。我尝试枚举系统中的服务 运行ning (adb shell service list),我发现有一个服务(我们称之为 MyService)我想更深入地分析。如果这是相关信息,它可能是特权(系统)服务。

当我 运行 adb shell service list | grep MyService 时,它 return 类似于 aaa.bbb.ccc.ddd.MyService。我想获得此服务的code/binary/APK。但是,当我 运行 adb shell pm path aaa.bbb.ccc.ddd.MyService 时,它 return 的错误代码为 1,并且不打印任何路径。当我执行 adb shell pm list packages | grep -i XXX 时会出现同样的情况,其中 XXXaaabbbcccddd 或 [=12= 中的任何一个](为了记录,aaabbb return 一些软件包,但它们与特定服务没有任何共同点)。

我的问题是:如何提取服务的code/binary/APK/...?我如何找到它的安装位置?

如果需要 root 权限,那应该不是问题。

我也是这个问题的新手,并且在探索 Android 内部结构时获得了一些乐趣。最终,我只能通过 /proc/sys VFS.

找到提供服务的进程 ID,以及与之相关的任何信息。

这是我的发现:

我的第一个发现是,dumpsys <SERVICE_SHORT_NAME> 可以连接到任何服务,并要求它转储其内部状态。但这并不总是包括该服务的包名或安装目录。我决定使用 strace 跟踪来自这个 dumpsys 程序的系统调用。但事实证明,IPC 是通过 strace 无法理解的非标准 /dev/binder 设备发生的:

$ su
# strace -f -y dumpsys telephony_ims | grep binder | tail 
openat(AT_FDCWD, "/dev/binder", O_RDWR|O_CLOEXEC) = 3</dev/binder>
ioctl(3</dev/binder>, BINDER_VERSION, 0x7fd88906b4) = 0
ioctl(3</dev/binder>, BINDER_SET_MAX_THREADS, 0x7fd88906a8) = 0
mmap(NULL, 1040384, PROT_READ, MAP_PRIVATE|MAP_NORESERVE, 3</dev/binder>, 0) = 0x7990b83000
ioctl(3</dev/binder>, BINDER_WRITE_READ, 0x7fd8890460) = 0
ioctl(3</dev/binder>, BINDER_WRITE_READ, 0x7fd8890110) = 0
[pid 15836] ioctl(3</dev/binder>, BINDER_WRITE_READ, 0x7990b7e8a0) = 0
[pid 15836] ioctl(3</dev/binder>, BINDER_WRITE_READ <unfinished ...>
[pid 15836] ioctl(3</dev/binder>, BINDER_THREAD_EXIT, 0) = 0

幸运的是,仍然有一种方法可以追踪这个活页夹设备内部发生的事情。在 的帮助下,我能够找到 pid 运行ning 任何服务。

我将以服务 telephony_ims 为例。

  • 请运行以root身份执行以下命令。
  • 首先,我们需要使用来自其他 Stack Overflow 页面的命令设置 Android Binder Tracing。
    • cd /sys/kernel/debug/tracing; echo > set_event; echo 1 > events/binder/enable; echo 1 > tracing_on
  • 然后,我们必须运行dumpsys,然后立即阅读跟踪日志。
    • 先决条件:我使用了 less 命令,该命令并非在所有 android 设备上都可用。如果您的 bash 找不到 less,那么您可以将结果转储到 SD 卡上的文件中,然后使用文本查看器打开它。
    • 运行 (cat /proc/uptime; dumpsys telephony_ims >/dev/null & echo $!; cat /proc/uptime; cat /sys/kernel/debug/trace | tail -n 1000) | less
  • 查看结果输出
    • 前三行是
      16682.46 92635.05
      20823
      16682.47 92635.12
      
    • 从第二行开始搜索20823,就是dumpsys的PID。 (第一行和第三行分别是开始时间戳,结束时间戳)
    • 发现 dumpsys 正在与 servicemanager 通话:
      dumpsys-20823 [006] .... 16682.479173: binder_transaction: transaction=10738057 dest_node=1 dest_proc=563  # more content afterwards, ignored. pid 563 is "servicemanager"
      # ... more lines ...
      servicemanager-563   [003] .... 16682.479283: binder_transaction: transaction=10738058 dest_node=0 dest_proc=20823 # more content afterwards, ignored.
      
      
    • 然后,原来dumpsys-20823启动了一个子进程,20827:
           dumpsys-20823 [004] .... 16682.479808: binder_return: cmd=0x7206 BR_TRANSACTION_COMPLETE
           dumpsys-20823 [004] .... 16682.479810: binder_transaction_received: transaction=10738061
           dumpsys-20823 [004] .... 16682.479811: binder_return: cmd=0x80407203 BR_REPLY
           dumpsys-20823 [004] .... 16682.479812: binder_read_done: ret=0
           dumpsys-20823 [004] .... 16682.479813: binder_ioctl_done: ret=0
           dumpsys-20827 [006] .... 16682.480058: binder_ioctl: cmd=0xc0306201 arg=0x780a5668a0
           dumpsys-20827 [006] .... 16682.480060: binder_command: cmd=0x40406300 BC_TRANSACTION
           dumpsys-20827 [006] .... 16682.480077: binder_transaction: transaction=10738063 dest_node=29113 dest_proc=2574 dest_thread=0 reply=0 flags=0x10 code=0x5f444d50
      
    • 最终,是这个子进程泄露了服务的 PID ("dest_proc=2574"):
      dumpsys-20827 [006] .... 16682.480077: binder_transaction: transaction=10738063 dest_node=29113 dest_proc=2574 dest_thread=0 reply=0 flags=0x10 code=0x5f444d50
      
  • 查看此进程的包名/相关的 jar 和 apk
    $ ps -A | grep 2574
    radio          2574    875 14414052 120280 SyS_epoll_wait     0 S com.android.phone
    $ ls -l /proc/2574/fd | egrep 'apk|jar' | head
    lr-x------ 1 root root 64 2020-12-15 13:42 10 -> /apex/com.android.art/javalib/bouncycastle.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 102 -> /system/app/Stk/Stk.apk
    lr-x------ 1 root root 64 2020-12-15 13:42 11 -> /apex/com.android.art/javalib/apache-xml.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 12 -> /system/framework/framework.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 13 -> /system/framework/ext.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 14 -> /system/framework/telephony-common.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 15 -> /system/framework/voip-common.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 16 -> /system/framework/ims-common.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 18 -> /system/framework/framework-atb-backward-compatibility.jar
    lr-x------ 1 root root 64 2020-12-15 13:42 19 -> /apex/com.android.conscrypt/javalib/conscrypt.jar