FAT32 ファイルシステムのファイル アロケーション テーブルを出力するように設計された Sleuth Kit Library を使用してプログラムを作成しています。tsk_fs_open_img() 関数を呼び出すまで、プログラム内のすべてが正常に動作します。その時点で、プログラムは「無効なマジック値 (FATFS ファイル システム (マジック) ではありません)」というエラーを返します。FS は確かに FAT32 FS であり、16 進エディタを使用してマジック値 (AA55 @ オフセット 1FE) を確認しました。また、Sleuth Kit Library に含まれているコマンドライン ツールである mmls と fls を使用して、私が使用しているこのドライブ イメージを操作し、実際に 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;
}