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
时会出现同样的情况,其中 XXX
是 aaa
、bbb
、ccc
、ddd
或 [=12= 中的任何一个](为了记录,aaa
和 bbb
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
我正在分析自定义 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
时会出现同样的情况,其中 XXX
是 aaa
、bbb
、ccc
、ddd
或 [=12= 中的任何一个](为了记录,aaa
和 bbb
return 一些软件包,但它们与特定服务没有任何共同点)。
我的问题是:如何提取服务的code/binary/APK/...?我如何找到它的安装位置?
如果需要 root 权限,那应该不是问题。
我也是这个问题的新手,并且在探索 Android 内部结构时获得了一些乐趣。最终,我只能通过 /proc
和 /sys
VFS.
这是我的发现:
我的第一个发现是,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
幸运的是,仍然有一种方法可以追踪这个活页夹设备内部发生的事情。在
我将以服务 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