Android 如何收听dev/binder?

Android 如何收听dev/binder?,android,android-source,android-binder,Android,Android Source,Android Binder,在安卓系统中,dev/binder也负责层间通信。可以听留言吗?我知道,他们必须解码比,但我如何才能得到这个消息。例如,如果应用程序向地理位置发送消息。我的android设备上也有root用户。Short:不,即使有root用户,也不可能 网上关于Binder的详细信息不多,但有一些,特别是关于安全性的。指或。您还可以阅读内核驱动程序的源代码和源代码。您可以使用此版本的strace解码大多数经过的绑定器事务: 它具有解码ioctl调用的增强功能,这些调用是进程向Binder内核驱动程序发出请求的

在安卓系统中,dev/binder也负责层间通信。可以听留言吗?我知道,他们必须解码比,但我如何才能得到这个消息。例如,如果应用程序向地理位置发送消息。我的android设备上也有root用户。

Short:不,即使有root用户,也不可能


网上关于Binder的详细信息不多,但有一些,特别是关于安全性的。指或。您还可以阅读内核驱动程序的源代码和源代码。

您可以使用此版本的strace解码大多数经过的绑定器事务:

它具有解码
ioctl
调用的增强功能,这些调用是进程向Binder内核驱动程序发出请求的方式。确保您使用的是
android
分支,否则您将无法从这些更改中获益


您应该能够使用NDK独立工具链构建它。请参阅Android NDK文档中的
docs/STANDALONE-TOOLCHAIN.html

如果要安装自定义内核,绑定驱动程序代码(
drivers/staging/Android/binder.c
)具有相当好的调试功能,包括条件消息和可以打印绑定事务的函数等

具体来说,通过使用以下枚举数的适当组合设置
binder\u debug\u 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

您还可以将
binder.c
中包含的一些
print\u binder.*
功能散布在整个代码的战略位置。例如,
print\u binder\u buffer()
print\u binder\u transaction()
。您可能希望根据特定的uid或pid设置这些条件,因为否则会有很多东西从日志中飞过。

@Adrian,其他开发人员/研究人员已经做了一些很好的工作,因此您可以利用他们的结果

首先,我建议大家看看乔纳森·莱文(Jonathan Levin,又名Jonathan Levin)的伟大作品,即他关于安卓系统内部结构的书,这本书最近变得免费,可以在该书的配套网站上访问:。从那里你可以得到链接、描述和使用示例

  • 这是
    服务
    命令的简单派生,该命令获取所选系统服务的句柄,然后检查
    /sys/kernel/debug/binder/proc
    目录中自己的条目。因为所有绑定器调试数据都是世界可读的,所以您也可以在无根设备上运行此工具

  • ,是
    strace
    的扩充版,它比
    strace
    的优点之一是 活页夹消息解析(自动检测)

(与Karim Yaghmour一起)完成的另一项伟大的工作绝对值得注意和观看

  • 此工具作为应用程序使用,或与HTML GUI一起使用,以实时显示连接的图形视图


为什么一次又一次地,错误的答案会被认为是正确的

Jtrace——不要与bin dump混淆——不需要对Android进行任何修改。它可以窥探活页夹消息,但有一个限制,即你必须在其中一个端点上进行jtrace

Bindump使用debugfs,但它只显示端点@阿德里安-恐怕你得出了错误的结论

Jtrace捕获进入和退出的sys调用,然后通过检查进程内存(使用ptrace(2))解析绑定器消息。如果您的内核中有ptrace(2)(您这样做,因为debugserver愚蠢地需要它),并且您是root用户,那么您可以窥探消息。同样,您必须位于端点上


而@Luminger——当他谈到这个话题时——仅仅因为找不到信息,并不意味着没有信息。NewAndroidBook.com上有很多关于活页夹的信息——除了书之外,还可以查看活页夹演示链接。

谢谢。这很有趣。但是你能告诉我是什么原因吗。我只想听听应用程序发送给binder的内容(字节码)。可能是strace之类的。它基本上和其他“个性化”的linux api一样工作。根据这里的userid/groupid,您将只看到允许您看到的内容。它只是有良好的访问控制,以确保一切都很好=)好的,我明白了。还有一个问题:看看应用程序和linux内核是如何相互通信的(如果我只看到通信的一小部分的话)。我可以用什么工具来做这件事?你可以用[strace]()看到大部分/所有东西。strace截取所有系统调用并打印结果和参数。@Luminger我读了3.8节,但没有看到哪一部分阻止了窥探活页夹。你能详细说明一下吗?很好,但不幸的是,我无法用NDK编译它,在修复了一系列编译器错误(头不匹配等)后,我留下了一个链接器错误,在这一点上我已经完成了。你有一个预构建的静态二进制文件吗?使用codesourcery toolchain做起来容易得多,没有标题修正等。我主要遵循以下说明:注意make dist是设置变量的地方,add
--host
,如果出现任何错误,请注释掉
陷阱
,以便轻松调试。我查看了jtrace,它似乎正是我想要的。但是这个家伙是如何在不改变绑定代码的情况下窥探绑定器消息的呢?我读了这个家伙的免费PDF,答案是他启用了debugfs,这实际上与重新编译libbinder的结果是一样的:“安全”的绑定器通信量被输出给所有人看。谢谢你的回答。它只是用来强调,如果不修改android,就不可能窥探binder。