本章节描述了android系统中常用的两种文件保护系统以及android中用到的linux伪文件系统。
OBB:Opaque Binary Blobs
谷歌商店里,会把apk限制在50MB以内,如果超过这个大小,则需要用户以OBB文件的形式提供最大不超过2GB的额外数据文件。
Opaque代表不透明,这表示OBB文件的数据格式由开发者决定(尽管在许多时候,它就是个vfat文件系统镜像),有volume守护进程来mount它。vold随后会调用linux内核中的device mapper。用loop(将文件系统中的镜像挂载为一个块设备,这里的loop是指循环挂载)参数进行mount操作。device mapper支持tow-fish算法,在发起OBB mount请求时,把秘钥传递给它。随后应用程序调用android.os.StorageManager中的mountOBB方法,来用指定的秘钥来mount OBB文件。这一过程如图所示(p75,图2-1)。
OBB虽然不透明,但是OBB文件中仍然有一些类型的元数据,这些数据能够被解析。解析OBB的代码位于/system/lib/libabdroidfw.so
中。OBB的文件元数据位于文件尾部,解析该元数据需要倒着解析。文件元数据中各个字段的含义如图(p76,图2-2)。
android源码树中有一个obbtool工具,这个工具是一个脚本,用来创建OBB文件。该脚本的处理流程如下:
- 这个脚本首先会创建一个空的vfat镜像,然后使用device mapper以loop参数mount它。
- mount之后,往里面添加文件。
- umount之后,会把数据再次写入vfat镜像。
除此之外,sdk中也提供了一个能创建和维护obb文件的jobb工具;再android开发框架中也有一个ObbScanner类,它能够获取obb文件中的基本元数据。
Asec(android secure storage)
它提供了一种能安全的安装到设备上的机制,它让用户没法将一台设备的应用拷贝到另一台设备上(也称为预先锁定)。asec的创建和管理都是由vold完成,vold
根据MountService
发来的指令,执行相关的操作。asec创建和mount都需要密钥,在asec容器被mount的时候,vold会使用内核中device mapper,用loop参数执行mount操作,并通过DM_TABLE_LOAD ioctl操作,把密钥传递给内核中的dm-crypt模块。
密钥本身会以明文的形式保存在/data/misc/systemkeys/AppsOnSD.sks
文件中。如果设备被root,则这个加密也会失去其木来的目的。
asec和obb这两种加密都是用了device mapper和它的文件加密功能(dm-crypt)创建和访问数据。asce实际上可以被视为obb的升级版,从加密存储应用的扩展文件,升级到加密存储的整个应用。
linux伪文件系统
伪文件系统所包含的文件都不会被存储在物理存储设备中,它们是直接由内核中的回调函数维护的。访问一个伪文件或目录时,某个对应的内核级处理函数就会被调用。因此这些伪文件的大小是没有意义的。
大多数伪文件都是以只读权限创建的,这些文件向用户态程序提供一种使之能够查看一些内核态中原本是不可访问的变量和结构体。少部分伪文件则是可写的,这些文件能够向用户态程序提供一种实时对内核中的数据施加影响的方法,就像注册表配置一样,且不用重启,但这些配置会因为系统的重启而丢失,在android系统中的init.rc脚本的重要功能就是保存这些配置。
FS | 对应目录 | |
---|---|---|
cgroupfs | androdi中只用来CPU计时和线程调度 | - |
debugfs | 用于输出内核级别的调试信息,mount -t debugfs none /sys/kernel/debug |
/d |
functionfs | 由内核提供一个通用的文件系统,让驱动能够通过用户态的形式进行配置 | /dev/usb-ffs/adb |
procfs | 提供一个机遇目录的观察系统中运行进程的方式 | /proc |
pstore | 抓取内核崩溃的数据 | /sys/fs/pstore |
selinuxfs | 存储了与安全策略相关的文件 | /sys/fs/selinux |
sysfs | linux 2.6以后作为补充而引入,比/proc更井井有条 | /sys |