【读书笔记】Android安全机制解析与应用实践之源码分析

来源:互联网 发布:软件开发技术特点 编辑:程序博客网 时间:2024/06/05 02:46

由此可以看出,在应用层创建共享内存的步骤是

  1. MemoryFile类对象的创建
  2. 映射匿名共享内存,需要把共享内存设备文件映射到内存空间,映射成功后返回虚拟空间的起始地址,之后可以对共享内存进行读写操作
  3. MemoryFile类的读写操作方法
  4. MemoryFile的匿名共享内存读写操作
  5. 锁定和解除锁定,正在使用的时候锁定,不使用的时候解锁



Binder机制:Client和Server通过Binder驱动程序进行通信,Client和Server通过open方法和ioctl文件操作方法与Binder驱动程序进行通信

当Client向Server请求服务时,首先应向Server获取一个代理对象,该代理对象是在Client方建立的一个Server的代理,它具有并且能够行使Server的功能,然后Client通过调用代理对象的方式,向Server发送请求,代理对象将用户请求通过Binder驱动发送给Server进程,Server对用户请求进行处理,之后将返回结果通过Binder驱动传递给代理对象,最后代理对象将结果返回给Client





从内核角度分析Binder进程间通信:

如上图所示,进程A与进程B通信:

  1. 进程A调用open()方法打开Binder驱动获得设备描述符
  2. 进程A使用mmap获得一块虚拟内存空间
  3. 进程A发送数据时,进程A调用ioctl()方法对设备描述符进行操作将数据传给Binder驱动
  4. Binder驱动根据进程A传送的数据大小申请合适的物理内存并且将接收到的数据进行保存
  5. Binder驱动在进程B的虚拟内存空间中找到合适大小的虚拟内存
  6. 修改进程B的内存映射表,使这段虚拟内存映射到之前申请的物理内存
  7. 进程B可以通过这块虚拟内存空间访问进程A传送的数据,实现了进程A与进程B之间的通信





由图可知:HAL层的Binder Adapter对Binder驱动进行了屏蔽,使应用程序不必直接与Binder驱动进行交互

应用层面有IBinder,Binder(Client),Binder(Server)等类库



Binder中的CS交互实例分析:







解释一下:安卓系统启动之后,SS(Zygote启动的第一个子进程)会首先启动PMS,PMS是一个负责处理各种应用程序的安装,卸载,管理等工作的服务,PMS中的parsePackage函数会对AndroidManifest.xml文件进行解析,然后获取应用程序所申请的权限,然后根据申请的权限,授予应用程序相应权限的组ID,由于应用程序在安装的时候系统已经赋予了UID,这样一来,拥有UID和组ID(GID)的应用程序便可以正常启动。

应用程序在获得了组ID之后,调用AMS类的startProcessLocked方法来启动应用程序,该函数会创建一个ActivityThread,传入的参数包括UID和GID

最终内核层执行的是setgid函数和setuid函数




应用程序签名机制:

ROM签名:对整个Android系统包进行签名

APK签名:对单个应用进行签名

Android的apk实质上是jar包,签名采用的工具是signapk.jar




下面来解释这幅图:

 MANIFEST.MF文件:是对apk包中所有未签名的文件逐个用SHA1进行数字签名,再对数字签名用Base64编码,最后将编完码的签名写入MANIFEST.MF中。如果恶意程序改变了apk中的内容,那么进行apk安装校验的时候,改变后的摘要信息与MANIFEST.MF中的检验信息不同,应用程序便不能安装成功

CERT.SF文件:对 MANIFEST.MF进行私钥加密用SHA1-RSA算法,得到CERT.SF文件,RSA是一种非对称数字加密算法,私钥加密,公钥解密。

CERT.RSA文件:对 MANIFEST.MF进行公钥加密


Android的加密不能防止程序被恶意修改,只能检测出程序是否被修改过

1 0