高 楊 孫道寧
(中國刑事警察學院網(wǎng)絡犯罪偵查系 遼寧 沈陽 110035)
基于SQLite3結構解析的短信恢復方法研究
高 楊 孫道寧
(中國刑事警察學院網(wǎng)絡犯罪偵查系 遼寧 沈陽 110035)
對某些被刻意刪除的短信,可以通過手機取證工具進行恢復。由于各取證軟件恢復原理不同,恢復結果也有很大不同,而且相當多的刪除內容無法重現(xiàn)。為了解決手機中刪除短信提取不完整的問題,以Android系統(tǒng)手機為例,深入分析了存儲短信的SQLite3數(shù)據(jù)庫的組織結構,依據(jù)字段特征進行短信內容重構,相較于取證工具和其他短信恢復方法,能獲取到更多的短信條數(shù)和內容,通過實驗驗證達到了很好的取證效果,對于今后在手機短信方面的取證工作具有一定借鑒意義。
SQLite3 短信恢復 電子數(shù)據(jù)取證
雖然微信、QQ等即時聊天工具已相當普及,但短信仍然是人們日常生活中重要的交流、通訊渠道。在涉案人員的手機中提取短信記錄,尤其是刪除的短信記錄,往往對案件的偵破具有重要作用。
目前,大部分取證人員對短信記錄的提取依賴手機取證工具。經(jīng)過測試,不同取證工具的取證結果間存在差異,刪除的短信無法完全恢復,內容被部分覆蓋的短信更無從獲取,但其實有些內容是存在于手機中的,只不過沒有得到有效地提取。為挖掘出更多的短信內容,有必要對短信的存儲結構和恢復原理進行深入研究,以便獲取更多線索,為取證工作提供更多可能。
短信是一種結構化信息,Android系統(tǒng)將其存放于SQLite3數(shù)據(jù)庫文件中。SQLite3是專門應用于嵌入式設備的輕量級數(shù)據(jù)庫,應用程序直接從磁盤上的數(shù)據(jù)庫文件讀寫,沒有中間的服務器進程,節(jié)省資源、提高運行效率[1]。
2.1 SQLite3數(shù)據(jù)庫結構
SQLite3數(shù)據(jù)庫由若干B-tree頁(簡稱“頁”)組成,每頁大小相同,介于512字節(jié)和32768字節(jié)之間,具體大小取決于數(shù)據(jù)庫初始化設置[2]。SQLite3數(shù)據(jù)庫最開始的1頁稱為MASTER頁,該頁主要進行參數(shù)設定。其余頁編為“第1頁”、“第2頁”……依此類推。根據(jù)頁中存儲內容類型的不同,可將頁面進一步細分為中間頁和葉子頁。中間頁存放地址,用于尋址和取證工作關系不大;葉子頁存放具體數(shù)據(jù),短信的內容和屬性存放于葉子頁中,取證工作就是要從葉子頁中提取相關數(shù)據(jù)。SQLite3數(shù)據(jù)庫結構如圖1所示,呈現(xiàn)樹形分布狀態(tài)。
圖1 SQLite3數(shù)據(jù)庫結構圖
以某手機檢材為例進行說明。首先將該手機中存放短信的數(shù)據(jù)庫文件“mmssms.db”導出到計算機中,再利用Winhex工具打開該文件,偏移為0的位置就是該數(shù)據(jù)庫的MASTER頁的起始位置,如圖2所示。第1行是特征碼(顯示為“SQLite format 3”字樣),第2行的前2個字節(jié)標識數(shù)據(jù)庫中每個頁面的大小為1000(H)。這樣,在頁面之間切換時,直接以1000(H)作為偏移量跳轉即可。
圖2 短信MASTER頁
2.2 頁結構
MASTER頁之后是若干B-tree頁(簡稱“頁”),每個頁的結構相同,如圖3所示。頁結構分為頁頭、單元指針組、未分配空間和單元內容區(qū)。前文提到,頁有中間頁和葉子頁之分,葉子頁頁頭的第一個字節(jié)為固定標識“0D(H)”,中間頁頁頭的第一個字節(jié)為“01(H)”,可依此區(qū)分頁面類型。另外,頁頭中還會記錄該頁存放短信記錄的條數(shù)以及每條短信記錄的存放位置。在頁頭之后,是單元指針組和單元內容區(qū),中間是未分配空間。單元是SQLite3數(shù)據(jù)庫中最小的存儲單位,存放具體的短信內容,每個單元存放一條短信,刪除的短信依然存放于單元中,只不過被轉移到回收空間。隨著短信條目的增加,單元指針組和單元內容區(qū)逐漸擴大,未分配空間逐漸縮小,直至全部消失為止。
圖3 頁結構
由MASTER頁可知頁面大小為1000(H),以1000(H)作為偏移地址進行跳轉,尋找葉子頁。根據(jù)跳轉頁的第1個字節(jié)區(qū)分該頁是否為葉子頁,只有為0D(H)時才是葉子頁,非葉子頁直接跳過,如圖4所示。
圖4 頁面跳轉
如圖5所示,該頁第1個字節(jié)是0D(H),表明它是一個葉子頁。在第3-4偏移地址存放的是該頁中存放的短信條數(shù),5-6偏移地址存放的是第一條短信單元的偏移地址,之后是其他短信單元的存放位置。由圖可知,存放的短信條數(shù)為000C(H),轉換為十進制是12條,在這個葉子頁中存放了12條短信(未刪除的短信)。存儲第1條短信單元的偏移地址為0770(H),物理地址為9000(H)+0770(H)=9770(H)。若要讀取該條短信內容,跳轉至9770(H)即可。
圖5 葉子頁內容
2.3 單元結構
單元是SQLite3數(shù)據(jù)庫中的基本單位,每個單元存放一條短信,多條短信存放于多個單元,分布在一個或者多個葉子頁中,單元結構如圖6所示。前3個字段為單元大小、單元序號、單元頭大小,通過這3個字段可以確定Type區(qū)和Data區(qū)的數(shù)量、確定單元的大小,之后是Type區(qū)和Data區(qū)。短信被系統(tǒng)拆分成若干部分存放于Data1—DataN中,Type1—TypeN描述相應Data區(qū)的類型和大小。
圖6 單元結構圖
短信是一種結構化數(shù)據(jù),系統(tǒng)將其拆分成若干部分分別存儲,圖7是某款Android手機的短信結構。系統(tǒng)將短信分成17個字段,每個字段代表不同含義,占據(jù)不同長度。例如,短信正文存入13號區(qū)域,收發(fā)信息的電話號碼存入3號區(qū)域,收發(fā)短信日期存入5—6區(qū)域。不同型號的手機字段設置可能不同,但存儲原理都是一致的。刪除的短信如果被覆蓋,會自后向前覆蓋,先覆蓋Data區(qū),再覆蓋Type區(qū),只要核心數(shù)據(jù)存在,仍然可以恢復。
圖7 短信存儲方式
跳轉到9770(H)地址,此處為該葉子頁存儲的第1個單元,也是第1條短信的位置,如圖8所示。9772(H)的0D(H)代表短信ID號是13,9773(H)的19(H)代表Type區(qū)個數(shù)25-1=24個。9774(H)—978B(H)存放的是Type1—Type24的值,它規(guī)定了每個對應Data區(qū)中存放數(shù)據(jù)的類型和長度。從978C(H)開始,存放的是Data1—Data24的值。
圖8 單元內容
Type采用可變長整數(shù)格式結構存儲,不同數(shù)值代表不同類型和長度,如圖9所示。
圖9 可變長整數(shù)列表
由圖11,結合Type區(qū)的值,解析Data1-Data24的內容。9775(H)的02(H),參照圖9可知其數(shù)據(jù)長度為2,整數(shù)類型,對應數(shù)值為978C—978D(H)中的內容0C4F(H),轉換成十進制為3151,此為該條短信的外鍵值;
9776(H)的29(H)即41,參照圖9,存儲的是文本類型數(shù)據(jù),數(shù)據(jù)長度為(41-13)/2=14位,對應978E(H)—978F(H)中的內容2B38363138333933363335313339(H),轉換成UTF-8編碼為:+8618393635139,此為對方的電話號碼;
9779(H)的05(H)即5,參照圖9,存儲的是有符號整數(shù),數(shù)據(jù)長度為6位,對應979D(H)—97A2(H)中的內容 0153691FA073(H),含義是短信的收發(fā)時間。因為Android系統(tǒng)使用的是Unix時間戳,轉換成北京時間為2016/3/12 12:39:50;
9781(H)的81(H)即129,參照圖9,存儲的是文本類型數(shù)據(jù),數(shù)據(jù)長度為(129-13)/2=58位,對應97A4(H)—97DD(H)中的內容,含義是短信的具體內容。將這部分內容存為.htm格式的網(wǎng)頁文件,以UTF-8的字符編碼形式打開,即可還原短信內容,如圖10所示,這是手機操作系統(tǒng)解析SQLite3數(shù)據(jù)庫中短信內容的基本原理。
圖10 解析的短信內容
如果短信被刪除,存放該短信單元的前4個字節(jié)失效,隨機填充數(shù)據(jù),其余位置內容保持不變[3],如圖11所示。
圖11 刪除短信的字段結構
如果短信被刪除后又被新內容覆蓋,SQLite3會自動從單元尾部進行數(shù)據(jù)寫入[4],先從Data區(qū)開始覆蓋,再覆蓋Type區(qū),直至覆蓋掉整個單元為止。只要Data區(qū)沒有被完全覆蓋,就有恢復的必要,如圖12所示。
圖12 內容被部分覆蓋的短信
刪除但未被覆蓋的短信,只是損壞了存放短信的單元前4個字節(jié),Type區(qū)和Data區(qū)沒有改變,對于數(shù)據(jù)的解析沒有影響,自動繞過前4個字節(jié),重新解析Type區(qū)和Data區(qū)即可,所有的取證工具都能完成這類短信的恢復,在此不再贅述。
刪除且被覆蓋的短信,剩余單元內容會被當作碎片回收,大部分取證軟件對此未做處理。關于這類短信的恢復方法,很多科研人員進行過研究。在《Android系統(tǒng)刪除數(shù)據(jù)恢復方法研究》[5]一文中,作者提出了“盡最大努力估算法”來恢復被部分覆蓋的短信。該算法主要想法是根據(jù)現(xiàn)有短信的字段結構和數(shù)量,從空閑塊中尋找單元內容。偽代碼如下:
while(i while(a!=k) //判斷Type字段讀取數(shù)量(假定Type字段數(shù)量為17個) 計算可變長整數(shù)占據(jù)字節(jié)數(shù),若小于127,僅占據(jù)1個字節(jié),則 a++,b++;若大于127小于16384,占據(jù)2個字節(jié),則a++,b=b+2; 依次類推 通過每個Type值計算sum1 sum2=sizeof(bb)-i-b,通過數(shù)組bb剩余未讀部分計算; if(suml=sum2) return成功; else i++; 圖13是該算法的短信恢復效果圖。 圖13 “盡最大努力恢復方法”的恢復效果 針對此種方法,本文進行了適當?shù)母倪M: (1)恢復短信的關鍵是找準Type區(qū)和Data區(qū)的界限,依據(jù)Type區(qū)內容解析對應的Data區(qū)。原方法是基于Type區(qū)結構、數(shù)量一致這個前提進行的,按照固定的數(shù)量和大小去估算被覆蓋短信的Type區(qū),進而找到Data區(qū)。但經(jīng)過實驗發(fā)現(xiàn),不同版本操作系統(tǒng)、不同品牌手機的短信結構是不同的,Type區(qū)的數(shù)量和排列次序也不同。此算法不具備普遍適用性。 本文依據(jù)Type區(qū)和Data區(qū)的排列規(guī)律進行。圖14顯示的是所有未刪除短信的內容,分析每個單元的Type區(qū)結構尋找規(guī)律。經(jīng)觀察發(fā)現(xiàn),每個單元Type區(qū)的后幾個Type值都是0801080908050908(H)。因為Type區(qū)的后幾個字段表達含義相同,所用長整數(shù)基本一致。緊鄰著Type區(qū)尾部就是Data1的值。依照這個分析結果,可以找出Type區(qū)和Data區(qū)之間的界限,劃線區(qū)域之后就是單元對應的Data區(qū)。而刪除的短信在未被覆蓋的情況下,或者未被完全覆蓋的情況下,Data區(qū)的內容是保留的。 圖14 單元結構特征 以所用的手機檢材為例。在回收的單元之中,以0801080908050908(H)作為關鍵字進行搜索,定位到圖15所示的內容。由上文分析可知,命中部分是Type和Data區(qū)的臨界處。按照未刪除短信的Type字段排列方式對Data區(qū)內容進行解析,解析出發(fā)送號碼為+8615101889010,發(fā)送時間為2016/3/3 08:03:05,發(fā)送內容為“把你的照片發(fā)過來,我好想你”。 圖15 恢復的刪除短信 相比原方法,利用特征值恢復短信的方式更加精準、適用性更強。 (2)原方法沒有對Data內容進行精確解析,在找到Data區(qū)后將內容直接導出為UTF-8格式的文件。在圖15中,導出的短信內容包含大量冗余信息,而且看不出收發(fā)短信時間(Linux時間戳)和短信ID。本文在獲得信息后,依據(jù)Type字段對Data區(qū)內容逐個解析,可以精準地還原各個項目內容,對取證工作作用更大,見圖16。 圖16 內容不完整短信的恢復 (3)隨著手機的使用,短信數(shù)量日漸增多,系統(tǒng)自動將部分刪除短信移出短信文件“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條刪除短信,包括內容不完整的短信。由此可見,本文的方法在取證效果上達到了預期目的,優(yōu)于目前主流手機取證工具。取證工具的取證方法還是存在不足,取證工具的結果并不完全可靠。在需要借助短信內容輔助偵查的案件中,十分有必要對SQLite數(shù)據(jù)結構進行深入、細致的解析。 圖18 測試結果對比 手機短信是電子數(shù)據(jù)取證工作中最常見的取證對象,只有深入了解存放短信信息的SQLite3數(shù)據(jù)結構,才能很好地恢復刪除的短信,提取隱藏在其中的重要信息。同時提醒我們應該客觀地看待各類取證工具的功效,工具的開發(fā)總是滯后于理論探索的,只有真正了解取證的原理,才能更加有效地完成各類取證工作。 [1]王隨剛,等.基于SQLite3的Android手機數(shù)據(jù)恢復技術的研究 [J].警察技術,2012(5):3-7. [2]馬獲蕾,等.Android系統(tǒng)中SQLite數(shù)據(jù)庫的研究[J].電腦知識與技術,2013(10):6243-6245. [3]姚偉,等.Android手機智能手機的取證[J].中國司法鑒定,2012(1):45-49. [4]堯俊.Android用戶行為重構與分析技術研究[D].杭州:杭州電子科技大學,2013: 5-78. [5]方冬蓉,等.Android系統(tǒng)刪除數(shù)據(jù)恢復方法研究[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 遼寧省社科規(guī)劃項目(編號:L16BFX011)。 高楊 (1981-),男,遼寧錦州人,中國刑事警察學院網(wǎng)絡犯罪偵查系講師,主要從事電子物證方向研究。4 恢復短信效果對比
5 結束語
(Computer Grime Investigation Department of Criminal Investigation Police University of China Liaoning Shenyang 110035)