一种适用于非整型主键与空闲块合并的SQLite数据恢复方法与流程

文档序号:12666984阅读:142来源:国知局
一种适用于非整型主键与空闲块合并的SQLite数据恢复方法与流程

本发明涉及计算机取证领域,主要涉及对SQLite数据库的数据恢复,尤其涉及一种基于SQLite文件结构与删除、重组机制的数据库恢复方法。



背景技术:

根据Trend Force研究报告指出,仅2016年第三季度,智能手机的生产数量达到3.5亿部,并保持增长趋势。电子取证中,智能机取证十分重要,数据提取是取证工作展开的基础。大量的用户信息如短信、浏览记录、通讯录等均存储在SQLite中,如何提取出被删除的数据对取证工作有着重要意义。

自1983年以来,许多学者都对SQLite中被删除数据的恢复进行了研究。现有研究主要集中在四个方面。首先,从辅助文件的角度,可以分析事务文件,WAL与索引文件。该方法可以不依赖数据库文件,从辅助文件中提取被删除的数据。另外,从具体应用结合SQLite删除机制的角度,限制在某种特定的应用中,可详细分析其逻辑存储结构,可以取得比较好的恢复效率,但是这种方法严重依赖特定的应用,适用范围不广泛。第三,从文件系统级别的角度,可以获得历史版本的数据库文件,针对各个历史文件进行数据提取,甚至可以构建用户操作时间轴。最后,最为基础的研究则是从SQLite文件结构与存储空间分配机制的角度,分析其二进制结构与删除、重组机制,提出广泛使用的恢复方法。

对二进制结构与机制分析,可以分析存储数据的机制,直接提取数据。也可以分析空闲块与单元的转换原理,进行类型估计。然而在大多数情况下,非整型主键的表中单元被删除后类型的关键信息丢失,该信息需要被精确确定。另外随着删除进行,B+tree会重新组织,导致可用空闲块合并与数量减少。

因此,如何综合考虑并解决上述问题,提出一种综合的,高恢复率的SQLite数据恢复方案对计算机取证有重要意义。



技术实现要素:

本发明旨在解决以上现有技术的问题。提出了一种弥补了现有方法对非主键类型数据解析能力不足的问题,也考虑到了拆分空闲块提高恢复率的情况,并且综合考虑了空闲页数量增加这一影响恢复率的现象、提高SQLite被删除数据的恢复率方法。本发明的技术方案如下:

一种适用于非整型主键与空闲块合并的SQLite数据恢复方法,其包括以下步骤:

步骤1:获取欲恢复数据的SQLite文件,根据其包含的系统表sqlite_master确定欲恢复数据表的根页号以及表的字段结构信息,从根页与文件头出发,搜集所有空闲块与空闲页;

步骤2、假设每个空闲块在被删除之前包含一条被删除的数据库记录的单元分析整型主键与非整型主键的单元布局区别与每个字节的意义,计算被覆盖的字段类型信息,解析类型信息与数据域,进行数据恢复,判断单个空闲块是否能恢复出有效数据;

步骤3:对于不能通过步骤2恢复出有效数据的空闲块,认定其包含多个被删除的单元,则基于拆分与验证法得出临时空闲块集,判断临时空闲块能否恢复出有效数据,若能则删除所有兄弟临时空闲块,然后将数据加入恢复结果集,继续判断下一个临时空闲块;否则继续判断下一个临时空闲块,直到临时空闲块集合为空;

步骤4:通过空闲页链表获得空闲页集合,遍历每一个空闲页,将该页所有的存储数据库记录的单元加入单元集合。对于单元集合中的每个单元,根据Type信息解析数据域获得数据,加入恢复结果集。

进一步的,所述步骤2)对于包含一个被删除的单元的情况的处理步骤为:对于Type被覆盖的情况,采用基于估计与验证的计算被覆盖信息值的方法。

假定每个空闲块恰包含一个被删除的单元,对当前空闲块进行判断,由于payloadsize,rowId与headersizes最少一共占3个字节,单元转变为空闲块后前四个字节被覆盖,因此Type域第一个字节有可能被覆盖,分为两种情况讨论,即记录第一个字段的类型信息的Type1被覆盖的情况与未被覆盖的情况,假定Type域起点为i,分别以第四个到最后一个字节为起点i,进行判断,若i=4,认为Type1数据丢失,则进行单独判断,若i>=5,认为所有Type信息完整,跳转步骤2.2;

步骤2.1、若起点为第四个字节,令第四个字节的值从0x00到0xFF递增,对于当前空闲块获得的256个值中的每一个值对应的状态,执行步骤2.2-2.2.4,任意一个值对应的状态通过验证获得被删除的单元数据,则将恢复出来的数据加入恢复结果集,终止该空闲块判断,继续判断下一个空闲块;

