吴玉强 王旭
摘要:目前在我国的手机市场上,智能手机主要以IOS、Android为操作系统,其中Android手机中,短信、通话记录、图片等多种媒体的存储方式,都是运用SQLite3数据库进行数据存储。以SQLite3 for Android数据库为主要研究对象,分析其逻辑结构与物理结构,研究数据库的存储构架,实验剖析手机数据的存储删除在底层数据结构上的表现,同时寻找被删除的残存文件,研究SQLite3数据恢复技术的可行性。
关键词:SQLite3;数据库;Android;数据恢复
中图分类号:TP392 文献标识码:A
Abstract: At present, in China's mobile phone market, smartphones mainly use IOS, Android as the operating system. In Android phones, the storage methods of SMS, call records, pictures and other media are all based on SQLite3 database for data storage. Taking the SQLite3 for Android database as the main research object, this paper analyses its logical and physical structure, studies the storage structure of the database, analyzes the performance of the storage and deletion of mobile phone data on the underlying data structure, and searches for the deleted residual files, and studies the feasibility of the data recovery technology of SQLite3.
Key words: SQLite3; database; Android; data recovery
在Android手機取证中,对于未删除的Android智能手机数据,调用手机API,便能获取。但是对于已经删除的数据信息,这种调用API的手段显然是无法获取的。而在对手机进行取证的很多案件中,我们发现绝大多数的犯罪嫌疑人都会删除很多与案件有关的信息,而往往这些数据都是认罪定性的关键。因此,对手机的取证,我们不仅仅是要拿到那些未删除的数据,而对于那些已删除的很多数据,如何将其复原或是获取,则是取证工作的重中之重。本文从SQLite数据库的逻辑结构和物理结构两个角度展开研究,以逻辑结构的研究为辅,物理结构的研究为主,了解SQLite在物理层面上的数据存储原理。研究以B-tree树形结构为基础的SQLite数据库文件的底层数据存储规则,发现被删除的数据,即“空白页”中数据存在的可能性,以及尝试性恢复。同时,对收集数据进行删除,查看其底层数据的变化情况,研究SQLite数据库被删除文件恢复获取的可能性。
1 Android手机数据恢复技术概述
1.1 Android系统概述
Android系统和Windows一样,有着可视化的用户界面和操作系统,Android系统的运行,其实是建立在虚拟机中,运行时需要调用Java语言库。与Windows的存储方式不同的是,应用程序以APK的形式保存在Android中。在Android系统的构架中,最底层的为Linux的内核层,再往上便是系统运行的阶层,之后便是构成应用程序框架的程序框架层,最后便是顶层的应用程序层。
1.2 数据恢复概念
计算机中,在删除、格式化等操作下,丢失的数据是可以恢复的,手机数据恢复的道理也是这样。数据删除的时候,系统在文件分配表上对该数据做上“已删除 ”的标记,保留数据的空间,不会被占用。但是当数据被彻底删除时,系统不会对数据空间进行保留,再次写入可能会造成覆盖的情况出现。
格式化与删除相似,在文件分配表上进行操作,将所有文件进行“删除”标记,或者清空分配表,系统会认为数据空白,但真实的数据却依然存在。数据恢复的理论基础,便是对数据表的恢复,和在空白扇区搜索数据。当计算机系统无法进入、硬盘的磁盘出现损坏导致坏道、文件无法打开、文件内容乱码等现象的出现,意味着数据可能出现了丢失。
2 SQLite3数据库架构
2.1 SQLite3数据库的逻辑结构
SQLite数据库由逻辑模式、存储模式、用户模式这3个模式结构组成。并且,SQLite数据库又分为3大子系统,以及8个独立的模块结构组成。
2.2 SQLite3数据库的物理结构
多重的Btree结构,构成了SQLite数据库文件的架构。Btree是一种磁盘存储树形结构,它的存在是为了优化磁盘的存储。一个Btree结构便是一张表,或是一个索引。在SQLite数据库文件中,表的数据与索引,两者的结构是不同的,表数据的结构为B+Tree;索引的结构为B-Tree。Btree结构的计算节点为页,所以Btree最小也会有一页的大小。根据存储介质的不同,对“页”的大小的定义也不相同,许多磁盘的定义一页为1024字节,但是本次实验的磁盘中,定义一页的大小为4096字节。“根页”位于数据库的起始位置。数据区的内容存储在Payload中,为平级向后铺列。
3 基于SQLite3的Android手机数据恢复实验
SQLite3数据库文件在文件大小小于一页的情况下(本次实验中的一页为4096字节),即使再次写入,也不会发生覆盖。而当删除内容大于一页时,也就是4096字节,该页会被定义为空白页,再次写入,会造成覆盖。根据SQLite3数据库数据的存储结构和原理,被删除的数据是可通过地址查找,找到删除的数据,从而进行提取。通过winhex查看Android手机中对应的数据库文件,搜索数据库中各表的位置,从而发现删除的存储区域。Android手机的通讯录、短信、照片等数据,都是通过SQLite3数据库进行管理,本实验将对手机短信数据库(mmssmms.db)进行分析研究。
3.1 SQLite3数据库文件分析实验
3.1.1镜像制作
通过手机镜像制作工具,对手机制作物理镜像。手机品牌:华为;型号:MT7-CL00,手机系统:Android 6.0。
3.1.2 数据库根页分析
使用winhex打开镜像文件userdata.dd,在\data\com.android.providers.telephony\databases目录下,找到短信数据库文件mmssms.db。根页磁盘的情况如图1中选中区域所示:
3.1.3 SQLite_master表分析
SQLite_master表情况如图3-1中未选中区域所示。其中,0X05:本页为内部页;0X0000:第1个自由块的偏移量。此处为0,表示本页没自由块;0X0008:本页总计8个单元;0X0FD8:该单元的起始位置:4056(绝对地址),12字节后,0X0FFB、0X0FF6、0X0FF1、0X0FEC、0X0FE7、0X0FE2、0X0FDD、0X0FD8分别为8个单元的起始位置;0X00:碎片的字节数,此处为0;0X0000005D:最后子叶的单元指针页号。由于本页有8个单元,所以此处即指针(8)。其值为0X005D,即指针(8)指向第93页。第93页是表数据的最后一页。在0X0FD8后可以看到还有16个字节信息,这些信息就是被覆盖前的原始信息。
3.1.4 单元内容区分析
6558D000+FD8=6558DFD8,得到单元内容区的起始地址为6558DFD8。
手机短信数据库mmssms.db的B+Tree的结构如表1所示:
3.1.5 叶子页分析
此时Payload数据的前四个字节发生了改变,而短信内容没有发生任何改变,前两个字节表示下一个自由块的起始地址为0X00;后两个字节表示该自由块的大小为0X00AD,173个字节,正好为删除空间大小。
第二次实验,为了与中文短信进行对比,我们用手机号183XXXX7703的手机给实验手机发送了一条英文短信,短信内容为“this is a test,if received,succeed!!!949455”。
通过搜索,找到此段英文对应的数据区,其对应的Payload数据如图7,英文字母在ascii中占2个字节,是可以直接显示出来的。
同样,对比图7和图8,前四个字节发生了变化,而数据内容没有发生变化。改变的前四个字节所代表的含义是:1、前两个字节表示下一个自由块的起始地址0X00;2、后两个字节表示该自由块的大小0X0067,103个字节。可以发现自由块的大小值比删除前单元的记录内容大小值多了2,也就是说自由块的大小值记录的是删除前整个单元的大小。
3.3 数据覆盖实验
SQLite3数据库在数据内容没有达到“一页”(一页在本数据库文件中为4096字节)的大小时,数据库不会对数据进行重新整理,数据库文件大小不变,而即使数据已经被删除,也不会被覆盖;而当删除的内容达到一页的大小时,会对数据进行重新整理,数据库文件大小会变小,重新写入,数据会被覆盖。
我们依然选取交通银行的短信作为实验对象,以下是交通银行短信的部分通知内容,如图9所示。
现在,我们将手机中的短信全部删除,删除短信的大小远远超过了4096字节,再次对手机进行镜像的制作,在鏡像中查看原地址的内容,和上述实验结果一样,只是文件头发生了变化,具体图省略。
接下来进行覆盖实验。我们将发送5条短信,每条短信中分别是500个a,也就是1000字节,五条短信的总大小就是5000字节。
再次制作镜像,在原来地址处查看文件,文件的数据如图10所示:
从上面的图中可以发现,蓝色区域的原始数据已经被覆盖,而剩余区域没有被覆盖,仍然处于空白区域,未被写入。
3.4 实验总结
本次实验,一共进行了四次实验,分别是短信数据的逐层寻找,以及两次删除实验,三次覆盖实验。其中,手机镜像制作7次,中文短信删除实验前后对比需要两次镜像,英文短信删除实验需要两次镜像,以及后续的覆盖实验也需要两次镜像,这样的目的是为了防止数据出现覆盖,导致实验数据存在偏差。
实验证明,基于SQLite3数据库的手机数据恢复取证是可行的,被删除数据的内容是不会改变的,但是数据的叶子页头会发生变化,将这一数据表明为“自由块”,在本页没有全部删除的情况下,是不会进行覆盖的,数据库文件的大小不变,即使写入,也不会出现覆盖,所以存在取证的可能性。但是,在此页的数据被全部删除的情况下,数据库文件的大小会变小,此时若是写入,便会出现数据覆盖的情况,较难恢复。所以,在单独删除少量信息(少于一页)的情况下,被删除的对象可以被恢复;对于大批量删除,并在后续进行写入的情况下,原始数据会被进行覆盖,恢复的难度较大,并且几乎不可能全部恢复。
不过,上述的技术实验也要分情况,比如说数据库文件对“页”大小的定义就会根据存储方式的不同而不同,一些手机中一“页”指的是1024字节,而本次实验的手机中,一“页”的大小为4096个字节。一些参考文献所提供的数据也有着些许的偏差,比如对于“数据子叶”的位置的定义,一些文献中指出子叶的位置是以前往后的,但是实验数据却显示,子叶的位置未必是对应着页号从前往后,删除等行为会造成数据库文件的重新整编,从而导致逻辑位置上最左侧子叶,不是第一子叶的情况出现。
4 小结
本文的研究对Android手机中SQLite3数据库的恢复和取证具有一定的参考价值和指导意义,基于SQLite3的Android手机数据恢复的可能性是巨大的,当了解到每一个字节的意义后,就会清楚每一部分的用处,从而可以在空白区域寻找有用数据,进行数据恢复。通过对底层数据的读取,以及对规则的算法设计,可以实现基于SQLite3的Android手机数据恢复软件工具的制作。
参考文献:
[1]杜国祥,石俊杰.SQLite嵌入式数据库的应用[J].电脑编程技巧与维护,2010(14):43-47.
[2]韩善锋,曹凤海,易昌华.SQLite数据库在嵌入式程序开发中的应用[J].物探装备,2011,21(03):170-173+178.
[3]吴昊,陈立全,沙晶,乔志,吴中奇.一种基于特征匹配定位的SQLite数据恢复方法[J].南京邮电大学学报(自然科学版),2018,38(01):106-112.
[4]叶清明. 基于MDA的SQLite碎片数据清除技术的研究[D].昆明理工大学,2016.
[5]王昌红.恢复手机上的被删除的资料[J].电脑知识与技术(经验技巧),2017(11):21-24.
[6]马获蕾,汤海凤.Android系统中SQLite数据库的研究[J].电脑知识与技术,2013,9(28):6243-6245+6256.
[7]胡伟.SQLite在嵌入式系统上的实现研究[J].计算机与数字工程,2009,37(02):158-163.
[8]许如峰,杨明武,张青春,邱换春.红黑树优化的SQLite索引在测速系统中的应用[J].现代电子技术,2018,41(04):52-55+59.
【通联编辑:王力】