在Android中dev/binder
也是为层级通信负责的。可以收听消息吗?我知道它们必须被解码,但是我怎样才能得到这些消息。例如,如果一个应用程序发送一条消息成为一个地理位置。我的安卓设备上也有根。
5 回答
Short:不,这不应该是可能的,即使是 root 也是如此。
网上没有太多关于 Binder 的详细信息,但有一些信息,尤其是关于安全性的信息。请参阅此处或此处的第 3.8 点。您还可以阅读内核驱动程序的源代码和openbinder的源代码。
为什么一次又一次地,错误的答案被批准为正确的答案?
Jtrace - 不要与 bin 转储混淆 - 不需要对 Android 进行任何修改。它可以窥探活页夹消息 - 限制条件是您必须 jtrace'ing 端点之一。
Bindump 使用 debugfs,但只显示端点。@Adrian - 恐怕你得出了错误的结论。
Jtrace 捕获进出的系统调用 - 然后通过检查进程内存(使用 ptrace(2))来解析绑定消息。如果你的内核中有 ptrace(2)(你这样做了,因为 debugserver 愚蠢地需要它)并且你是 root,你可以窥探消息。再次 - 你必须在一个端点上。
而@Luminger - 在他的主题上 - 仅仅因为找不到信息,并不意味着没有信息。NewAndroidBook.com 上有很多关于 Binder 的信息 - 除了这本书,请查看 Binder 演示链接。
您可以使用此版本的 strace 解码过去的大多数 Binder 事务:https ://github.com/adetaylor/strace-android/tree/android
它增强了对调用的解码,这些ioctl
调用是进程向 Binder 内核驱动程序发出请求的方式。确保您使用android
分支,否则您将无法从这些更改中受益。
您应该能够使用 NDK 独立工具链来构建它。请参阅docs/STANDALONE-TOOLCHAIN.html
Android NDK 文档。
如果您准备安装自定义内核,则 binder 驱动程序代码 ( drivers/staging/android/binder.c
) 具有非常好的调试功能,包括条件消息和可以打印 binder 事务的函数等。
binder_debug_mask
具体来说,通过使用以下枚举器的适当组合进行设置,您将在内核日志中获得各种调试消息:
BINDER_DEBUG_USER_ERROR
BINDER_DEBUG_FAILED_TRANSACTION
BINDER_DEBUG_DEAD_TRANSACTION
BINDER_DEBUG_OPEN_CLOSE
BINDER_DEBUG_DEAD_BINDER
BINDER_DEBUG_DEATH_NOTIFICATION
BINDER_DEBUG_READ_WRITE
BINDER_DEBUG_USER_REFS
BINDER_DEBUG_THREADS
BINDER_DEBUG_TRANSACTION
BINDER_DEBUG_TRANSACTION_COMPLETE
BINDER_DEBUG_FREE_BUFFER
BINDER_DEBUG_INTERNAL_REFS
BINDER_DEBUG_BUFFER_ALLOC
BINDER_DEBUG_PRIORITY_CAP
BINDER_DEBUG_BUFFER_ALLOC_ASYNC
您还可以在整个代码的关键位置散布print_binder_*
一些包含在战略位置的函数。binder.c
例如,print_binder_buffer()
或print_binder_transaction()
。您可能希望根据特定的 uid 或 pid 使这些成为有条件的,否则日志中会有很多内容。
@Adrian,其他开发人员/研究人员已经完成了一些很好的工作,因此您可以利用他们的结果。
首先,我建议看一看乔纳森·莱文(又名Technologeeks)的伟大著作,即他最近免费发布的关于Android内部原理的书,可以在该书的配套网站上访问:newandroidbook.com。从那里您将获得链接、描述和使用示例
- 绑定转储
那是
service
命令的简单派生,它获取所选系统服务的句柄,然后检查目录中自己的条目/sys/kernel/debug/binder/proc
。因为所有活页夹调试数据都是全球可读的,所以您也可以在无根设备上运行此工具。 - jtrace的增强版本
strace
,其优点之一strace
是活页夹消息解析(自动检测)。
由Opersys(与Karim Yaghmour合作)完成的另一项伟大的工作绝对值得关注和关注
- 活页夹资源管理器
此工具可用作应用程序,或与HTML GUI 一起使用,以实时显示连接的图形视图。