【问题标题】:Using the Sleuth Kit function tsk_fs_open_img() returns an error that the FS is not a FAT FS使用 Sleuth Kit 函数 tsk_fs_open_img() 返回 FS 不是 FAT FS 的错误
【发布时间】:2011-12-19 05:17:28
【问题描述】:

我正在使用 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 Drive\n\n";

if((img = tsk_img_open(numOfDrives, &driveName, imgtype, sectorSize)) == NULL) {
    tsk_error_print(stderr);
    exit(EXIT_FAILURE);
}

cout << "Drive opened successfuly.\n\n";

cout << "Opening File System\n\n";

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.\n\n";

blockBytes = tsk_fs_blkcat(fs, flags, startAddress, numBlocksToRead);

fs -> close(fs);
img -> close(img);
return 0;
}

【问题讨论】:

  • 我怀疑问题出在您的 fsStartBlock 参数上...尝试改变它(例如 0 或 0x3F 或 0x1FE),看看会发生什么...
  • 谢谢,但我已经试过了,现在可以了。如果偏移量不是 63,那么它会返回一个错误,指出图像大小不是 512 的倍数。 fsStartBlock 以块为单位测量,而幻数在字节 1FE 或 510 处,这两个(块和字节)是不可互换。

标签: c++ unix filesystems fat32 dd


【解决方案1】:

tsk_fs_open_img 的偏移量参数以字节为单位,而不是扇区。所以,你需要将fsStartBlock 乘以img-&gt;sector_size

【讨论】:

    猜你喜欢
    • 2021-04-11
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 2021-05-04
    • 2021-12-04
    • 1970-01-01
    • 2021-11-02
    相关资源
    最近更新 更多