Использование функции Sleuth Kit tsk_fs_open_img() возвращает ошибку, что FS не является FAT FS

Я пишу программу, используя библиотеку Sleuth Kit, предназначенную для распечатки таблицы размещения файлов файловой системы FAT32. Все в моей программе работает нормально, пока я не вызову функцию tsk_fs_open_img(). В этот момент программа возвращает сообщение об ошибке «Неверное магическое значение (не файловая система FATFS (магия))». FS действительно является FAT32 FS, и я проверил магическое значение (AA55 @ offset 1FE) с помощью шестнадцатеричного редактора. Кроме того, используя mmls и fls, инструменты командной строки, включенные в библиотеку Sleuth Kit Library, работайте с этим образом диска, который я использую, и покажите, что это действительно FAT32 FS, а также укажите смещение 63 для FS.

Если бы кто-нибудь мог помочь мне понять, почему эта функция не работает, я был бы очень признателен. Заранее спасибо.

Вот ссылка на 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;
}

person James Poore    schedule 19.12.2011    source источник
comment
Я подозреваю, что проблема в вашем параметре fsStartBlock... попробуйте изменить его (например, 0, 0x3F или 0x1FE) и посмотреть, что произойдет...   -  person Yahia    schedule 19.12.2011
comment
Спасибо, но я пробовал это сейчас безрезультатно. Если смещение не равно 63, то возвращается ошибка о том, что размер изображения не кратен 512. И fsStartBlock измеряется в блоках, тогда как магическое число находится в байте 1FE или 510, эти два (блоки и байты) не взаимозаменяемы.   -  person James Poore    schedule 19.12.2011


Ответы (1)


Аргумент смещения для tsk_fs_open_img находится в байтах, а не в секторах. Итак, вам нужно умножить fsStartBlock на img->sector_size.

person Brian Carrier    schedule 20.01.2012