Sleuth Kit関数を使用するtsk_fs_open_img()は、FSがFAT FSではないというエラーを返します

私は、FAT32ファイルシステムのFile Allocation Tableを出力するように設計されたSleuth Kit Libraryを使用してプログラムを作成しています。 tsk_fs_open_img()関数を呼び出すまでは、私のプログラムのすべてがうまく動作します。その時点で、プログラムは "無効なマジック値(FATFSファイルシステム(マジック)ではない)"と返すエラーを返します。 FSは確かにFAT32 FSで、16進エディタを使用して魔法の値(AA55 @ offset 1FE)を確認しました。また、Sleuth Kit Libraryに含まれているコマンドラインツールであるmmlsとflsを使って、私が使用しているこのドライブイメージで作業し、実際にFAT32 FSであることを示し、FSに対して63のオフセットを提供します。

なぜ誰かがこの機能がうまくいかない理由を理解できたら、それは非常に感謝しています。前もって感謝します。

Here is the link to the API for the function: TSK_FS_OPEN_IMG()

ここに私のコードです:

using namespace std;

#include 
#include 
#include 

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;
}
4
問題があなたの fsStartBlock パラメータであると思われます...(0または0x3Fまたは0x1FEなど)
追加された 著者 Yahia,
ありがとうございます。でも、私は今使ってみました。オフセットが63でなければ、イメージサイズが512の倍数ではないことを示すエラーが返されます。fsStartBlockはブロック単位で計測されますが、マジックナンバーはバイト1FEまたは510であり、これら2つ(ブロックとバイト)は交換できません。
追加された 著者 James Poore,

1 答え

The offset argument to tsk_fs_open_img is in bytes, not sectors. So, you need to multiply fsStartBlock by img->sector_size.

2
追加された