2011-12-19 1 views
4

FAT32 파일 시스템의 파일 할당 테이블을 출력하도록 설계된 Sleuth Kit 라이브러리를 사용하여 프로그램을 작성하고 있습니다. tsk_fs_open_img() 함수를 호출 할 때까지 내 프로그램의 모든 것이 잘 작동합니다. 이 시점에서 프로그램은 "잘못된 마법 값 (FATFS 파일 시스템 (마법)이 아님)"이라고 반환하고 오류를 표시합니다. FS는 실제로 FAT32 FS이며 16 진수 편집기를 사용하여 마법 값 (AA55 @ offset 1FE)을 확인했습니다. 또한 Sleuth Kit Library에 포함 된 명령 줄 도구 인 mmls 및 fls를 사용하면이 드라이브 이미지를 사용하여 실제로 FAT32 FS이고 FS에 대해 63 오프셋을 제공한다는 것을 보여줍니다.Sleuth Kit 함수 사용 tsk_fs_open_img()는 FS가 FAT가 아닌 오류를 반환합니다. FS

누군가이 기능이 작동하지 않는 이유를 알아 내면 큰 도움이 될 것입니다. 미리 감사드립니다. 여기 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; 
} 
+0

문제는 당신의'fsStartBlock' 매개 변수라고 생각합니다. (예를 들어 0 또는 0x3F 또는 0x1FE와 같은) 변수를 바꾸어보고 어떤 일이 일어나는지보십시오 ... – Yahia

+0

고마워요,하지만 지금은 그걸 사용해 보았습니다. 오프셋이 63이 아니면 이미지 크기가 512의 배수가 아님을 나타내는 오류를 반환합니다. fsStartBlock은 블록 단위로 측정되는 반면, 매직 번호는 1FE 또는 510 바이트로 측정되며이 두 (블록 및 바이트)는 교환 할 수 없다. –

답변

2

tsk_fs_open_img에 offset 인수는, 바이트에없는 분야입니다 여기

는 기능에 대한 API에 대한 링크입니다. 따라서 fsStartBlockimg->sector_size을 곱하면됩니다.

관련 문제