使用 Sleuth Kit 函数 tsk_fs_open_img() 返回 FS 不是 FAT FS 的错误
我正在使用 Sleuth Kit Library 编写一个程序,该程序旨在打印 FAT32 文件系统的文件分配表。在我调用 tsk_fs_open_img() 函数之前,程序中的所有内容都工作正常。此时,程序返回错误并指出“无效的 magic 值(不是 FATFS 文件系统(magic))”。该 FS 确实是 FAT32 FS,我已经使用十六进制编辑器验证了神奇值(AA55 @ 偏移 1FE)。还使用 mmls 和 fls(Sleuth Kit 库中包含的命令行工具)处理我正在使用的驱动器映像,并显示它确实是 FAT32 FS,并且还为 FS 提供 63 的偏移量。
如果有人能帮助我弄清楚为什么这个功能不起作用,我将不胜感激。提前致谢。
以下是该函数 API 的链接: TSK_FS_OPEN_IMG()< /a>
这是我的代码:
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;
}
I am writing a program using the Sleuth Kit Library that is designed to printout the File Allocation Table of a FAT32 filesystem. Everything in my program works fine until I call the tsk_fs_open_img() function. At that point the program returns and error stating "Invalid magic value (Not a FATFS file system(magic))." The FS is indeed a FAT32 FS and I have verified the magic value (AA55 @ offset 1FE) using a hex editor. Also using mmls and fls, which are command-line tools included in the Sleuth Kit Library, work on this drive image that I am using and show that it is indeed a FAT32 FS and also provide the offset of 63 for the FS.
If anyone could help me figure out why this function is not working it would be greatly appreciated. Thanks in advance.
Here is the link to the API for the function: TSK_FS_OPEN_IMG()
Here is my code:
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;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
tsk_fs_open_img
的偏移量参数以字节为单位,而不是扇区。因此,您需要将fsStartBlock
乘以img->sector_size
。The offset argument to
tsk_fs_open_img
is in bytes, not sectors. So, you need to multiplyfsStartBlock
byimg->sector_size
.