2.2 Sleuth Kit Library 用戶手冊
用戶指南描述了TSK的各個組件以及如何使用它們。它通過指向API參考中的詳細信息的鏈接來引用特定的功能和數據結構。此文檔是對4.10.0版本的編寫。
Library基礎
該頁面描述了TSK庫的一些基本概念。假定您已根據INSTALL.txt文件中的說明或通過軟件包構建并安裝了TSK庫。請參考示例目錄中的文件,以獲取有關本節和后續節中主題的示例。
層數
TSK分為幾層(和子層)。這些層表示與數據存儲一起使用的抽象層。用戶指南和API參考是根據這些層進行組織的。
TSK的最低層是基礎層,它包含可應用于所有層的通用編程和數據結構功能。在這里定義錯誤處理,類型和便利功能。
下一層是磁盤映像層,它允許打開和處理各種格式的磁盤映像。該層從其他層隱藏與拆分,壓縮和加密的圖像文件關聯的詳細信息。必須先由“磁盤映像層”功能打開所有磁盤映像,然后才能被其他層處理。
下一層是卷系統層。該層專注于將數據作為卷系統處理,例如DOS分區表或BSD磁盤標簽結構。如果要分析的磁盤映像上有一個卷系統,那么這組功能將告訴您其分區的開始和結束位置。
下一層是文件系統層。該層專注于將數據作為文件系統(例如FAT或NTFS)進行處理。文件系統可以位于分區中,也可以是完整的磁盤映像文件。這些功能集使您可以從文件系統,列表文件和打開的文件中讀取任意數據。文件系統層中有幾個子層,它們在文件系統層中進行了描述。
有一個獨立的hash數據庫層處理hash數據庫,例如NSRL和md5sum輸出。使用此API,您可以創建hash索引并對其進行快速查找。這些功能不依賴于磁盤映像,卷系統或文件系統層。
還有一個自動化層,以自動化方式集成了所有先前的層。它定義了一個名為TskAuto的C ++類,該類隱藏了許多有關分析文件和卷系統的細節。
這些層之間的關系的基本示意圖如下所示。請注意,如果磁盤映像文件沒有卷系統,那么我們可以直接在其上使用文件系統層功能。

