Android 沙箱修改

系列 - SystemSecurity

在前一篇文章中,我们已经介绍过系统服务,也了解过很多系统服务能够为上层App提供功能。在系统中除了AIDL编写的java层服务外,也存在着Native编写的service,截下来会一一进行解析。

Framework是一个中间层,它对接了底层实现,封装了复杂的内部逻辑,并提供供外部使用的接口。Framework层是应用程序开发的基础。

Binder Framework层分为C++和Java两个部分,为了达到功能的复用,中间通过JNI进行衔接。

Binder Framework的C++部分,头文件位于这个路径:/frameworks/native/include/binder/,实现位于这个路径:/frameworks/native/libs/binder/ 。Binder库最终会编译成一个动态链接库:libbinder.so,供其他进程链接使用。

为了便于说明,下文中我们将Binder Framework 的C++部分称之为libbinder。

libbinder中,将实现分为Proxy和Native两端。Proxy对应了上文提到的Client端,是服务对外提供的接口。而Native是服务实现的一端,对应了上文提到的Server端。类名中带有小写字母p的(例如BpInterface),就是指Proxy端。类名带有小写字母n的(例如BnInterface),就是指Native端。

Proxy代表了调用方,通常与服务的实现不在同一个进程,因此下文中,我们也称Proxy端为“远程”端。Native端是服务实现的自身,因此下文中,我们也称Native端为”本地“端。

这里,我们先对libbinder中的主要类做一个简要说明,了解一下它们的关系,然后再详细的讲解。

类名 说明
BpRefBase RefBase的子类,提供remote()方法获取远程Binder
IInterface Binder服务接口的基类,Binder服务通常需要同时提供本地接口和远程接口
BpInterface 远程接口的基类,远程接口是供客户端调用的接口集
BnInterface 本地接口的基类,本地接口是需要服务中真正实现的接口集
IBiner Binder对象的基类,BBinder和BpBinder都是这个类的子类
BpBinder 远程Binder,这个类提供transact方法来发送请求,BpXXX实现中会用到
BBinder 本地Binder,服务实现方的基类,提供了onTransact接口来接收请求
ProcessState 代表了使用Binder的进程
IPCThreadState 代表了使用Binder的线程,这个类中封装了与Binder驱动通信的逻辑
Parcel 在Binder上传递的数据的包装器

下图描述了这些类之间的关系:

另外说明一下,Binder服务的实现类(图中紫色部分)通常都会遵守下面的命名规则:

  • 服务的接口使用I字母作为前缀
  • 远程接口使用Bp作为前缀
  • 本地接口使用Bn作为前缀

/images/android-system-development/binder_middleware.png

以上的图就是Native Binder的核心。


  1. (23条消息) Android系统服务分析与Native Service实例_Tr0e的博客-CSDN博客 ↩︎

  2. 理解Android Binder机制(2/3):C++层 (paul.pub) ↩︎

  3. 原创]android 11 手动root笔记-Android安全-看雪论坛-安全社区|安全招聘|bbs.pediy.com ↩︎