使用侦查工具函数tsk_fs_open_img()返回一个错误,认为该FS不是FAT FS



我正在使用Sleuth Kit Library编写一个程序,用于打印FAT32文件系统的文件分配表。在调用tsk_fs_open_img()函数之前,程序中的一切都运行良好。此时,程序返回并错误指出"无效的魔术值(不是FATFS文件系统(魔术))"。FS确实是FAT32 FS,我已经使用十六进制编辑器验证了魔法值(AA55 @ offset 1FE)。同样使用mmls和fls,这是Sleuth Kit Library中包含的命令行工具,对我正在使用的这个驱动器映像进行处理,并显示它确实是一个FAT32 FS,并且还为FS提供63的偏移量。

如果有人能帮我弄清楚为什么这个功能不工作,我将不胜感激。提前谢谢。

下面是这个函数的API链接:TSK_FS_OPEN_IMG()

下面是我的代码:
using namespace std;
#include <tsk3/libtsk.h>
#include <iostream>
#include <string.h>
int main (int argc, const char * argv[])
{
TSK_IMG_TYPE_ENUM imgtype = TSK_IMG_TYPE_DETECT;
TSK_IMG_INFO *img;
TSK_FS_TYPE_ENUM fstype = TSK_FS_TYPE_FAT32;
TSK_FS_INFO *fs;
TSK_DADDR_T imgOffset = 0x00000000;
TSK_OFF_T fsStartBlock = 0x00000063;
TSK_VS_INFO *vs;
TSK_VS_TYPE_ENUM vstype = TSK_VS_TYPE_DETECT;
const TSK_VS_PART_INFO *part;
TSK_PNUM_T partLocation = part -> addr;
TSK_TCHAR *driveName;
TSK_DADDR_T startAddress = 0x00000000;
TSK_DADDR_T numBlocksToRead = 0x00000001;
TSK_FS_BLKCAT_FLAG_ENUM flags = TSK_FS_BLKCAT_ASCII;
int numOfDrives = 1;
uint sectorSize = 0;
uint8_t blockBytes = 0;
if (argc < 1) {
    printf("You must enter a drive name.n");
    exit(EXIT_FAILURE);
}
driveName = (TSK_TCHAR*) argv[1];
cout << "nOpening Drivenn";
if((img = tsk_img_open(numOfDrives, &driveName, imgtype, sectorSize)) == NULL) {
    tsk_error_print(stderr);
    exit(EXIT_FAILURE);
}
cout << "Drive opened successfuly.nn";
cout << "Opening File Systemnn";
if((fs = tsk_fs_open_img(img, fsStartBlock, fstype)) == NULL) {
    tsk_error_print(stderr);
    if (tsk_errno == TSK_ERR_FS_UNSUPTYPE)
        tsk_fs_type_print(stderr);
    img -> close(img);
    exit(EXIT_FAILURE);
}
cout << "File system opened successfuly.nn";
blockBytes = tsk_fs_blkcat(fs, flags, startAddress, numBlocksToRead);
fs -> close(fs);
img -> close(img);
return 0;
}

tsk_fs_open_img的offset参数以字节为单位,而不是扇区。所以,你需要用fsStartBlock乘以img->sector_size

最新更新