📄 fs_fname_apis.cpp
字号:
/** The Sleuth Kit *** Brian Carrier [carrier <at> sleuthkit [dot] org]* Copyright (c) 2008 Brian Carrier. All Rights reserved*** This software is distributed under the Common Public License 1.0**//* Test and compare the directory entry read apis *//* TESTS: * Need to uncommen parent addr check in open() check when fs_meta is defined */#include "tsk3/tsk_tools_i.h"static char *s_root;/* Compare two dents and return 1 if they are diff. * print error message if a_print is non-zero. */static intcompare_names(const TSK_FS_NAME * fs_name1, const TSK_FS_NAME * fs_name2, uint8_t a_print){ if (fs_name1->type != fs_name2->type) { if (a_print) fprintf(stderr, "ent type mismatch: %x %x\n", fs_name1->type, fs_name2->type); return 1; } if (fs_name1->flags != fs_name2->flags) { if (a_print) fprintf(stderr, "flags mismatch: %x %x\n", fs_name1->flags, fs_name2->flags); return 1; } if (fs_name1->meta_addr != fs_name2->meta_addr) { if (a_print) fprintf(stderr, "inode address mismatch: %" PRIuINUM " %" PRIuINUM "\n", fs_name1->meta_addr, fs_name2->meta_addr); return 1; } if (fs_name1->name == NULL) { if (fs_name2->name) { if (a_print) fprintf(stderr, "dent1 name is NULL, dent2 is not\n"); return 1; } } else if (fs_name2->name == NULL) { if (a_print) fprintf(stderr, "dent2 name is NULL, dent1 is not\n"); return 1; } else if (strcmp(fs_name1->name, fs_name2->name)) { if (a_print) fprintf(stderr, "name mismatch: %s %s\n", fs_name1->name, fs_name2->name); return 1; } return 0;}/* file walk callback that counts how many entries there are in a * directory */static TSK_WALK_RET_ENUMdir_walk_count_cb(TSK_FS_FILE * a_fs_file, const char *a_path, void *a_ptr){ size_t *a = (size_t *) a_ptr; *a = *a + 1; return TSK_WALK_CONT;}/* file walk callback that looks for an fs_name given as the arg pointer. */static int s_found;static TSK_WALK_RET_ENUMdir_walk_comp_cb(TSK_FS_FILE * a_fs_file, const char *a_path, void *a_ptr){ const TSK_FS_FILE *fs_file2 = (const TSK_FS_FILE *) a_ptr; if (compare_names(a_fs_file->name, fs_file2->name, 0) == 0) { s_found = 1; return TSK_WALK_STOP; } return TSK_WALK_CONT;}/* Test function that compares the dir_open/dir_get() APIs * with the dir_walk results * @param a_addr Address of directory to analyze * @returns 1 if a test failed. */static inttest_walk_apis(TSK_FS_INFO * a_fs, TSK_INUM_T a_addr){ TSK_FS_DIR *fs_dir; int retval = 0; fs_dir = tsk_fs_dir_open_meta(a_fs, a_addr); if (!fs_dir) { fprintf(stderr, "Error opening dir %" PRIuINUM " via meta\n", a_addr); tsk_error_print(stderr); return 1; } // verify they have the same number of entries // walk the directory to get its count size_t walk_size = 0; if (tsk_fs_dir_walk(a_fs, a_addr, (TSK_FS_DIR_WALK_FLAG_ENUM) 0, dir_walk_count_cb, &walk_size)) { fprintf(stderr, "Error doing dent walk on dir %" PRIuINUM "\n", a_addr); retval = 1; goto walk_cleanup; } if (walk_size != tsk_fs_dir_getsize(fs_dir)) { fprintf(stderr, "Size returned by dir_walk different from dir_getsize: %" PRIuINUM ": %" PRIuSIZE " %" PRIuSIZE "\n", a_addr, walk_size, tsk_fs_dir_getsize(fs_dir)); retval = 1; goto walk_cleanup; } // verify each entry is the same for (size_t i = 0; i < tsk_fs_dir_getsize(fs_dir); i++) { TSK_FS_FILE *fs_file; fs_file = tsk_fs_dir_get(fs_dir, i); if (fs_file == NULL) { fprintf(stderr, "Error getting entry %" PRIuSIZE " from directory %" PRIuINUM "\n", i, a_addr); tsk_error_print(stderr); retval = 1; goto walk_cleanup; } if (fs_file->meta == NULL) { fprintf(stderr, "Error: %s (%" PRIuINUM ") does not have meta set in dir: \n", fs_file->name->name, fs_file->name->meta_addr); retval = 1; goto walk_cleanup; } s_found = 0; if (tsk_fs_dir_walk(a_fs, a_addr, (TSK_FS_DIR_WALK_FLAG_ENUM) 0, dir_walk_comp_cb, (void *) fs_file)) { fprintf(stderr, "Error doing dent walk on dir %" PRIuINUM "\n", a_addr); retval = 1; goto walk_cleanup; } if (s_found == 0) { fprintf(stderr, "entry %" PRIuSIZE " in dir not found via walk: %s\n", i, fs_file->name->name); retval = 1; goto walk_cleanup; } tsk_fs_file_close(fs_file); } walk_cleanup: tsk_fs_dir_close(fs_dir); return retval;}/* Compare the differences between dir_open_meta and dir_open * @param a_path Path of directory to open * @param a_addr The metadata address of the same directory as the path * @returns 1 if a test failed */static inttest_dir_open_apis(TSK_FS_INFO * a_fs, const char *a_path, TSK_INUM_T a_addr){ TSK_FS_DIR *fs_dir_m; TSK_FS_DIR *fs_dir_p; TSK_FS_DIR *fs_dir_tmp; TSK_FS_FILE *fs_file_m; TSK_FS_FILE *fs_file_p; int retval = 0; size_t entry = 0; // open via inode addr fs_dir_m = tsk_fs_dir_open_meta(a_fs, a_addr); if (!fs_dir_m) { fprintf(stderr, "Error opening dir %" PRIuINUM " via meta\n", a_addr); tsk_error_print(stderr); return 1; } /* open the root directory to throw some more state into the system * in case data is cached from first call */ fs_dir_tmp = tsk_fs_dir_open_meta(a_fs, a_fs->root_inum); if (!fs_dir_tmp) { fprintf(stderr, "Error opening root directory via meta\n"); tsk_error_print(stderr); return 1; } // open via path fs_dir_p = tsk_fs_dir_open(a_fs, a_path); if (!fs_dir_p) { fprintf(stderr, "Error opening directory %s\n", a_path); tsk_error_print(stderr); return 1; } // test that path has the name structure set (correctly) if ((fs_dir_p->fs_file == NULL) || (fs_dir_p->fs_file->name == NULL)) { fprintf(stderr, "dir opened via path has null name (%s)\n", a_path); retval = 1; goto open_cleanup; } if (fs_dir_p->fs_file->name->meta_addr != fs_dir_p->fs_file->meta->addr) { fprintf(stderr, "dir opened via path has different meta addresses in name and meta (%s) (%" PRIuINUM " vs %" PRIuINUM "\n", a_path, fs_dir_p->fs_file->name->meta_addr, fs_dir_p->fs_file->meta->addr); retval = 1; goto open_cleanup; } // verify both methods have same dir addr if (fs_dir_p->fs_file->meta->addr != fs_dir_m->fs_file->meta->addr) { fprintf(stderr, "parent dir addrs from fs_dir_open_meta and via path are different: %" PRIuINUM " vs %" PRIuINUM " (%s - %" PRIuINUM "\n", fs_dir_p->fs_file->meta->addr, fs_dir_m->fs_file->meta->addr, a_path, a_addr); retval = 1; goto open_cleanup; } // verify path method has same dir addr as open via meta if (fs_dir_p->fs_file->meta->addr != a_addr) { fprintf(stderr, "parent dir addrs from fs_dir_open is diff from meta address %" PRIuINUM " (%s - %" PRIuINUM "\n", fs_dir_p->fs_file->meta->addr, a_path, a_addr); retval = 1; goto open_cleanup; } // verify both have same size if (tsk_fs_dir_getsize(fs_dir_p) != tsk_fs_dir_getsize(fs_dir_m)) { fprintf(stderr, "sizes from fs_dir_open_meta and via path are different: %" PRIuSIZE " vs %" PRIuSIZE " (%s - %" PRIuINUM "\n", tsk_fs_dir_getsize(fs_dir_p), tsk_fs_dir_getsize(fs_dir_m), a_path, a_addr); retval = 1; goto open_cleanup; } // compare the first entry in both. if (tsk_fs_dir_getsize(fs_dir_p) == 0) { fprintf(stderr, "directory sizes are 0\n"); retval = 1; goto open_cleanup; } fs_file_m = tsk_fs_dir_get(fs_dir_m, 0); if (fs_file_m == NULL) { fprintf(stderr, "Error opening entry 0 from meta open: %" PRIuINUM "\n", a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } fs_file_p = tsk_fs_dir_get(fs_dir_p, 0); if (fs_file_p == NULL) { fprintf(stderr, "Error opening entry 0 from path open: %" PRIuINUM "\n", a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } if (compare_names(fs_file_p->name, fs_file_m->name, 1)) { fprintf(stderr, "results from entry 0 are different\n"); retval = 1; goto open_cleanup; } tsk_fs_file_close(fs_file_m); tsk_fs_file_close(fs_file_p); // compare the last entry in both entry = tsk_fs_dir_getsize(fs_dir_m) - 1; fs_file_m = tsk_fs_dir_get(fs_dir_m, entry); if (fs_file_m == NULL) { fprintf(stderr, "Error opening entry %" PRIuSIZE " from meta open: %" PRIuINUM "\n", entry, a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } fs_file_p = tsk_fs_dir_get(fs_dir_p, entry); if (fs_file_p == NULL) { fprintf(stderr, "Error opening entry %" PRIuSIZE " from path open: %" PRIuINUM "\n", entry, a_addr); tsk_error_print(stderr); retval = 1; goto open_cleanup; } if (compare_names(fs_file_p->name, fs_file_m->name, 1)) { fprintf(stderr, "results from entry %" PRIuSIZE " are different\n", entry); retval = 1; goto open_cleanup; } tsk_fs_file_close(fs_file_m); tsk_fs_file_close(fs_file_p); open_cleanup: tsk_fs_dir_close(fs_dir_p); tsk_fs_dir_close(fs_dir_tmp); tsk_fs_dir_close(fs_dir_m); return retval;}inttest_fat12(){ TSK_FS_INFO *fs; TSK_IMG_INFO *img; char *tname = "fat12.dd"; char fname[512]; snprintf(fname, 512, "%s/fat12.dd", s_root); if ((img = tsk_img_open_sing((const TSK_TCHAR *) fname, (TSK_IMG_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if ((fs = tsk_fs_open_img(img, 0, (TSK_FS_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if (test_dir_open_apis(fs, "/", 2)) { fprintf(stderr, "%s failure\n", tname); return 1; } if (test_walk_apis(fs, 2)) { fprintf(stderr, "%s failure\n", tname); return 1; } tsk_fs_close(fs); tsk_img_close(img); return 0;}static inttest_ntfs_fe(){ TSK_FS_INFO *fs; TSK_IMG_INFO *img; char *tname = "fe_test_1-NTFS"; char fname[512]; snprintf(fname, 512, "%s/fe_test_1.img", s_root); if ((img = tsk_img_open_sing((const TSK_TCHAR *) fname, (TSK_IMG_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if ((fs = tsk_fs_open_img(img, 32256, (TSK_FS_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if (test_dir_open_apis(fs, "/allocated", 30)) { fprintf(stderr, "%s failure\n", tname); return 1; } if (test_walk_apis(fs, 30)) { fprintf(stderr, "%s failure\n", tname); return 1; } tsk_fs_close(fs); tsk_img_close(img); return 0;}#if 0inttest_ntfs_comp(){ TSK_FS_INFO *fs; TSK_IMG_INFO *img; char *tname = "ntfs-comp-1"; char fname[512]; snprintf(fname, 512, "%s/ntfs-comp-1.img", s_root); if ((img = tsk_img_open_sing((const TSK_TCHAR *) fname, (TSK_IMG_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if ((fs = tsk_fs_open_img(img, 0, (TSK_FS_TYPE_ENUM) 0)) == NULL) { fprintf(stderr, "Error opening %s image\n", tname); tsk_error_print(stderr); return 1; } if (testfile(fs, 34)) { fprintf(stderr, "%s error (both)\n", tname); return 1; } if (testfile(fs, 32)) { fprintf(stderr, "%s error (sparse)\n", tname); return 1; } tsk_fs_close(fs); tsk_img_close(img); return 0;}#endifintmain(int argc, char **argv){ if (argc != 2) { fprintf(stderr, "missing image root directory\n"); return 1; } s_root = argv[1]; if (test_fat12()) return 1; if (test_ntfs_fe()) return 1; printf("Tests Passed\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -