基于SQLite3的Android手机
数据恢复技术的研究
王随刚吴莎莎李昂北京锐安科技有限公司
摘要:
针对传统方法采用直接调用API不能恢复Android手机数据的问题,本文通过分析手机SQLite3数据库的物理存储
结构,确定删除数据位置,并结合Android手机系统特征,详细阐述了Android手机文本信息数据恢复的过程。
关键词:
数据恢复SQLite3Android
一、概述
随着科技的发展,手机厂商不断推出新型手机,智能
手机已日渐成为主流。传统的Android手机取证技术,主
要通过调用Android厂商提供的API接口,完成数据的提
取,但这种方式无法提取已经删除的数据。对于涉及手机
取证的案件中,嫌疑人往往会将与案件相关的重要信息删
除,而这些数据却是跟踪案情进展的关键推动点。因此,
手机取证不仅要能获取手机中可见数据,还要获取手机中
已经删除的数据,这是司法人员关心取证的又一重要关键
点。
手机种类繁多,各种手机数据存储方式各有差异,诸
如iPhone、Android智能手机平台多存储在数据库中。
MTK、展讯等封闭式平台数据多存储在底层芯片flash文件
中。因此,不同手机平台数据提取和恢复机理也各不相
同。本文主要以基于SQLite3数据库的Android手机平台为
研究对象,介绍一种Android手机数据恢复的过程,为智能
4
2012年第5期
手机取证分析的研究提供相应的参考。
二、SQLite数据库
SQLite3是由D.RichardHipp开发的轻量级嵌入式数
SQL
据库,支持语句,是世界上应用最广泛的嵌入式数据
库之一。其具有的占用资源低、易移植、易操作等特点,
使之成为手机这种内存受限设备的数据库选择之一,
iPhone和Android手机即采用此数据库作为数据的存储方
式。Android系统在运行时,集成加载了SQLite3,因此手
机中每个应用程序都可以使用ite3数据库。
SQL
(一)SQLite3物理结构
数据库文件物理层由固定大小的“页(page)”组成,
所有的数据都存储在页中,每个page页有其相应的文件结
构 。 页 的 类 型 可 以 是Btree页 、 空 闲(free)页 或 溢 出
(overflow)页。一个SQLite3数据库文件由多个多重Btree构
成,其中,索引采用B-tree,而表数据采用B+tree。每个
Btree占用至少一个完整的页,每个页是Btree的一个结
智能手机取证技术研究
三、数据恢复过程
根据SQLite3数据库中删除数据的存储原理,可通过
从数据库物理存储结构中找到删除的数据进行提取。锐安
手机取证分析系统通过使用16进制编辑器查看Android手
机中对应的数据库文件,搜索数据库中各表的位置,从而
发现删除数据的存储区域。
具体数据恢复过程如图2所示。
点。每个表的第1个页称为根页。因此,对Btree页的文件
结构分析是找到删除数据位置的重要的前提。
Btree页逻辑结构形式如图1所示。
每一个逻辑结构的表,都对应Btree页组成的树形结
构,即每一个表由多个Btree页组成。Btree中根页和内部
页主要用于导航,其页的指针域都是指向下级页的指针,
数据域仅仅包含关键字,而所有的数据记录都存储在叶子
页中,包括删除的数据。因此,要找到表中删除的数据,
需找到其根页,采用顺藤摸瓜的方式,确定“叶子页”,
遍历叶子页中特定的区域提取删除的数据。
(二)手机SQLite3删除数据存储原理
手机中未删除的数据,通过查看相应数据库文件可直
接看到,但删除的手机数据,却无法看到。在SQLite3数据
库物理结构中,当一个事务从数据库中删除了数据并提交
后,若删除数据所在的页还存在其他数据,则删除数据的
部分只是变成一片自由区,其数据并未真正清除,且数据
库文件大小保持不变;若将整个页中所有的数据删除,则
该页将不存在,且数据库将变小。因此,当物理结构中,
页中存在的数据不被全部删除时,删除的数据依然存在于
数据存储区,也是所有数据的一部分。
在逻辑层,数据都存储在数据库的表结构中,而在物
理层,表是由Btree的树形结构构成,Btree树形结构又是
由页组成,因此最终数据是存放在各页中。
进行数据恢复,要解决两大核心问题。
第一:找到删除数据的页。
第二:恢复底层流文件中删除的数据。
恢复的过程如下:首先找到欲恢复的数据,对应在数
据库中的表名;然后根据SQLite3数据库存储结构,分析
物理层的数据流记录,获取SQLite3数据库各表的根页,
然后对相应的十六进制文件进行结构分析,提取各表存储
数据的结点;最后对目标叶子结点中特定区域存储的数据
进行恢复和提取,并于后台界面中展示出来。详细过程可
见下节。
四、数据恢复和提取过程
Android手机中,短信、通讯录、通话记录等文本信息
以数据库形式存储,而多媒体文件多是存放在SD卡中,与
数据库存储并无直接关系。因此,数据库存储机制的分析
只针对短信、通话记录、通信录等文本信息的恢复。
P
oliceechnology2012年第5期
T
5
(一)删除数据位置定位
1.查找预提取数据对应的表名
由于Android操作系统是开源的,因此很容易获取各
数据库中的表名。Android采用的SQLite3的数据库文件,
以.db为后缀名,查找手机中应用程序数据库中各表的方
法有多种,但前提条件是手机已经取得root权限。常用的
方法有:
(1)在手机端,直接进入文件管理器,进入data/
data/应用程序/database,打开相应数据库文件。
(2) 使 用adb命 令 , 如adbpull/data/data/com.
android.email/database,将相应数据库文件导入到计算
机中,再使用SQLite查看器,直接打开db文件,就可以
看到数据库的逻辑结构,常用的SQLite3查看器工具有
SQLiteDatabaseBrowser。
(3)从dos命令行查看手机的数据库文件。首先命
令 行 到Android虚 拟 机 所 在 路 径 的tools目 录 , 再 利 用
adb命 令 到Android虚 拟 机 目 录 , 数 据 库 文 件 在
data/data/包名/databases下,利用SQLite3db命令打开
数据库,最后,使用.schema命令查看数据库中的表。
2.查找表对应的树根页
应用程序数据库中存在多种表,要从底层数据存储
结 构 中 找 到 各 个 表 对 应 的 起 始 位 置 , 即 要映射找到
Btree页树形结构的根页,每个表的第一页即为根页。所
有表的根页编号都存储在系统表sqlite_master中,它是一
个 系 统 表 , 保 存 了 数 据 库 的schema信 息 。 在 创 建
sqlitemaster表的结构时,就确定了根页的地址。在前节
内容中,已经找到数据库中对应的各表的名称,因此,就
可根据对应数据库创建时的存储模式,找到各表对应
Btree页的根页。
_
3.查找树的所有结点页和叶子结点
Btree页的根页主要用于导航,找到下一结点,直到
找到所有叶子结点。要找到所有结点,首先对Btree的内
部页结构进行分析。
Btree页内部以单元为单位来组织数据,一个单元包
含一个Btree记录,或可认为是一个页面。
一般前8到12个字节是Btree的页头,它有相应的结
构,如表2。
B
由上可知,页头的第一个字节是区分内部页和叶子页
的重要标志,当页头第一个字节为05,那就是树的内部
表页,当为13,表示是树的叶子页,因此,很容易通过
Btree页的第一个偏移量,判断tree页的树形结构。可通
过第4个偏移量单元数,判断该页有多少条记录,若为内
部页,则单元数即表示子页的页数,若为叶子页,则单元
数即该叶子页中包含的记录数,且单元指针数组中包含
2个字节,分别指向最左边单元地址和最右边单元地址。
当从页头中,判断出有几个单元后,就可知道下一子页对
应的起始位置,再判断该页是内部结点还是叶结点,依次
循环执行以上过程了,直到找到所有的叶结点,即存储数
据的最终位置。
例如:用UltraEdit打开某一数据库文件,根据根页,
找到某页,其数据流文件如下:
0X05:该页为B+tree的内部页;0X0003:本页有
3个单元,即该内部页有三个子结点;0X03EE:单元内容
区 的 起 始 位 置 ,12个 字 节 后 ,0X03FA、0X03F4、
0X03EE分别指三个子结点对应的起始地址。
除去包含SQLite3数据库文件头的Btree页,即第一
其数据流文件为:
页,Btree页由以下四部分组成,如表1。
0X0D表明该页为B+tree的叶子页,0X0003表明有
3个 单 元 , 即3 条 记 录 , 且 第1条 记 录 的 入 口 地 址 为
0X0392,最后1条记录的入口地址为0X0090。依此方法
查找,即可查找叶子页中所有记录对应的位置,即所有数
据的存储位置,包括删除的数据。
6
2012年第5期
智能手机取证技术研究
对应有N个字段。紧跟的N个可变长整数与记录的各字段
一一对应,表示各字段的数据类型和长度,即表中每个字
段的类型以及该字段的长度。最后,DataN表示各字段对
应 的 数 据 , 与TypeN相 对 应 , 类 型 和 宽 度 由
Type1~TypeN指定。要提取freeblock块和未分配区的数
据,就必须确定该数据对应在表中的哪些字段中,从各字
段中提取数据。
例如:可根据Android手机中可见的数据,关联查找
freeblock块中的表的字段,即先确定freeblock块中表中
的某一个字段,再根据记录头分析这个字段的长度,以及
该字段前后的字段以及长度,然后提取出每个字段对应的
数据,再通过UTF8解码,解析为常见的手机数据,完成
数据的恢复。
经编码和解析后的数据,如图4所示。
五、总结
本文主要针对基于SQLite3数据库的数据恢复过程
进行分析,掌握SQLite3数据库的物理存储结构和内部
Btree页结构,找到底层存储的删除数据区域,通过分析
数据对应的记录结构,有效完成数据的恢复。该方法不
仅适用于数据的恢复,同样也可以提取手机中未删除的
数据,但由于其分析过程的复杂性,一般不采用此方法
获取手机中未删除的数据。本文虽然是以Android为研究
对象,但SQLite3数据库也应用于其它智能手机,因此,
此种方法也为其它基于SQLite3的手机数据恢复提供了参
考。
参考文献
(二)删除数据提取
当确定一个表的所有叶子页后,就可以根据叶子页的
记录找到存储在该表中的所有数据。然后,就需要通过一
定的方法将删除的数据从叶子页中提取出来。
根据Btree页的页面结构,所有的数据都存放在单元
内容区,如图3所示。
根据SQLite3数据库存储原理,当删除某条数据后,
内 容 存 储 区 对 应 的 数 据 并 未 丢 失 , 而 是 变 成 一 个
freeblock块。根据内容存储区位置,若被删除的内容前后
都还有数据,可直接在内容存储区的freeblock块中分析提
取,若删除是内容区域的第一条,可把删除的内容作为未
分配区的内容进行分析提取。因此,删除的数据存储于内
容存储区的freeblock块和未分配区。
以提取freeblock块中删除数据为例,如下:
该 叶 子 页 中 , 第 一 个freeblock块 的 偏 移 量 为
0x0154, 因 此 , 第 一 个freeblock块 的 起 始 地 址 是
0x13d54,如下:
蓝色框中即为要提取的删除的数据。freeblock块共
4各字节,前2个字节即是下一个freeblock的偏移量,第
3 和 4 字 节 即freeblock块 的 大 小 。 因 此 可 知 , 上 图 中
freeblock块就是最后一个freeblock块。从0x0002开始即
为删除数据的存储区。
叶子页中,数据存放在payload记录中,payload格
式如表3。
表3payload格式
每个payload由两部分组成:第一部分是记录头,第
二部分是表中数据的长度、类型以及数据本身。记录头由
N+1个可变长整数组成,N为记录中的字段数,即该表中
P
oliceechnology2012年第5期
T
7