步骤2.2、以i为第一个Type的起始位置,按照Type的可变长整型存储规则,解析所有Type,并根据其值计算理论的数据长度

步骤2.3、根据步骤2.2结果,可得Type域所占字节数len(T),可得本空闲块剩余字节数realDLen,如果readlDLen=theoryDLen,则根据Type-Data对应关系提取数据,恢复出来的数据通过验证后加入恢复结果集,跳转步骤2.5,否则,执行步骤2.4;

步骤2.4,令i=i+1,跳转步骤2.1,若i为空闲块最后一个字节位置,则将该空闲块加入失败空闲块集,执行步骤2.5;

步骤2.5,继续判断下一个空闲块,跳转到步骤2.1,直到当前为最后一个空闲块。

可以适用于任意类型的主键的表;基于此方法,获得被删除的数据。

进一步的,所述步骤3)基于拆分与验证的方法进行数据恢复失败空闲块集进行的恢复操作包括步骤:

S31:首先通过循环获得临时空闲块集:(1)从估计的空闲块长度len=4开始,截取当前失败空闲块,加入临时空闲块集。len++;(2)如果len等于当前失败空闲块长度,则判断下一个失败空闲块,跳转(1),若当前为最后一个失败空闲块,结束当前循环,获得临时空闲块集;

S32:对每一个临时空闲块执行进行数据恢复,若未获得恢复数据,继续判断下一个临时空闲块;若获得恢复的数据,则删除该临时空闲块与其源自同一个失败空闲块的兄弟临时空闲块,然后将数据加入恢复结果集,继续判断下一个临时空闲块,直到临时空闲块为空;

本发明的优点及有益效果如下:

本发明可以适用多种主键类型的表被删除的情况,也适用于B+tree重组后,空闲块合并与数量减少的情况。本方法弥补了现有方法对非主键类型数据解析能力不足的问题,也考虑到了拆分空闲块提高恢复率的情况,并且综合考虑了空闲页数量增加这一影响恢复率的现象。本方法从字节级别进行恢复验证,综合考虑多种情况,可以提高SQLite被删除数据的恢复率。

附图说明

图1是本发明提供优选实施例收集空闲块并对其未拆分状态进行恢复的整体流程图。

图2为本发明中对每个空闲块进行未拆分恢复的操作流程图。

图3为本发明中对每个空闲块的每个起始位置i的基本恢复操作的流程图。

图4为本发明中对失败空闲块集进行的恢复操作的流程图。

图5是本发明优选实施例的流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、详细地描述。所描述的实施例仅仅是本发明的一部分实施例。

本发明解决上述技术问题的技术方案是,

针对空闲块类型关键信息丢失的问题,本方法注意到,对于整型主键与非整型主键,单元的二进制布局与每个字节的意义不同,提出了估计与验证相结合的数值计算方法。针对空闲块合并与减少的情况,研究了引起B+tree重新组织,空闲块合并以及空闲块数量减少的defragment机制,提出了一种基于拆分空闲块与空闲页数据提取的恢复方法。

本发明建立一种适用于非整型主键与空闲块合并的SQLite数据恢复方法,其方法包括以下四个实施步骤:

步骤1、从移动设备中获取欲恢复数据的SQLite文件,根据其包含的系统表sqlite_master确定欲恢复数据表的根页号以及表的字段结构信息。结合SQLite文件的存储结构,从根页号与文件头开始,对B+tree进行遍历,收集其中所有的空闲页与空闲块,对于每一个空闲块执行步骤2。

步骤2、本步骤中假定每个空闲块恰包含一个被删除的单元。对当前空闲块进行判断。由于payloadsize,rowId与headersizes最少一共占3个字节,单元转变为空闲块覆盖前4个字节,因此Type域第一个字节有可能被覆盖。分为两种情况讨论,即Type1被覆盖的情况与未被覆盖的情况。由于本方法对Type1进行了判断,因此适用于任意主键类型的表。假定Type域起点为i。分别以第四个到最后一个字节为起点i,进行判断。若i=4,认为Type1数据丢失,跳转步骤2.1,若i>=5,认为所有Type信息完整,跳转步骤2.2。

步骤2.1、若起点为第四个字节,令第四个字节的值从0x00到0xFF递增,对于当前空闲块获得的256个值中的每一个值对应的状态,执行步骤2.2-2.2.4,任意一个值对应的状态通过验证获得被删除的单元数据,则将恢复出来的数据加入恢复结果集,终止该空闲块判断,继续判断下一个空闲块。若256个值对应的状态均无法通过验证,则令i=4,执行步骤2。

步骤2.2、以i为第一个Type的起始位置,按照Type的可变长整型存储规则,解析所有Type,并根据其值计算理论的数据长度

