高 杨 孙道宁
(中国刑事警察学院网络犯罪侦查系 辽宁 沈阳 110035)
基于SQLite3结构解析的短信恢复方法研究
高 杨 孙道宁
(中国刑事警察学院网络犯罪侦查系 辽宁 沈阳 110035)
对某些被刻意删除的短信,可以通过手机取证工具进行恢复。由于各取证软件恢复原理不同,恢复结果也有很大不同,而且相当多的删除内容无法重现。为了解决手机中删除短信提取不完整的问题,以Android系统手机为例,深入分析了存储短信的SQLite3数据库的组织结构,依据字段特征进行短信内容重构,相较于取证工具和其他短信恢复方法,能获取到更多的短信条数和内容,通过实验验证达到了很好的取证效果,对于今后在手机短信方面的取证工作具有一定借鉴意义。
SQLite3 短信恢复 电子数据取证
虽然微信、QQ等即时聊天工具已相当普及,但短信仍然是人们日常生活中重要的交流、通讯渠道。在涉案人员的手机中提取短信记录,尤其是删除的短信记录,往往对案件的侦破具有重要作用。
目前,大部分取证人员对短信记录的提取依赖手机取证工具。经过测试,不同取证工具的取证结果间存在差异,删除的短信无法完全恢复,内容被部分覆盖的短信更无从获取,但其实有些内容是存在于手机中的,只不过没有得到有效地提取。为挖掘出更多的短信内容,有必要对短信的存储结构和恢复原理进行深入研究,以便获取更多线索,为取证工作提供更多可能。
短信是一种结构化信息,Android系统将其存放于SQLite3数据库文件中。SQLite3是专门应用于嵌入式设备的轻量级数据库,应用程序直接从磁盘上的数据库文件读写,没有中间的服务器进程,节省资源、提高运行效率[1]。
2.1 SQLite3数据库结构
SQLite3数据库由若干B-tree页(简称“页”)组成,每页大小相同,介于512字节和32768字节之间,具体大小取决于数据库初始化设置[2]。SQLite3数据库最开始的1页称为MASTER页,该页主要进行参数设定。其余页编为“第1页”、“第2页”……依此类推。根据页中存储内容类型的不同,可将页面进一步细分为中间页和叶子页。中间页存放地址,用于寻址和取证工作关系不大;叶子页存放具体数据,短信的内容和属性存放于叶子页中,取证工作就是要从叶子页中提取相关数据。SQLite3数据库结构如图1所示,呈现树形分布状态。
图1 SQLite3数据库结构图
以某手机检材为例进行说明。首先将该手机中存放短信的数据库文件“mmssms.db”导出到计算机中,再利用Winhex工具打开该文件,偏移为0的位置就是该数据库的MASTER页的起始位置,如图2所示。第1行是特征码(显示为“SQLite format 3”字样),第2行的前2个字节标识数据库中每个页面的大小为1000(H)。这样,在页面之间切换时,直接以1000(H)作为偏移量跳转即可。
图2 短信MASTER页
2.2 页结构
MASTER页之后是若干B-tree页(简称“页”),每个页的结构相同,如图3所示。页结构分为页头、单元指针组、未分配空间和单元内容区。前文提到,页有中间页和叶子页之分,叶子页页头的第一个字节为固定标识“0D(H)”,中间页页头的第一个字节为“01(H)”,可依此区分页面类型。另外,页头中还会记录该页存放短信记录的条数以及每条短信记录的存放位置。在页头之后,是单元指针组和单元内容区,中间是未分配空间。单元是SQLite3数据库中最小的存储单位,存放具体的短信内容,每个单元存放一条短信,删除的短信依然存放于单元中,只不过被转移到回收空间。随着短信条目的增加,单元指针组和单元内容区逐渐扩大,未分配空间逐渐缩小,直至全部消失为止。
图3 页结构
由MASTER页可知页面大小为1000(H),以1000(H)作为偏移地址进行跳转,寻找叶子页。根据跳转页的第1个字节区分该页是否为叶子页,只有为0D(H)时才是叶子页,非叶子页直接跳过,如图4所示。
图4 页面跳转
如图5所示,该页第1个字节是0D(H),表明它是一个叶子页。在第3-4偏移地址存放的是该页中存放的短信条数,5-6偏移地址存放的是第一条短信单元的偏移地址,之后是其他短信单元的存放位置。由图可知,存放的短信条数为000C(H),转换为十进制是12条,在这个叶子页中存放了12条短信(未删除的短信)。存储第1条短信单元的偏移地址为0770(H),物理地址为9000(H)+0770(H)=9770(H)。若要读取该条短信内容,跳转至9770(H)即可。
图5 叶子页内容
2.3 单元结构
单元是SQLite3数据库中的基本单位,每个单元存放一条短信,多条短信存放于多个单元,分布在一个或者多个叶子页中,单元结构如图6所示。前3个字段为单元大小、单元序号、单元头大小,通过这3个字段可以确定Type区和Data区的数量、确定单元的大小,之后是Type区和Data区。短信被系统拆分成若干部分存放于Data1—DataN中,Type1—TypeN描述相应Data区的类型和大小。
图6 单元结构图
短信是一种结构化数据,系统将其拆分成若干部分分别存储,图7是某款Android手机的短信结构。系统将短信分成17个字段,每个字段代表不同含义,占据不同长度。例如,短信正文存入13号区域,收发信息的电话号码存入3号区域,收发短信日期存入5—6区域。不同型号的手机字段设置可能不同,但存储原理都是一致的。删除的短信如果被覆盖,会自后向前覆盖,先覆盖Data区,再覆盖Type区,只要核心数据存在,仍然可以恢复。
图7 短信存储方式
跳转到9770(H)地址,此处为该叶子页存储的第1个单元,也是第1条短信的位置,如图8所示。9772(H)的0D(H)代表短信ID号是13,9773(H)的19(H)代表Type区个数25-1=24个。9774(H)—978B(H)存放的是Type1—Type24的值,它规定了每个对应Data区中存放数据的类型和长度。从978C(H)开始,存放的是Data1—Data24的值。
图8 单元内容
Type采用可变长整数格式结构存储,不同数值代表不同类型和长度,如图9所示。
图9 可变长整数列表
由图11,结合Type区的值,解析Data1-Data24的内容。9775(H)的02(H),参照图9可知其数据长度为2,整数类型,对应数值为978C—978D(H)中的内容0C4F(H),转换成十进制为3151,此为该条短信的外键值;
9776(H)的29(H)即41,参照图9,存储的是文本类型数据,数据长度为(41-13)/2=14位,对应978E(H)—978F(H)中的内容2B38363138333933363335313339(H),转换成UTF-8编码为:+8618393635139,此为对方的电话号码;
9779(H)的05(H)即5,参照图9,存储的是有符号整数,数据长度为6位,对应979D(H)—97A2(H)中的内容 0153691FA073(H),含义是短信的收发时间。因为Android系统使用的是Unix时间戳,转换成北京时间为2016/3/12 12:39:50;
9781(H)的81(H)即129,参照图9,存储的是文本类型数据,数据长度为(129-13)/2=58位,对应97A4(H)—97DD(H)中的内容,含义是短信的具体内容。将这部分内容存为.htm格式的网页文件,以UTF-8的字符编码形式打开,即可还原短信内容,如图10所示,这是手机操作系统解析SQLite3数据库中短信内容的基本原理。
图10 解析的短信内容
如果短信被删除,存放该短信单元的前4个字节失效,随机填充数据,其余位置内容保持不变[3],如图11所示。
图11 删除短信的字段结构
如果短信被删除后又被新内容覆盖,SQLite3会自动从单元尾部进行数据写入[4],先从Data区开始覆盖,再覆盖Type区,直至覆盖掉整个单元为止。只要Data区没有被完全覆盖,就有恢复的必要,如图12所示。
图12 内容被部分覆盖的短信
删除但未被覆盖的短信,只是损坏了存放短信的单元前4个字节,Type区和Data区没有改变,对于数据的解析没有影响,自动绕过前4个字节,重新解析Type区和Data区即可,所有的取证工具都能完成这类短信的恢复,在此不再赘述。
删除且被覆盖的短信,剩余单元内容会被当作碎片回收,大部分取证软件对此未做处理。关于这类短信的恢复方法,很多科研人员进行过研究。在《Android系统删除数据恢复方法研究》[5]一文中,作者提出了“尽最大努力估算法”来恢复被部分覆盖的短信。该算法主要想法是根据现有短信的字段结构和数量,从空闲块中寻找单元内容。伪代码如下:
while(i while(a!=k) //判断Type字段读取数量(假定Type字段数量为17个) 计算可变长整数占据字节数,若小于127,仅占据1个字节,则 a++,b++;若大于127小于16384,占据2个字节,则a++,b=b+2; 依次类推 通过每个Type值计算sum1 sum2=sizeof(bb)-i-b,通过数组bb剩余未读部分计算; if(suml=sum2) return成功; else i++; 图13是该算法的短信恢复效果图。 图13 “尽最大努力恢复方法”的恢复效果 针对此种方法,本文进行了适当的改进: (1)恢复短信的关键是找准Type区和Data区的界限,依据Type区内容解析对应的Data区。原方法是基于Type区结构、数量一致这个前提进行的,按照固定的数量和大小去估算被覆盖短信的Type区,进而找到Data区。但经过实验发现,不同版本操作系统、不同品牌手机的短信结构是不同的,Type区的数量和排列次序也不同。此算法不具备普遍适用性。 本文依据Type区和Data区的排列规律进行。图14显示的是所有未删除短信的内容,分析每个单元的Type区结构寻找规律。经观察发现,每个单元Type区的后几个Type值都是0801080908050908(H)。因为Type区的后几个字段表达含义相同,所用长整数基本一致。紧邻着Type区尾部就是Data1的值。依照这个分析结果,可以找出Type区和Data区之间的界限,划线区域之后就是单元对应的Data区。而删除的短信在未被覆盖的情况下,或者未被完全覆盖的情况下,Data区的内容是保留的。 图14 单元结构特征 以所用的手机检材为例。在回收的单元之中,以0801080908050908(H)作为关键字进行搜索,定位到图15所示的内容。由上文分析可知,命中部分是Type和Data区的临界处。按照未删除短信的Type字段排列方式对Data区内容进行解析,解析出发送号码为+8615101889010,发送时间为2016/3/3 08:03:05,发送内容为“把你的照片发过来,我好想你”。 图15 恢复的删除短信 相比原方法,利用特征值恢复短信的方式更加精准、适用性更强。 (2)原方法没有对Data内容进行精确解析,在找到Data区后将内容直接导出为UTF-8格式的文件。在图15中,导出的短信内容包含大量冗余信息,而且看不出收发短信时间(Linux时间戳)和短信ID。本文在获得信息后,依据Type字段对Data区内容逐个解析,可以精准地还原各个项目内容,对取证工作作用更大,见图16。 图16 内容不完整短信的恢复 (3)随着手机的使用,短信数量日渐增多,系统自动将部分删除短信移出短信文件“mmssms. db”,转移到机身内存中。所以,删除的短信内容不仅仅存在于“mmssms.db”中,还存在于手机内存中,原方法和大部分取证工具都未涉及此范围。为了获得最全面的解析结果,对于短信的搜索范围应该扩大到整个手机内存。图17所示的列表,是从送检手机的机身中恢复的信息,以及恢复出的内容被部分覆盖的信息,原方法和目前任何取证工具都无法完整获取到这部分信息。 图17 内容不完整短信的恢复 为了验证本文论述方法的有效性,针对同一部手机,使用SQLite viewer、DC4501、Cellebrite UFED Physical Analyzer 4、字段分析方式进行短信恢复,测试结果如图18所示。从图中可以看出,直接通过SQLite浏览器对“mmssms.db”文件进行读取,可以读取出12条未删除短信和0条删除短信;通过DC4501进行短信提取,可以提取到12条未删除短信和12条删除短信;使用Cellebrite UFED Physical Analyzer 4,可以提取12条未删除短信和20条删除短信;采用字段分析方式恢复,可以读取到12条未删除短信,可以读取到38条删除短信,包括内容不完整的短信。由此可见,本文的方法在取证效果上达到了预期目的,优于目前主流手机取证工具。取证工具的取证方法还是存在不足,取证工具的结果并不完全可靠。在需要借助短信内容辅助侦查的案件中,十分有必要对SQLite数据结构进行深入、细致的解析。 图18 测试结果对比 手机短信是电子数据取证工作中最常见的取证对象,只有深入了解存放短信信息的SQLite3数据结构,才能很好地恢复删除的短信,提取隐藏在其中的重要信息。同时提醒我们应该客观地看待各类取证工具的功效,工具的开发总是滞后于理论探索的,只有真正了解取证的原理,才能更加有效地完成各类取证工作。 [1]王随刚,等.基于SQLite3的Android手机数据恢复技术的研究 [J].警察技术,2012(5):3-7. [2]马获蕾,等.Android系统中SQLite数据库的研究[J].电脑知识与技术,2013(10):6243-6245. [3]姚伟,等.Android手机智能手机的取证[J].中国司法鉴定,2012(1):45-49. [4]尧俊.Android用户行为重构与分析技术研究[D].杭州:杭州电子科技大学,2013: 5-78. [5]方冬蓉,等.Android系统删除数据恢复方法研究[J].计算机工程,2014(10):275-280. (责任编辑:于 萍) Research on SMS Recovery Based on SQLite3 Structure Analysis GAO Yang SUN Dao-ning Many deleted SMS can be recovered by mobile phone forensics tools. The recovery results are various because of the different recovery principle of forensics software, and quite a few deleted content cannot be recovered again. In order to solve this problem, this paper analyzes the storage structure of SQLite3 database and reconstructs the message content according to the f eld characteristics based on the Android mobile phone. Compared with the other forensics tools and recovery methods, more SMS can be obtained. Through the experiment, a good evidence effect can be achieved, which has reference signif cance in the forensic work on SMS. SQLITE3 SMS recovery Digital forensics TP399 A 2095-7939(2017)01-0115-06 10.14060/j.issn.2095-7939.2017.01.020 2016-11-25 辽宁省社科规划项目(编号:L16BFX011)。 高杨 (1981-),男,辽宁锦州人,中国刑事警察学院网络犯罪侦查系讲师,主要从事电子物证方向研究。4 恢复短信效果对比
5 结束语
(Computer Grime Investigation Department of Criminal Investigation Police University of China Liaoning Shenyang 110035)