搭建環境
本節介紹如何將TSK庫合并到您的應用程序中。通常,您需要做的就是在庫中包含TSK頭文件和鏈接。
Unix系統
本文檔假定您用于'make install'安裝庫和頭文件,并且使用的默認位置為/usr/local/。如果指定了其他位置,則需要在本文檔中進行明顯的路徑替換。
要包含API定義,您需要tsk/libtsk.h在源代碼中包含文件。根據系統配置,您可能需要添加/usr/local/include到編譯器查找頭文件的目錄列表中(-I例如,使用)。
#include <tsk/libtsk.h>
要在鏈接階段將庫包含在應用程序中,您將需要添加-ltsk添加libtsk庫。根據系統配置,您可能需要添加/usr/local/lib/到編譯器在其中查找庫的目錄列表(-L例如,使用)。
請注意,如果您使用對AFFLIB和libewf的支持構建了TSK,則還需要包含-lewf和/或-lafflib。您可能還需要包括AFFLIB和libewf所需的其他庫(我當前的系統需要-lcrypto -lssl -lz -lncurses -lreadlin)。有關詳細信息,請參見libewf和AFFLIB文檔。
Windows
Windows安裝程序與Unix安裝程序類似,不同之處在于您需要包括更多的庫,并且沒有自動安裝或構建過程。
Visual Studio解決方案文件位于中win32/tsk-win.sln。有一個libtsk針對五個庫層的項目。建立這個在創造一個靜態庫Debug,Release或Debug_NoLibs文件夾。該Debug_NoLibs配置對libewf或afflib沒有任何依賴關系。
要包含頭文件,請配置構建環境以在TSK根目錄(即sleuthkit-3.0.0)中進行搜索,并將該tsk/libtsk.h文件包含在源代碼中。TSK目錄的位置取決于您將其解壓縮的位置。
要與庫鏈接,必須將環境配置為包括libtsk庫。您將需要指定庫所在的目錄,該目錄可以是目錄中的Debug或Release子目錄win32。您也可以將庫移動到其他位置。
請注意,您的Windows應用程序必須啟用UNICODE支持。
C ++包裝器
幾乎所有的TSK代碼都是用C編寫的,原始的API是C函數和結構的集合。也有一些C ++類封裝了C代碼。C ++類分配C結構并提供getter和setter方法來訪問公共數據。本文檔的其余部分主要涉及C函數,但是如果存在,將提供指向相應C ++類的鏈接。
基本功能
本節描述了所有其他層通用的一些基本API函數和概念,例如錯誤和Unicode處理。除了本文檔之外,TSK 的示例目錄中還有一些示例程序,這些示例程序顯示在處理磁盤映像時正在使用的這些功能。
編碼方式
總覽
TSK支持Unicode卷或文件系統數據,并且可以處理包含非拉丁字符的磁盤映像文件。本節描述如何完成。
TSK在Unix和Windows系統上均可運行,這兩個系統在存儲Unicode的方式上有所不同。Unicode字符有幾種存儲方法。UTF-16方法使用2字節或4字節存儲字符(盡管大多數字符可以2字節存儲)。UTF-8是根據字符使用1到4字節的方法。UTF-8與ASCII向后兼容,因為ASCII字符僅需要1個字節。
FAT和NTFS文件系統將文件名存儲在UTF-16中,而UFS和Ext2 / 3將文件名存儲在UTF-8中。Unix內部使用UTF-8來存儲Unicode文本,而Windows使用UTF-16(如果啟用了UNICODE)。為了支持在Unix和Windows上運行,并支持來自Unix和Windows的文件系統,TSK必須在UTF-8和UTF-16之間轉換。
在內部,所有TSK數據結構都將文本存儲在UTF-8中。例如,NTFS中的UTF-16文件名將轉換為UTF-8。但是,用于打開磁盤映像的Windows函數要求文件名必須為UTF-16。為了解決這個問題,特殊數據類型(如下一節所述)用于在本地存儲方法中處理磁盤映像和本地文件名。
特殊數據類型(TSK_TCHAR)
在編譯時,TSK_TCHAR在Windows系統上定義為UTF-16寬字符,在Unix系統上定義為UTF-8字符。此數據類型用于存儲磁盤映像文件名和其他可能需要解析的命令行參數。
有許多有助于處理TSK_TCHAR字符串的定義,例如TSTRLEN,它映射到適當的函數以查找字符串的長度。還有一些函數可用于在UTF-8和UTF-16之間轉換(請參閱 tsk_UTF16toUTF8()和 tsk_UTF8toUTF16())。
注意,在某些環境中,很難使用TSK_TCHAR設計。例如,如果您在Windows環境中將所有字符串存儲在UTF-8中。一些將TSK_TCHAR作為參數的函數已被擴展為具有采用特定編碼的版本。這些是根據需要添加的,因此,sleuthkit-developers < at > lists < dot > sourceforge < dot > net如果您發現更多需要更新的信息,請發送電子郵件至。
錯誤處理
公共API函數都返回一個值來指示何時發生錯誤。可以通過讀取全局tsk_errno值來了解有關錯誤的更多詳細信息。這將是幾個預定義的錯誤代碼之一。可以使用能夠獲得的誤差的說明tsk_error_get()函數或可以使用被打印到文件處理錯誤tsk_error_print()。C ++包裝器是TskError類。
Miscellaneous Utilities
TSK庫包含一些基本的實用程序結構和功能,可用于管理列表和堆棧。這些在內部使用,并且為方便起見是公共API的一部分。
該TSK_LIST結構用于保持跟蹤在處理已看到的值。使用tsk_list_add()將值添加到列表中。可以使用搜索的列表tsk_list_find()使用和關閉tsk_list_free() 。
TSK_STACK結構用于在遞歸到目錄時防止無限循環。堆棧可以使用創建tsk_stack_create()和數據可以使用壓入和彈出tsk_stack_push()和tsk_stack_pop() 。要搜索堆棧,請使用tsk_stack_find(),并使用tsk_stack_free()釋放堆棧。遞歸目錄時,在分析目錄時,目錄的元數據地址會存儲在堆棧中,并在完成目錄后彈出。
hash算法
TSK庫包括對計算MD5和SHA-1 hash的支持。要計算MD5 hash,必須首先使用TSK_MD5_Init()初始化上下文。使用TSK_MD5_Update()將數據添加到上下文,并通過調用TSK_MD5_Final()來計算hash。使用TSK_SHA_Init(),TSK_SHA_Update()和TSK_SHA_Final()的 SHA-1 hash也使用類似的過程。
版本
要以字符串形式獲取TSK庫的版本號,可以使用所有tsk_version_get_str()函數來獲取字符串表示形式。或者,您可以調用tsk_version_print()將庫名稱和版本打印到FILE句柄。該版本還有#define,以字符串(在TSK_VERSION_STR中)和數字(在TSK_VERSION_NUM中)定義。
磁盤映像
本節介紹了TSK中的常規磁盤映像分析概念和相應的API。除了本文檔之外,TSK 的示例目錄中還有一些示例程序,這些示例程序顯示在處理磁盤映像時正在使用的這些功能。
打開磁盤映像
在可以分析卷和文件系統結構之前,必須先打開磁盤映像。tsk_img_open()函數用于打開一個或多個磁盤映像文件。可以指定文件格式,或者將使用自動檢測方法。如果無法確定特定類型,則將采用原始類型。請注意,默認情況下,TSK僅支持單個和拆分的原始圖像。僅當建立和安裝TSK時存在并配置了相應的庫時,才支持其他文件格式,例如AFF和EWF。如果僅打開單個磁盤映像文件(即未拆分),則可以使用tsk_img_open_sing()函數。它需要較少的參數。
tsk_img_open()函數返回TSK_IMG_INFO結構。此結構的字段包含磁盤映像的類型和大小(未壓縮,如果適用)。分析完磁盤映像后,可以使用tsk_img_close()將其關閉。
請注意,tsk_img_open()和tsk_img_open_sing()函數使用TSK_TCHAR類型存儲磁盤映像路徑。此類型取決于系統,在Windows上是wchar_t,在其他系統上是char。有關更多詳細信息,請參見\ ref basic_enc_t。如果您所在的環境甚至在Windows中也將具有UTF-8文本,則可以使用tsk_img_open_utf8()和tsk_img_open_utf8_sing()函數。
要使用C ++包裝器,請創建一個TskImgInfo對象并調用TskImgInfo :: open()方法之一。
檔案格式類型
有幾種功能可用于在文件格式類型的名稱和ID之間進行映射。在內部,TSK函數為每種類型使用數字ID。tsk_img_type_toname()函數將ID映射到單個單詞名稱(例如“ raw”),而tsk_img_type_todesc()函數將ID映射到更長的描述(例如“單個原始文件”)。當用戶指定類型并且tsk_img_type_toid()函數將短名稱映射到ID時,在TSK命令行工具中使用該短名稱。
還有一些功能可以識別安裝支持的文件格式。tsk_img_type_supported()函數返回受支持類型的ID。tsk_img_type_print()將支持的類型名稱和描述打印到句柄。命令行工具使用此功能將支持的類型打印到控制臺。
讀取數據
要從磁盤映像讀取數據,請使用tsk_img_read()函數。該函數可以從任意字節偏移量讀取任意數量的數據。C ++類具有公共讀取方法TskImgInfo :: read()。
Volume Systems
本節描述了TSK中的常規卷系統分析概念和相應的API。除了本文檔之外,TSK 的示例目錄中還有一些示例程序,這些示例程序顯示在處理磁盤映像時正在使用的這些功能。
Opening the Volume System
Once the disk image has been opened, you can start to analyze it. If you have a physical disk image then you will need to check if a volume system exists. Volume systems organize contiguous sectors on a disk into volumes. Use TSK to determine the type of volume system that a disk is using and to determine the volume layout. Note that some USB storage devices and floppy disks do not have volume systems.
Volume System Types
磁盤映像打開后,您可以開始對其進行分析。如果您有物理磁盤映像,則需要檢查是否存在卷系統。卷系統將磁盤上的連續扇區組織為卷。使用TSK來確定磁盤正在使用的卷系統的類型并確定卷布局。請注意,某些USB存儲設備和軟盤沒有卷系統。
第一步是使用tsk_vs_open()函數打開卷系統。此函數將偏移量作為參數。TSK使用此偏移量開始尋找卷系統。通常,應使用偏移量0。該函數返回一個TSK_VS_INFO結構,該結構具有卷系統類型和卷數(也稱為分區)的值。使用tsk_vs_close()函數關閉卷系統。
C ++包裝器使用TskImgInfo類,該類具有與前面描述的方法類似的TskImgInfo :: open()和TskImgInfo :: close()方法。
Volume System Types
tsk_vs_open()可以檢測卷系統的類型,但是有時您可能需要指定它(例如,如果TSK檢測到多個卷系統結構),或者您可能希望打印卷系統類型的名稱。在內部,TSK對每種卷系統類型使用數字ID。要將數字ID映射為短名稱(例如“ dos”),可以使用tsk_vs_type_toname()函數。要將ID映射到更長的描述(例如“ DOS分區表”),請使用tsk_vs_type_todesc()函數。您還可以使用tsk_vs_type_toid()函數將短名稱映射為ID。
要確定受支持的卷系統的ID,可以使用tsk_vs_type_supported()函數。
訪問單個卷
tsk_vs_open()返回的TSK_VS_INFO結構適用于卷系統中的所有卷。將為每個卷分配一個從0開始的地址。有兩種訪問各個卷的一般方法。tsk_vs_part_get()返回有關特定卷的信息,而tsk_vs_part_walk()函數將遍歷指定范圍的卷,并使用有關每個卷的數據調用回調函數。
無論使用哪種方法,都將使用TSK_VS_PART_INFO結構來描述每個卷。此結構具有卷起始偏移量(相對于磁盤映像的起始位置),長度和類型的字段。C ++包裝器具有一個TskVsPartInfo類,該類包裝了TSK_VS_PART_INFO結構。
TSK定義了幾種卷類型。\ b分配的卷是由卷系統定義的卷。分配的卷在卷系統的分區表中具有??一個條目。\ b未分配的卷包含未分配給卷系統中的卷的扇區。例如,如果一個卷的扇區為0到9,而另一個卷的扇區為50到99,則TSK將為扇區10到49創建一個未分配的卷。請注意,這些卷實際上是由TSK創建的,它們未在卷系統中定義。已分配和未分配的卷將覆蓋整個磁盤映像。
卷的第三種類型是元數據卷。\ b元數據卷包含存儲卷系統數據的扇區,例如分區表。對于某些卷系統,元數據卷將與已分配的卷重疊(因為那些卷系統為元數據結構“分配”了空間)。在其他卷系統中,元數據卷將與未分配的卷重疊(因為那些卷系統將元數據存儲在未使用的空間中)。
通常,您需要將已分配卷中的數據作為文件系統進行分析,并使用文件雕刻或其他數據恢復技術來分析未分配卷中的數據。在許多情況下,您可以忽略元數據卷。如果使用的是tsk_vs_part_walk()函數,則可以指定要通過回調返回的分區類型。
讀取數據
有三種從卷系統讀取數據的方法。tsk_vs_read_block()函數使用相對于卷系統開始的扇區地址讀取扇區。但是,要使用相對于特定卷起始位置的地址讀取扇區,請使用tsk_vs_part_read_block()函數。要以非扇區大小的塊讀取卷中的數據,請使用tsk_vs_part_read()函數。
C ++ TskVsInfo和TskVsPartInfo類具有讀取方法,該方法允許從卷系統的開始或卷內部讀取數據。
文件系統
本節描述了TSK中的常規文件系統分析概念和相應的API。除了本文檔之外,TSK 的示例目錄中還有一些示例程序,這些示例程序顯示在處理磁盤映像時正在使用的這些功能。
一般概念
文件系統層
文件系統是存儲在磁盤或卷中的數據結構的集合,允許您保存和打開文件。有許多不同的文件系統,它們都有獨特的數據結構,但是有一些通用概念適用于所有文件系統。在TSK中使用這些通用概念來提供對各種文件系統的通用訪問。
TSK將文件系統中的數據分為五類:文件系統,數據單元,元數據,文件名和應用程序。可以將所有數據歸類為以下之一:
文件系統類別:此類別中的數據描述文件系統的布局和一般功能。例如,每個數據單元有多大,有多少個數據單元。
數據單元類別:此類別包含文件系統中可以存儲文件內容的數據單元(即塊和群集)。數據單元的大小是固定的,大多數文件系統要求它的大小為2、1024或4096字節。
元數據類別:這是存儲有關文件和目錄的描述性數據的位置。該層包括UNIX中的inode結構,NTFS中的MFT條目以及FAT中的目錄條目結構。該層包含諸如上次訪問時間,權限以及由文件或目錄分配的數據單元的指針之類的信息。此類別中的數據完全描述了一個文件,但是通常給它一個難以記住的數字地址。
文件名類別:這是保存文件或目錄的實際名稱的位置。通常,這是與元數據結構不同的結構。FAT文件系統是一個例外。文件名通常存儲在父目錄的數據結構中。數據結構包含指向元數據結構的指針,該元數據結構包含其余的文件信息。
應用程序類別:這是一堆非必需的文件系統數據所在的位置。這些功能使文件系統和操作系統的工作更加輕松。示例包括記錄文件系統更新的日志以及記錄最近更新了哪些文件的列表。
此處顯示了不同類別的基本ASCII圖。文件系統類別標識文件名,元數據,數據單元和應用程序類別的位置。然后,文件名指向元數據,而元數據指向數據單元。

