吳玉強 王旭



摘要:目前在我國的手機市場上,智能手機主要以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.
【通聯編輯:王力】