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