步骤2.3、根据步骤2.2结果,可得Type域所占字节数len(T)。可得本空闲块剩余字节数realDLen。如果readlDLen=theoryDLen,则根据Type-Data对应关系提取数据,恢复出来的数据通过验证后加入恢复结果集,跳转步骤2.5。否则,执行步骤2.4。

步骤2.4,令i=i+1,跳转步骤2。若i为空闲块最后一个字节位置,则将该空闲块加入失败空闲块集,执行步骤2.5。

步骤2.5继续判断下一个空闲块,跳转到步骤2,若当前为最后一个空闲块,执行步骤3。

步骤3、本步骤为对步骤2中失败空闲块集的拆分判断,令估计的数据长度j从4递增到空闲块长度len(fb),一个空闲块对每个j值均截取j个字节长度的数据,产生一个长度为j的临时空闲块,每个失败空闲块可生成len-3个临时空闲块。通过失败空闲块集获得临时空闲块集,以临时空闲块集执行如下操作。

步骤3.1、将步骤2.5替换为步骤3.2。对每一个临时空闲块执行步骤2。

步骤3.2、从临时空闲块集中删除与当前临时空闲块及兄弟临时空闲块(即由同一个失败空闲块映射得到的临时空闲块)。继续判断下一个临时空闲块,跳转到步骤3.1,若当前为最后一个临时空闲块,执行步骤4。

步骤4、对于每一个步骤1搜集到的空闲页集,根据页第一个字节的值,刷选出叶子页,即0x0D的页。对于每一个叶子页,提取其中的单元值。一般情况下,该单元的值并未被覆盖,可以直接提取数据,加入到恢复结果集中。

参见图1,为本发明中收集空闲块并对其未拆分状态进行恢复的整体流程图,包括以下步骤。

S1:根据sqlite_master与数据库文件头,收集所有的空闲块与空闲页。获得所有空闲块集合Setfbs={fbi|i=1,2,…,n}。

S2:进一步,对每一个空闲块执行图2。如果该操作恢复出数据,则将结果加入恢复结果集,然后继续判断下一个空闲块。

S3:如果当前为最后一个空闲块,则结束算法,继续执行图3的操作,即步骤3的内容。

参见图2,是本发明中对每个空闲块的数据恢复操作流程图。为S2的具体实施步骤。

从i=4开始,即Type1之前的字节数为pre=3开始进行判定与恢复。如果i=4,pre=3,则执行RC(fb,i),即如下循环,j=0x00:

S21:(1)令空闲块第i个字节的值为j;(2)执行rc(fb,3)即图3,若成功恢复数据,输出该数据,结束当前空闲块。(3)若未成功,则j++,如果j<=0xFF,跳转(1),否则,结束本循环,令i=5。

S22:如果i>=5,pre>=4,做如下循环:(1)执行rc(fb,pre)(2)若成功恢复数据,输出该数据,则结束当前空闲块。(3)否则,若i是空闲块最后一个位置,则将当前空闲块加入失败空闲块集,结束当前空闲块判断。否则,令i++,pre++,跳转(1)。

参见图3,为本发明中对每个空闲块的每个起始位置i的基本恢复操作的流程图,为数据恢复中最基本的操作。即一次rc(fb,pre)。

S23:在该操作中,以传入的i为起点,逐字节,按照可变长整型的规则解析所有的Type,可得Type域字节数量。可计算出理论的数据域Data的长度和实际的Data的长度。

S24:如果理论长度与实际长度相等,则认为此空闲块原单元数据可被恢复。恢复数据,并输出正确数据。若不可,不输出,结束当前操作。待下一个输入i继续。

S3:参见图4,为本发明中对失败空闲块集进行的恢复操作的流程图,属于合并空闲块提取模块内容。通过前置算法,可得失败空闲块集。

S31:首先通过循环获得临时空闲块集:(1)从len=4开始截取当前失败空闲块,加入临时空闲块集。len++。(2)如果len等于当前失败空闲块长度,则判断下一个失败空闲块,跳转(1)。若当前为最后一个失败空闲块,结束当前循环。

S32:对每一个临时空闲块执行图2所示操作,如果未获得恢复数据,继续判断下一个临时空闲块。如获得恢复的数据,则删除所有兄弟临时空闲块(由同一失败空闲块映射得到),然后将数据加入恢复结果集,继续判断下一个临时空闲块。

S4:最后,利用收集到的所有空闲页,筛选出所有的叶子页,进一步根据数据库文件结构,读取其中存在的单元数据,一并加入到恢复数据集中。

恢复数据集即为本方法最终的恢复数据输出结果。

以上这些实施例应理解为仅用于说明本发明而不用于限制本发明的保护范围。在阅读了本发明的记载的内容之后,技术人员可以对本发明作各种改动或修改,这些等效变化和修饰同样落入本发明权利要求所限定的范围。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1