◆王中杉
(四川發(fā)展(控股)有限責(zé)任公司數(shù)字化中心 四川 610041)
隨著計算機(jī)取證的程序化及其技術(shù)的完善,反取證發(fā)展[1]為針對計算機(jī)取證過程的各階段及其形成證據(jù)鏈(Chain of Custody)的條件,破壞電子證據(jù)的調(diào)查、保護(hù)、收集、分析和法庭訴訟,減少被獲取證據(jù)數(shù)量,降低被獲取證據(jù)質(zhì)量,從而盡量隱藏或不在對方系統(tǒng)甚至自己系統(tǒng)中留下法律意義上的證據(jù)。目前,計算機(jī)反取證技術(shù)[2]主要有數(shù)據(jù)擦除、數(shù)據(jù)隱藏、數(shù)據(jù)加密、數(shù)據(jù)重定向等,信息隱藏技術(shù)是將特定信息隱藏在數(shù)字化宿主信息如數(shù)字圖像、音頻及視頻中的方法,如利用小波域的圖像融合算法將特定的信息嵌入到宿主信息中,使載體文件盡可能地不失真并要求具有極高的魯棒性,其對外的表現(xiàn)形式為宿主信息,在沒有經(jīng)過特定處理的情況下明文信息是不可見的,只有將帶有明文信息的宿主信息進(jìn)行分離算法的處理才能將明文信息無損地全部恢復(fù)出來,比如反取證工具Runefs就利用一些取證工具不檢查磁盤的壞塊的特點(diǎn),把存放敏感文件的數(shù)據(jù)塊標(biāo)記為壞塊以逃避取證。
本文主要研究基于文件系統(tǒng)的信息隱藏技術(shù),通過分析NTFS文件系統(tǒng)空閑區(qū)域,設(shè)計了一種快速有效的分區(qū)文件掃描算法,重構(gòu)文件目錄樹結(jié)構(gòu),將所有滿足條件即可隱藏區(qū)域大小超過1KB的正常文件以樹型結(jié)構(gòu)方式展現(xiàn),供用戶合理的選擇一個或者多個文件作為載體,將文件寫入到這些載體的空閑區(qū)域,能快速有效選擇性隱藏文件,并結(jié)合有序規(guī)則的加密算法,實時文件信息隱藏。
MFT[3]是NTFS卷結(jié)構(gòu)的核心,系統(tǒng)通過MFT來確定文件在磁盤上的位置以及文件的所有屬性,MFT是一個與文件相對應(yīng)的文件屬性數(shù)據(jù)庫。文件刪除、修改等操作都直觀反映在MFT表中,通過WinHex軟件可以分析出MFT文件記錄頭與屬性列表,其中屬性頭部標(biāo)識了屬性的類型、屬性數(shù)據(jù)的相對偏移及其長度,屬性數(shù)據(jù)真實反映文件或目錄存放相關(guān)信息。本文重點(diǎn)闡述與反取證密切相關(guān)的10屬性、30屬性、80屬性、90屬性。
(1)10屬性。包括只讀、系統(tǒng)、存檔、隱藏及MAC屬性等基本文件屬性。其中文件相關(guān)的MAC時間即存放在相對屬性值的偏移00H、08H、18H處,均占8個字節(jié)。程序設(shè)計中,采用結(jié)構(gòu)體FILETIME即可存放64bit的MAC時間,然后再調(diào)用Microsoft提供的上層API函數(shù)FileTimeToSystemTime,將UTC時間轉(zhuǎn)換為本地時間即可重現(xiàn)文件的MAC日期及時間。
(2)30屬性。記錄了父目錄的MFT參考號、文件名。MFT參考號即MFT的相對$MFT表的序號,給定一個MFT參考號N,通過公式:N*2+BPB_MFTStartClus * 8,即可求出此文件MFT表項在MFT區(qū)域的物理位置,通過上述方式,在已知父目錄的MFT參考號即可映射到其父目錄的MFT表項位置,從而可獲取父目錄MFT表項的相關(guān)屬性信息,為后續(xù)重構(gòu)已刪除文件目錄樹建立起了溯源支點(diǎn)。
(3)80屬性。用于存放文件真實數(shù)據(jù)或文件數(shù)據(jù)存放的物理偏移位置。80屬性可為常駐屬性或非常駐屬性,取決于文件數(shù)據(jù)大小。當(dāng)文件數(shù)據(jù)很小,當(dāng)文件超出一定大小后,MFT中的80屬性下會采用簇運(yùn)行列表結(jié)構(gòu)(Data Runs List)對文件內(nèi)容進(jìn)行描述。其中80屬性頭偏移20H處的值記錄了數(shù)據(jù)運(yùn)行(Data Runs)的偏移地址;偏移04H處則記錄了屬性的總長度,反映了文件數(shù)據(jù)是否離散存儲、占用的簇數(shù)及其簇的物理偏移位置,其偏移值通過取模運(yùn)算解析,若起始簇號N占1個字節(jié)時且N>0x80H,則取負(fù)值,N=(N mod 0x80)-0x80;若N占2個字節(jié)且N> 0x8000,則N=(N mod 0x8000)-0x8000;若N占3個字節(jié)且N> 0x800000,則N=(N mod 0x800000)-0x 800000;依次類推,準(zhǔn)確解析出每個簇運(yùn)行起始簇偏移。
(4)90屬性。該屬性是實現(xiàn)NTFS的B+樹索引的根節(jié)點(diǎn),包括標(biāo)準(zhǔn)屬性頭、索引根和多個索引項。每個索引項中,偏移00H、10H處分別記錄了此文件的MFT參考號及其父目錄的MFT參考號;偏移08H處則記錄了每個索引項的大小,故,可通過索引項大小轉(zhuǎn)向到下一個索引項,再結(jié)合屬性頭偏移04H處描述的90屬性總長度,獲取該目錄下所有文件及子目錄的MFT參考號。每個索引項中,偏移00H、10H處分別記錄了此文件的MFT參考號及其父目錄的MFT參考號;偏移08H處則記錄了每個索引項的大小,故,可通過索引項大小轉(zhuǎn)向到下一個索引項,再結(jié)合屬性頭偏移04H處描述的90屬性總長度,即可獲取該目錄下的所有文件及子目錄的MFT參考號。在程序設(shè)計中,可通過讀取INDX索引結(jié)構(gòu),獲取任一指定目錄下的所有文件及其子目錄。
本文提到,非常駐80屬性通過簇運(yùn)行列表(Data Runs List)反映了文件數(shù)據(jù)是否離散存儲、占用的簇數(shù)及其簇的物理偏移位置,而文件大小正好為簇大小整數(shù)倍概率太小,文件末簇往往存在幾個空閑扇區(qū),將分區(qū)下所有的類似文件遺留的空間累加,將會是一個很大的空閑空間,足以被利用以存放大量的隱私信息。在程序上可遍歷整個分區(qū)下的所有MFT表項,MFT表項的80屬性下存放了指定文件的實際大小:相對80屬性頭偏移0x30位置的4字節(jié)內(nèi)容即為文件實際大??;而文件所占簇數(shù)則存放在80屬性的DataRuns簇運(yùn)行結(jié)構(gòu)列表中。根據(jù)文件實際大小和文件所占簇數(shù),即可確定文件末簇空閑空間大小,實現(xiàn)信息隱藏。寄宿文件可隱藏區(qū)域大小和隱藏起始扇區(qū)可依據(jù)以下兩個公式獲?。篋=R -F mod R;Sr=C -D/ Sec。其中R、F、C、Sec分別為每簇大小、文件實際大小、文件所占簇數(shù)和每扇區(qū)大小。
(1)收集滿足條件的寄宿文件。通過遍歷NTFS卷下所有的MFT表項,判斷文件是否為正常文件及文件名、文件數(shù)據(jù)起始簇號、簇數(shù)等。在遍歷算法上,采用了目錄樹倒序構(gòu)建算法,即從目錄樹的底部開始逐漸往上構(gòu)建整個目錄樹,而不是循規(guī)蹈矩地從90屬性開始依次獲取根目錄下所有的子文件及其子目錄,實際上這種方式行不通,因為當(dāng)分區(qū)長時間未經(jīng)過磁盤整理,即分區(qū)下存在大量零散文件碎片時,INDX結(jié)構(gòu)就有可能發(fā)生偏差,即通過MFT參考號的偏移位置定位將會出錯。
算法基本流程如下所示:
1)讀取$MFT表項中80屬性下的簇運(yùn)行列表,獲取每個簇運(yùn)行結(jié)構(gòu)的起始簇號與簇數(shù),再根據(jù)首簇號和簇數(shù),循環(huán)遍歷NTFS卷下每個簇運(yùn)行結(jié)構(gòu)中所有的MFT表項。
2)讀取MFT表頭,判斷文件及目錄是否為正常文件,若文件已刪除或者為目錄文件,則轉(zhuǎn)下一個表項;不然,則獲取表項中30屬性下的文件名或目錄名及父目錄的MFT參考號。
3)若父目錄的MFT參考號不是0x05(即根目錄下的文件或子目錄),則轉(zhuǎn)步驟4;然后再判斷此MFT對應(yīng)的是文件還是目錄,若為非目錄文件,則讀取80屬性值,獲取文件數(shù)據(jù)或文件數(shù)據(jù)的首簇號及簇數(shù),存儲到新節(jié)點(diǎn)結(jié)構(gòu)體中,然后將此節(jié)點(diǎn)插入目錄樹中;若為目錄文件,則直接將此節(jié)點(diǎn)插入目錄樹中。
4)根據(jù)父目錄的MFT參考號,讀取每個父目錄的MFT參考號,獲取目錄的文件名,然后再調(diào)用搜索函數(shù),在已部分構(gòu)建的目錄樹中尋找此文件是否在目錄樹中,若沒有搜索到,則新建一個新節(jié)點(diǎn),并將文件的文件名、文件及父目錄的MFT參考號分別保存在該節(jié)點(diǎn)中,再判斷此目錄是否為根目錄,若非,則保存此節(jié)點(diǎn)到目錄樹結(jié)構(gòu)體的Vector數(shù)組中然后遞歸調(diào)用,轉(zhuǎn)步驟(4)繼續(xù)讀取其父目錄的MFT號,若為根目錄,則將此節(jié)點(diǎn)插入目錄樹合適節(jié)點(diǎn)下。算法流程圖如圖1所示:
圖1 寄宿文件目錄樹重構(gòu)算法
(2)通過有序規(guī)則二叉樹重構(gòu)寄宿文件目錄樹。針對海量文件節(jié)點(diǎn),設(shè)計一種良好算法加速構(gòu)建多層次性目錄樹至關(guān)重要,因為每次對目錄樹進(jìn)行先序遍歷時,總是涉及節(jié)點(diǎn)的入棧與出棧操作,對目錄樹的搜索次數(shù)也是極頻繁,若目錄樹本身缺失規(guī)則,搜索重構(gòu)效率極低。本文設(shè)計了一種規(guī)則二叉樹構(gòu)建算法,如圖2所示:
圖2 有序規(guī)則二叉樹的重構(gòu)模型
1)圖中各節(jié)點(diǎn)代表目錄或滿足條件的寄宿文件,且節(jié)點(diǎn)左子節(jié)點(diǎn)稱為該節(jié)點(diǎn)的孩子結(jié)點(diǎn),位于該節(jié)點(diǎn)的下一級目錄。右節(jié)點(diǎn)則與該節(jié)點(diǎn)位于同一級目錄。
2)頭節(jié)點(diǎn)A不代表任何含義,只為目錄樹的頭節(jié)點(diǎn),且節(jié)點(diǎn)C、G均為根目錄下節(jié)點(diǎn)。節(jié)點(diǎn)B、E、M都為節(jié)點(diǎn)A的子節(jié)點(diǎn),處于同一層目錄。
3)若E節(jié)點(diǎn)為非目錄文件,則M及其各右子節(jié)點(diǎn)均為非目錄節(jié)點(diǎn),即位于同一層的節(jié)點(diǎn),目錄節(jié)點(diǎn)總是在非目錄節(jié)點(diǎn)的前面,每次目錄節(jié)點(diǎn)采用首插法,而文件節(jié)點(diǎn)采用尾插法。
通過上述算法設(shè)計,可極大地減少了目錄樹重構(gòu)的時間,因為分區(qū)下存在的非目錄文件總是遠(yuǎn)遠(yuǎn)超出目錄文件樹,若當(dāng)發(fā)現(xiàn)此文件為目錄文件時,則完全沒有必須考慮待搜索的非目錄文件節(jié)點(diǎn)。另一方面,在實施隱藏技術(shù)上當(dāng)待隱藏文件較大時,傳統(tǒng)的隱寫技術(shù)需要大量開銷去選擇合適大小的載體,且一旦被對方識破此手法,則會變得毫無價值[4]。
前面已經(jīng)分析了如何快速尋找寄宿文件,并按照目錄樹結(jié)構(gòu)方式可視化展示,便于結(jié)合隱藏文件大小合理隱藏文件,但目前也存在一些取證軟件,結(jié)合EasyRecovery、FileRecovery軟件技術(shù),能夠合理推演出文件存在異常,比如文件頭標(biāo)識為刪除,文件大小與實際內(nèi)容大小不一致等問題。為更好地躲避黑客們開展較為專業(yè)化的技術(shù)性分析取證,本文探索結(jié)合加密算法對隱藏文件采用DES、RSA加密算法對文件加密后,再按照一定規(guī)則離散,然后分散存儲到寄宿文件中,確保文件安全。本文采用了一種基于有序規(guī)則的加密算法進(jìn)行預(yù)處理,然后再進(jìn)行嵌入,即嵌入的數(shù)據(jù)是亂序的密文。
算法流程說明:
(1)首先對特定文件明文信息P進(jìn)行加工處理,采用通信雙方約定的協(xié)議(構(gòu)建規(guī)則表),規(guī)則表的構(gòu)建采用RSA、Elgama等公鑰加密體制協(xié)商,為保證協(xié)商規(guī)則具有不被黑客竊取及抗抵賴性等特點(diǎn),引入數(shù)字簽名技術(shù)。
(2)通信雙方約定好有序規(guī)則表后,發(fā)送方按照規(guī)則表,對特定信息逐比特進(jìn)行調(diào)整,使特定信息按照已定規(guī)則重排,輸出重構(gòu)后的數(shù)據(jù)文件Pn。
(3)通信雙方再次約定加密密鑰及加密算法,約定規(guī)則同(2)。
(4)發(fā)送方依據(jù)約定好的加密算法及密鑰,對數(shù)據(jù)文件Pn進(jìn)行加密處理,輸出密文文件Cb,再通過互聯(lián)網(wǎng)發(fā)送給接受方。
在軟件設(shè)計與編碼中,基于采用異或運(yùn)算,基于CBC模式的DES加密算法實現(xiàn),異或運(yùn)算規(guī)則:
其中,M代表前一個字節(jié),N代表文本的最后一個字節(jié),隨后依次向文件數(shù)據(jù)的中央靠攏,直到所有的字節(jié)全部交換完成。
構(gòu)建規(guī)則表加密函數(shù)算法:
密鑰存放與提取的設(shè)計上,使用了一種圖像特征提取方法,即發(fā)送方在圖像隱寫前,從載體圖像中提取特征作為密鑰,用來加密秘密圖像,提取方提取加密圖像后,從含密圖像中提取特征作為密鑰解密加密圖像。
結(jié)合上面的理論分析,筆者開發(fā)設(shè)計了一款基于NTFS分區(qū)的數(shù)據(jù)隱藏反取證軟件。通過對不同容量的分區(qū)和分區(qū)下存放文件的數(shù)量,對軟件的掃描速度進(jìn)行了對比測試,采用Intel(R)i5 CPU @ 2.70GH電腦測試,分區(qū)容量20GB,文件個數(shù)2萬,時間開銷約為30s.文件掃描及重構(gòu)開銷略優(yōu)于EasyRecovery軟件。在搜索已刪除文件上,由于本文在隱藏文件時,對已刪除文件標(biāo)識、文件大小進(jìn)行了改寫,EasyRecovery軟件在磁盤文件全量搜索上也沒有再匹配到寄宿文件,較好地躲避了文件搜索,避免了寄宿文件被標(biāo)識為已刪除文件,導(dǎo)致文件被二次覆寫的可能。
文件隱藏與加密技術(shù)較多,很多學(xué)者選擇大圖像文件作為寄宿文件主體,如用結(jié)合圖像加密和深度學(xué)習(xí)的高容量圖像隱寫算法實施隱藏[5]。本文主要論述了基于NTFS文件系統(tǒng)的反取證技術(shù),提出了一種利用正常文件所占的實際空閑磁盤空間,實施文件隱藏新方法,通過有序規(guī)則二叉樹重構(gòu)寄宿文件目錄樹,采用倒敘目錄樹方式,搜索遍歷的文件及目錄,極大減少深層次遞歸函數(shù)去讀取其對應(yīng)的父目錄及深層次父目錄的節(jié)點(diǎn)信息次數(shù),快速計算出每個寄宿文件的可隱藏區(qū)域大小及隱藏區(qū)域的起始扇區(qū)數(shù),以準(zhǔn)確將機(jī)密文件嵌入到指定區(qū)域,并結(jié)合更探索結(jié)合加密算法對隱藏文件采用DES、RSA加密算法對文件加密,每個分組塊的密文首先與下一個分組塊的明文進(jìn)行異或運(yùn)算,然后再作為加密的輸入塊進(jìn)行加密,再按照一定規(guī)則離散,然后分散存儲到寄宿文件中,有效地增大了密碼分析的難度,確保文件安全,可更好地躲避黑客們開展較為專業(yè)化的技術(shù)性分析取證。
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2022年8期