命令行工具和文件系統API均基于這些層進行組織。可以直接訪問每一層上的數據,并且某些功能可以組合各層。
刪除文件
刪除文件后,其數據單元,元數據結構和文件名結構通常會標記為空閑,并且在創建新文件時可以重用它們。它們很容易在不同的時間重新分配,因此在解釋與已刪除文件關聯的數據時必須小心。
當遇到未分配的文件名時,請檢查其指向的元數據結構的分配狀態。如果分配了元數據結構,則在移動文件且未分配名稱為舊文件名時,要么將元數據結構重新分配給新文件,要么創建未分配文件名。通常,沒有辦法在這兩種情況之間進行區分(NTFS例外,它包含每次重新分配元數據結構時都會增加的序列號)。在這種情況下可以應用的一項測試是將文件名結構中報告的類型(即文件或目錄)與元數據結構中報告的類型進行比較。如果一個是目錄,一個是文件,則元數據結構已重新分配。
當您遇到未分配的元數據條目時,可能不再有指向它的文件名結構。這些稱為孤立文件。您仍然可以通過它們的元數據地址訪問它們,但是它們的完整路徑將是未知的。TSK創建了一個特殊的目錄來存儲孤立文件,以便可以輕松訪問它們。
打開文件系統
通常,文件系統存在于卷中,但它也可以單獨存在于磁盤(例如USB驅動器,CD-ROM或軟盤)上。您可能還擁有僅一個分區的映像文件(即邏輯映像)。由于存在這些不同的方案,TSK具有兩個打開文件系統的功能。
該 tsk_fs_open_img()功能可讓您只使用一個,打開一個文件系統 TSK_IMG_INFO結構和偏移。偏移量指示文件系統在映像中啟動的位置。為方便起見,還提供了tsk_fs_open_vol()函數,該函數將 TSK_VS_PART_INFO 結構作為參數,并根據體積信息確定偏移量。
這兩個函數都返回一個 TSK_FS_INFO 結構,該結構用作更詳細的文件系統分析的句柄。使用 tsk_fs_close()函數關閉文件系統。該 TSK_FS_INFO 結構包含有關的數據單元的數量,元數據結構的數目等數據
C ++包裝器使用 TskFsInfo 類,并且具有打開方法來打開文件系統。
文件系統類型
打開文件系統的功能可以檢測文件系統類型,但是有時您可能需要指定它(例如,如果TSK檢測到多個文件系統結構)。在內部,TSK為每個文件系統類型使用數字ID(TSK_FS_TYPE_ENUM),該數字ID存儲在TSK_FS_INFO :: ftype中。
如果您具有TSK_FS_INFO結構,并且想知道它的文件系統類型,則可以將TSK_FS_INFO :: ftype值傳遞給TSK_FS_TYPE_ISXXX宏之一,例如TSK_FS_TYPE_ISNTFS()。
如果[TSK_FS_TYPE_ISNTFS](fs_info-> ftype)){
….
}
要將數字ID映射為短名稱(例如“ ntfs”),可以使用tsk_fs_type_toname()函數。您還可以使用tsk_fs_type_toid()函數將短名稱映射到ID 。
要確定受支持的文件系統的ID,可以使用tsk_fs_type_supported()函數。可以使用tsk_fs_type_print()函數將支持的類型的名稱和描述打印到打開的FILE句柄中。
讀取通用文件系統數據
正如您將看到的,有很多方法可以訪問不同類別的文件系統數據。最通用的方法之一是使用 tsk_fs_read()函數。它只需要相對于文件系統開始的字節偏移量,以及將數據讀入其中的緩沖區。它不關心塊地址或文件。在以下各節中,此函數有一些更智能的版本,它將以塊地址作為參數,而不是字節偏移量。
所述 TskFsInfo::read() 方法允許使用C ++類被讀取的數據。
打開和讀取文件系統塊
TSK允許您讀取文件系統中任何塊的內容。每個數據單元的大小在 TSK_FS_INFO :: block_size 字段中定義,數據單元的數量(由文件系統定義)在 TSK_FS_INFO :: block_count 字段中定義。第一個塊的地址在 TSK_FS_INFO :: first_block中定義,而最后一個塊地址(由文件系統結構定義)在 TSK_FS_INFO :: last_block中定義。在某些情況下,圖像可能不完整,并且可以讀取的最后一個塊小于 TSK_FS_INFO :: last_block。在這種情況下,TSK_FS_INFO :: last_block_act”最后一個塊的地址–調整為等于圖像或體積中的最后一個塊(如果是im …”)包含圖像中的實際最后一塊。當last_block_act小于last_block時,表示圖像不完整。
您可以通過調用tsk_fs_block_get()函數來獲取特定塊的內容。它返回一個TSK_FS_BLOCK結構,其中包含數據單元的內容以及有關其分配狀態的標志。您必須通過調用tsk_fs_block_free()釋放[ TSK_FS_BLOCK結構。
您還可以通過調用 tsk_fs_block_walk()遍歷數據單元。此函數將在滿足特定條件的數據單元上調用回調函數。例如,如果您只想關注已分配或未分配的數據單元,則步行很有用。
您還可以使用 tsk_fs_read_block()函數讀取數據單元的內容,該函數將數據塊(根據其數據單元地址)讀取到緩沖區中。tsk_fs_read_block(不提供數據單元的分配狀態,因此如果您只想要內容,則它比tsk_fs_block_get()更有效。
TskFsInfo C ++類中存在類似的方法。TSK_FS_BLOCK的C ++包裝器是TskFsBlock類。
此處應提及一種FAT文件系統特定的內容。FAT將其文件內容存儲在群集中,但是第一個群集不從文件系統的開頭開始。通常在它之前有許多兆字節的數據(FAT表)。如果TSK將群集用作標準數據單元,則它將無法在第一個群集之前對扇區進行尋址,并且需要存在一個混亂的尋址方案,以便可以訪問所有數據。為簡單起見,TSK在FAT文件系統的任何地方都使用扇區地址。TSK API使用的所有數據單元地址都在512字節的扇區中 TSK_FS_INFO :: block_size。
打開和讀取文件
Opening a File
使用TSK,您可以從元數據或文件名層打開文件。要在元數據層打開,您需要文件的元數據地址。要在文件名層打開,需要文件名。
無論使用哪種方法打開文件,都將返回 TSK_FS_FILE 結構。該結構可以指向 TSK_FS_NAME和 TSK_FS_META 結構,它們存儲文件和元數據類別數據。
所述tsk_fs_file_open_meta()函數獲得一個元數據地址作為參數并返回一個TSK_FS_FILE結構。由于未使用文件名打開文件,因此TSK_FS_FILE :: name指針將為NULL,并且為了提高效率,TSK不會搜索目錄樹來查找指向元數據地址的文件名。文件系統中的第一個和最后一個元數據地址在TSK_FS_INFO :: first_inum 和TSK_FS_INFO :: last_inum中定義。
所述 tsk_fs_file_open()函數獲得一個文件名作為參數,并首先識別所述元數據的地址,文件名點。然后,它調用 tsk_fs_file_open_meta()。請注意,如果你知道某個文件的元數據地址,然后使用 tsk_fs_file_open_meta()是更有效的再 tsk_fs_file_open(),因為你可以跳過的文件名映射到元數據地址的過程。如果使用 tsk_fs_file_open(),則將使用名稱詳細信息填充TSK_FS_FILE :: name結構。
該 TSK_FS_FILE結構可用于讀取文件的內容和它的字段可以被用于處理。該結構必須使用 tsk_fs_file_close()關閉。
C ++包裝器使用TskFsFile類。它具有開放方法,可打開和讀取文件。
文件內容
具有 TSK_FS_FILE 結構后,有兩種基本方法可讀取文件內容。您可以使用 tsk_fs_file_read()從文件中的特定偏移量將數據讀取到緩沖區中。您還可以使用 tsk_fs_file_walk()函數,該函數將回調函數作為參數,并將使用文件中每個數據單元的內容來調用回調。
請注意,有幾種存儲文件內容的方法。例如,NTFS可以壓縮形式存儲內容,并且可以將少量數據存儲在元數據結構內部的緩沖區中(而不是分配完整的數據單元)。將為 tsk_fs_file_walk()的回調提供數據的來源地址,但如果TSK_FS_BLOCK_FLAG_ENUM標志用于稀疏,壓縮或非駐留文件,則該回調為0,并且不相關。
屬性
TSK允許每個文件具有多個屬性。屬性只是一個數據容器。大多數文件系統中的文件只有一個屬性,用于存儲文件內容。NTFS文件將具有多個屬性,因為NTFS將文件名,日期和其他信息存儲在不同的屬性中。TSK將UFS和ExtX間接塊存儲在單獨的屬性中。使用TSK,您可以讀取所有屬性。
每個屬性都有一個類型和一個ID。這些類型在TSK_FS_ATTR_TYPE_ENUM結構中定義,并且ID是該文件唯一的整數。一個文件可以具有相同類型的多個屬性,但是只能具有一個具有給定ID的屬性。
先前提供的TSK API將使用默認屬性。許多API都有一個變體,可讓您指定特定的屬性類型和ID。例如,tsk_fs_file_read_type()具有與 tsk_fs_file_read()相同的基本操作,不同之處在于它允許調用者指定類型和ID。也有 tsk_fs_file_walk_type()函數是更為具體的版本tsk_fs_file_walk()函數。
Attributes屬性
上一節概述了一些API函數,使您可以訪問特定屬性。但是有時候,您可能想要訪問存儲在TSK_FS_ATTR 結構中的屬性。
要訪問默認屬性,請使用 tsk_fs_file_attr_get()。如果知道要訪問的類型,則可以使用tsk_fs_file_attr_get_type()函數。C ++類具有類似的方法,例如TskFsFile :: getAttr()。
如果要弄清楚存在哪些類型或要遍歷所有屬性,可以使用tsk_fs_file_attr_getsize()函數獲取屬性數量,使用 tsk_fs_file_attr_get_idx()函數獲取基于0到n-基于1的索引。例如:
int i, cnt;
cnt = [tsk_fs_file_attr_getsize](http://sleuthkit.org/sleuthkit/docs/api-docs/4.10.0/group__fslib.html#ga748848a03a4e53446bf09696aa6278d6)(fs_file);
for (i = 0; i < cnt; i++) {
const [TSK_FS_ATTR](http://sleuthkit.org/sleuthkit/docs/api-docs/4.10.0/structTSK__FS__ATTR.html) *fs_attr;
fs_attr = [tsk_fs_file_attr_get_idx](http://sleuthkit.org/sleuthkit/docs/api-docs/4.10.0/group__fslib.html#ga5e125ea1ee0544f38531831455513835)(fs_file, i);
if (!fs_attr)
continue;
...
}
一旦有了 TSK_FS_ATTR結構,就可以使用 tsk_fs_attr_read()和 tsk_fs_attr_walk()函數從中讀取內容。這些操作與 tsk_fs_file_read()和 tsk_fs_file_walk()函數一樣,實際上基于文件的函數只是加載相關屬性并調用相應的基于屬性的函數。TskFsAttr類中存在類似的方法。
數據運行
本節提供有關如何在TSK中存儲文件內容的一些詳細信息。如果使用前面描述的API,則無需閱讀本節。這更像是僅供參考。
TSK將文件內容存儲在運行列表中的位置。運行是文件已分配的一組連續塊。根據起始程序段和運行時間存儲運行。文件屬性的運行列表存儲在 TSK_FS_META :: attr中,但是請注意,直到TSK需要該數據時,才可能填寫該數據。為了提高效率,TSK僅根據需要加載此數據(對于某些文件系統)。該TSK_FS_META :: attr_state字段標識,如果它已經又或沒有加載。
打開和讀取目錄
上一節概述了在知道文件名或地址時如何打開文件。在許多情況下,您將需要瀏覽目錄中的文件,并查看可以打開哪些文件。有兩種瀏覽文件名的方法。
首先是可以使用 tsk_fs_dir_open()或 tsk_fs_dir_open_meta()打開目錄。這兩個函數的區別在于 tsk_fs_dir_open()使用目錄名稱,而 tsk_fs_dir_open_meta()使用目錄元數據地址。就像打開文件一樣,如果您已經知道元數據地址,則 tsk_fs_dir_open_meta()會更高效,因為 tsk_fs_dir_open()會首先在目錄結構中搜索元數據地址,然后調用 tsk_fs_dir_open_meta()。
它們返回一個 TSK_FS_DIR 結構,該結構允許調用者隨后訪問目錄中的各個文件名。可以使用能夠得到在該目錄中的條目數 tsk_fs_dir_getsize()函數和單個條目可以與被返回 tsk_fs_dir_get()函數。您可以使用 tsk_fs_dir_close()關閉打開的目錄。如果要遞歸到目錄,則可能會陷入無限循環。您可以使用 TSK_STACK 結構來防止這種情況,請參閱《雜項實用程序》。
您還可以使用 tsk_fs_dir_walk()遍歷目錄樹。這將為目錄中的每個文件或子目錄調用回調,并且如果給出正確的標志,則可以遞歸到目錄中。要遍歷整個目錄結構,請在根目錄 TSK_FS_INFO :: root_inum 處開始遍歷,并設置遞歸標志。
這些方法都返回 TSK_FS_FILE 結構,并且都將定義 TSK_FS_FILE :: name 結構。但是,如果刪除了文件并且到元數據的鏈接已丟失,則某些文件可能未定義TSK_FS_FILE :: meta結構。
瀏覽文件的另一種方法是使用 tsk_fs_meta_walk()函數,該函數將處理一系列元數據結構并在每個結構上調用回調函數。回調將獲取相應的 TSK_FS_FILE 結構,并將文件的元數據在TSK_FS_FILE :: meta 和 TSK_FS_FILE :: name中設置為NULL。
TskFsDirC ++類中也存在此功能。
虛擬文件
瀏覽文件系統時,使用目錄結構最為方便,因此添加了特殊的文件和目錄,以使查找所有相關數據變得更加容易。可以從目錄訪問“已刪除文件”中討論的孤立文件/$OrphanFiles。這是一個虛擬目錄,但是TSK允許您將其視為普通目錄(盡管TSK_FS_META :: flags中的標志將顯示它是虛擬目錄)。
TSK還提供特殊文件,以便您可以訪問FAT文件系統中的引導扇區和FAT。的$MBR,$FAT1和$FAT2文件是虛擬文件指向部門的引導扇區,主要FAT和備份FAT。您可以使用這些虛擬文件來讀取這些結構的內容。
Mapping Data
在某些情況下,您可能想確定哪個文件分配了給定的塊,或者哪個名稱指向元數據結構。通常可以分別使用 tsk_fs_meta_walk()或 tsk_fs_dir_walk()函數來完成此操作。但是,有一些便利功能可以簡化此操作。
所述 tsk_fs_path2inum()函數以一個UTF-8的路徑作為參數,并將識別元數據的地址,它指向。這在C ++類中以TskFsInfo :: path2Inum()的形式存在。
hash數據庫
本節描述了一些與哈希數據庫庫相關的API函數和概念。
總覽
哈希數據庫通常用于識別已知的正常文件和已知的不良文件。可以輕松創建和共享MD5和SHA-1哈希的文本文件,但是在搜索哈希值時,它們通常不是最有效的使用,因為它們的順序不分先后。
TSK中的哈希數據庫功能可在文本文件哈希數據庫中創建索引,并允許您更快地執行查找。TSK使用索引對哈希執行二進制搜索(請參閱 Informer#6 )。
打開hash數據庫
在對數據庫建立索引或搜索之前,必須首先將其打開。使用tsk_hdb_open(函數打開數據庫。可以指定一個標志以僅打開索引。這使您可以通過僅保留索引來節省存儲空間,但這意味著您將無權訪問數據庫中存儲的其他元數據。
該tsk_hdb_open()函數會返回一個TSK_HDB_INFO將被用作手柄索引結構和搜索數據庫。可以使用tsk_hdb_close()關閉打開的哈希數據庫。
TskHdbInfo C ++類中也存在此功能。
索引hash數據庫
如果一個數據庫包含多種哈希類型,則單個數據庫可以具有多個索引。例如,可以為NSRL數據庫創建MD5和SHA-1索引。由于可以存在多個索引,因此在創建或測試索引時必須指定類型。
您可以使用tsk_hdb_hasindex()測試開放的哈希數據庫是否具有索引。如果需要創建一個,請使用tsk_hdb_makeindex()函數。此過程可能需要幾分鐘(或更長時間)。
搜索hash數據庫
可以使用 tsk_hdb_lookup_raw()或 tsk_hdb_lookup_str()搜索索引數據庫。唯一的區別是tsk_hdb_lookup_raw()將哈希值作為字節數組,而 tsk_hdb_lookup_str()將哈希值作為字符串。
這兩個函數都可以調用具有所找到條目詳細信息的回調,或者可以在沒有調用該回調的情況下給出QUICK標志,而是該函數的返回值標識哈希是否在數據庫中。
文件提取自動化
本節描述了 TskAuto C ++超類,可用于輕松構建用于分析磁盤映像并從中提取文件的自動化應用程序。
總覽
本用戶指南前面各節中描述的TSK API允許您手動打開卷或文件系統,并瀏覽其內容以查看卷和文件。盡管這種細粒度的訪問在某些情況下很有用,但在其他情況下,您只是想撕裂磁盤映像并查看所有文件,而不必擔心如何獲取文件。
該 TskAuto 類的目的是要在這些情況下幫助。這是一個C ++超類,它知道如何分析磁盤映像。您需要做的就是實現 TskAuto :: processFile()方法,該方法將為每個文件調用。該類中的其他方法也可以實現以獲取有關所分析數據的更多詳細信息。
基本
要使用 TskAuto,您首先需要創建它的C ++子類并實現 TskAuto :: processFile()方法。Build Environment中的說明將提供對此類的訪問。
要使用新的基于TskAuto的類,必須首先打開磁盤映像。這可以通過 TskAuto :: openImage()完成。完成對象后,應使用 TskAuto :: closeImage()將其關閉。這些方法已定義為虛擬方法,因此,如果您的類需要訪問圖像名稱列表(例如,對于報告),則可以覆蓋它們。
要在打開圖像文件后開始分析,必須調用TskAuto :: findFilesInImg(),TskAuto :: findFilesInVs()或TskAuto :: findFilesInFs() 。TskAuto :: findFilesInImg()從磁盤映像的扇區0開始,并開始對其進行分析。它尋找一個卷系統,如果找到一個,將檢查每個卷的內容。如果找不到卷系統,它將假定該映像屬于卷,并將扇區0分析為文件系統。
TskAuto :: findFilesInVs()允許您指定卷系統所在的扇區偏移量。它與TskAuto :: findFilesInImg()進行相同的分析,除了它并不總是從扇區0開始。實際上,TskAuto :: findFilesInImg()只是以0開始的偏移量調用TskAuto :: findFilesInVs(。
TskAuto :: findFilesInFs()允許您指定要處理的文件系統的偏移量。此方法將不查找卷系統,而僅查找文件系統。在內部,找到卷后,將從 TskAuto :: findFilesInVs() 調用此方法。還有一個版本,可讓您指定從其開始處理的目錄。
無論您使用哪種方法開始處理,都會為找到的每個文件和目錄調用TskAuto :: processFile()方法。您可以使用 TskAuto :: setFileFilterFlags()方法指定是否只對已分配或未分配的文件調用此方法。您還可以使用TskAuto :: setVolFilterFlags()方法指定要處理的卷類型。
在 TskAuto :: processFile()方法內部,您可以使用 tsk_fs_file_read()或tsk_fs_file_walk()讀取文件的內容。如果要查看文件中的每個屬性,則應調用processAttributes()并實現processAttribute()方法,該方法將為每個屬性調用。
錯誤處理將在后面詳細描述,但是值得在本節中指出,processFile()方法應該設置錯誤代碼,并在遇到錯誤時調用 TskAuto :: registerError,以便執行一致的錯誤報告。
篩選結果
使用上面定義的方法,將為映像中的所有文件和目錄調用TskAuto :: processFile()。不過,這可能比您想要的文件更多。當TskAuto將要處理新的卷或文件系統時,有thtree方法會提醒您,并且不會處理該卷或文件系統。
您可以實現TskAuto :: filterVs()方法以在處理卷系統之前了解它。此方法的返回值可能導致TskAuto跳過卷系統或完全停止處理磁盤映像。
您可以實現TskAuto :: filterVol()方法來在處理每個卷之前了解它們。此方法的返回值可能導致 TskAuto 跳過卷或完全停止處理磁盤映像。
您可以實現 TskAuto :: filterFs() 方法來在處理每個文件系統之前了解它們。此方法的返回值可能導致 TskAut 跳過文件系統或完全停止處理磁盤映像。
TskAuto 中還有一系列受保護的方法,這些方法可以幫助您跳過與您無關的文件。例如,TskAuto :: isNtfsSystemFiles()會告訴您文件是否是您可能要跳過的NTFS文件系統文件(例如$ MFT)之一。您可以在TskAuto :: processFile()中使用此方法來跳過大的NTFS文件。請參閱TskAuto中受保護的方法以了解為此目的定義的其他方法(它們都以“ is”開頭)。
錯誤處理和遞歸
TskAuto的目標是獲取磁盤映像并處理盡可能多的文件。因此,即使遇到錯誤,它也將繼續。
如果發生任何錯誤,公共方法將返回一個值。發生錯誤時,它已在TskAut中注冊并記錄在列表中。要確定發生了多少錯誤,請使用TskAuto :: getErrorList()方法。
如果在實現TskAuto :: processFile()或TskAuto :: processAttribute()時遇到錯誤情形,則還應該將錯誤發送到TskAuto :: registerError(),以便將它們全部記錄在中央位置。
例子
有關基于TskAuto的類的示例,請參考發行版的tools / autotools目錄中的源代碼。此目錄中的文件都使用TskAuto進行恢復已刪除文件或將數據加載到SQLite數據庫之類的操作。
C++ 類
本節提供了有關C ++類的高級概述,這些類圍繞著C結構和函數。當程序的其余部分使用C ++且要確保在多線程環境中使用正確的鎖和線程安全機制時,可以使用C ++接口。TSK包含用于使其線程安全的鎖,但是C接口允許線程在不獲取適當鎖的情況下修改共享結構中的數據。
請注意,C ++接口只是在后臺創建和使用C結構。因此,這些方法與C函數非常相似。在《用戶指南》的前面部分中提供了對C ++類的引用。假定用戶已閱讀《用戶指南》的前面各節,以了解TSK的功能。本節提供了主要C ++類的參考和鏈接。
基礎知識
第一步是使用TskImgInfo類打開圖像。此類允許您從磁盤映像讀取。有關此層的結構和功能的詳細信息,請參見磁盤映像。
打開圖像后,可以使用TskVsInfo類確定圖像的體積系統。它將檢測卷系統并提供對每個卷(或分區)的訪問。該TskVsPartInfo類提供給每個分區的細節引用。有關此層C結構和功能的詳細信息,請參見Volume Systems。
既然您知道了圖像的布局,就可以打開每個卷以查看其中包含的文件系統。為此,請使用TskFsInfo類。打開文件系統后,有許多方法可以分析文件系統內容。所述TskFsBlock類,可以訪問文件系統中的每個塊。該TskFsDir類提供訪問每個目錄和TskFsFile類提供對每個文件。從那里,您可以訪問文件的所有詳細信息,包括名稱信息(在TskFsFile中)和元數據(在TskFsMeta中)。通過TskFsAttribute類提供對文件所有屬性的訪問。請參閱文件系統有關此層C結構和功能的詳細信息。
如果要使整個過程自動化,而不是要手動檢測卷和文件系統,請考慮使用TskAuto類。有關更多自動化詳細信息,請參見文件提取自動化。
Sleuth Kit中文使用教程
推薦文章: