⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mmls.cpp

📁 linux下开发的针对所有磁盘的数据恢复的源码
💻 CPP
字号:
/* * The Sleuth Kit * * Brian Carrier [carrier <at> sleuthkit [dot] org] * Copyright (c) 2006-2008 Brian Carrier, Basis Technology.  All rights reserved * Copyright (c) 2003-2005 Brian Carrier.  All rights reserved * * mmls - list media management structure contents * * This software is distributed under the Common Public License 1.0 */#include "tsk3/tsk_tools_i.h"static TSK_TCHAR *progname;static uint8_t print_bytes = 0;static uint8_t recurse = 0;static int recurse_cnt = 0;static TSK_DADDR_T recurse_list[64];voidusage(){    TFPRINTF(stderr,        _TSK_T        ("%s [-i imgtype] [-o imgoffset] [-brvV] [-aAmM] [-t vstype] image [images]\n"),        progname);    tsk_fprintf(stderr,        "\t-t vstype: The type of volume system (use '-t list' for list of supported types)\n");    tsk_fprintf(stderr,        "\t-i imgtype: The format of the image file (use '-i list' for list supported types)\n");    tsk_fprintf(stderr,        "\t-o imgoffset: Offset to the start of the volume that contains the partition system (in sectors)\n");    tsk_fprintf(stderr, "\t-b: print the rounded length in bytes\n");    tsk_fprintf(stderr,        "\t-r: recurse and look for other partition tables in partitions (DOS Only)\n");    tsk_fprintf(stderr, "\t-v: verbose output\n");    tsk_fprintf(stderr, "\t-V: print the version\n");    tsk_fprintf(stderr,        "Unless any of these are specified, all volume types are shown\n");    tsk_fprintf(stderr, "\t-a: Show allocated volumes\n");    tsk_fprintf(stderr, "\t-A: Show unallocated volumes\n");    tsk_fprintf(stderr, "\t-m: Show metadata volumes\n");    tsk_fprintf(stderr, "\t-M: Hide metadata volumes\n");    exit(1);}/* * The callback action for the part_walk * * Prints the layout information * */static TSK_WALK_RET_ENUMpart_act(TSK_VS_INFO * vs, const TSK_VS_PART_INFO * part, void *ptr){    if (part->flags & TSK_VS_PART_FLAG_META)        tsk_printf("%.2" PRIuPNUM ":  Meta    ", part->addr);    /* Neither table or slot were given */    else if ((part->table_num == -1) && (part->slot_num == -1))        tsk_printf("%.2" PRIuPNUM ":  -----   ", part->addr);    /* Table was not given, but slot was */    else if ((part->table_num == -1) && (part->slot_num != -1))        tsk_printf("%.2" PRIuPNUM ":  %.2" PRIu8 "      ",            part->addr, part->slot_num);    /* The Table was given, but slot wasn't */    else if ((part->table_num != -1) && (part->slot_num == -1))        tsk_printf("%.2" PRIuPNUM ":  -----   ", part->addr);    /* Both table and slot were given */    else if ((part->table_num != -1) && (part->slot_num != -1))        tsk_printf("%.2" PRIuPNUM ":  %.2d:%.2d   ",            part->addr, part->table_num, part->slot_num);    if (print_bytes) {        TSK_OFF_T size;        char unit = ' ';        size = part->len;        if (part->len < 2) {            size = 512 * part->len;            unit = 'B';        }        else if (size < (2 << 10)) {            size = part->len / 2;            unit = 'K';        }        else if (size < (2 << 20)) {            size = part->len / (2 << 10);            unit = 'M';        }        else if (size < ((TSK_OFF_T) 2 << 30)) {            size = part->len / (2 << 20);            unit = 'G';        }        else if (size < ((TSK_OFF_T) 2 << 40)) {            size = part->len / (2 << 30);            unit = 'T';        }        /* Print the layout */        tsk_printf("%.10" PRIuDADDR "   %.10" PRIuDADDR "   %.10" PRIuDADDR            "   %.4" PRIuOFF "%c   %s\n", part->start,            (TSK_DADDR_T) (part->start + part->len - 1), part->len, size,            unit, part->desc);    }    else {        /* Print the layout */        tsk_printf("%.10" PRIuDADDR "   %.10" PRIuDADDR "   %.10" PRIuDADDR            "   %s\n", part->start,            (TSK_DADDR_T) (part->start + part->len - 1), part->len,            part->desc);    }    if ((recurse) && (vs->vstype == TSK_VS_TYPE_DOS)        && (part->flags == TSK_VS_PART_FLAG_ALLOC)) {        // @@@ This assumes 512-byte sectors        if (recurse_cnt < 64)            recurse_list[recurse_cnt++] = part->start * 512;    }    return TSK_WALK_CONT;}static voidprint_header(const TSK_VS_INFO * vs){    tsk_printf("%s\n", tsk_vs_type_todesc(vs->vstype));    tsk_printf("Offset Sector: %" PRIuDADDR "\n",        (TSK_DADDR_T) (vs->offset / vs->block_size));    tsk_printf("Units are in %d-byte sectors\n\n", vs->block_size);    if (print_bytes)        tsk_printf            ("     Slot    Start        End          Length       Size    Description\n");    else        tsk_printf            ("     Slot    Start        End          Length       Description\n");}intmain(int argc, char ** argv1){    TSK_VS_INFO *vs;    int ch;    TSK_OFF_T imgoff = 0;    int flags = 0;    TSK_IMG_INFO *img;    TSK_IMG_TYPE_ENUM imgtype = TSK_IMG_TYPE_DETECT;    TSK_VS_TYPE_ENUM vstype = TSK_VS_TYPE_DETECT;    uint8_t hide_meta = 0;    TSK_TCHAR **argv;    #ifdef TSK_WIN32    // On Windows, get the wide arguments (mingw doesn't support wmain)    argv = CommandLineToArgvW(GetCommandLineW(), &argc);    if( argv == NULL) {            fprintf(stderr, "Error getting wide arguments\n");        exit(1);    }#else    argv = (TSK_TCHAR **)argv1;#endif        progname = argv[0];    while ((ch = GETOPT(argc, argv, _TSK_T("aAbi:mMo:rt:vV"))) > 0) {        switch (ch) {        case _TSK_T('a'):            flags |= TSK_VS_PART_FLAG_ALLOC;            break;        case _TSK_T('A'):            flags |= TSK_VS_PART_FLAG_UNALLOC;            break;        case _TSK_T('b'):            print_bytes = 1;            break;        case _TSK_T('i'):            if (TSTRCMP(OPTARG, _TSK_T("list")) == 0) {                tsk_img_type_print(stderr);                exit(1);            }            imgtype = tsk_img_type_toid(OPTARG);            if (imgtype == TSK_IMG_TYPE_UNSUPP) {                TFPRINTF(stderr, _TSK_T("Unsupported image type: %s\n"),                    OPTARG);                usage();            }            break;        case _TSK_T('m'):            flags |= (TSK_VS_PART_FLAG_META);            break;        case _TSK_T('M'):            // we'll set this after all flags have been set            hide_meta = 1;            break;        case _TSK_T('o'):            if ((imgoff = tsk_parse_offset(OPTARG)) == -1) {                tsk_error_print(stderr);                exit(1);            }            break;        case _TSK_T('r'):            recurse = 1;            break;        case _TSK_T('t'):            if (TSTRCMP(OPTARG, _TSK_T("list")) == 0) {                tsk_vs_type_print(stderr);                exit(1);            }            vstype = tsk_vs_type_toid(OPTARG);            if (vstype == TSK_VS_TYPE_UNSUPP) {                TFPRINTF(stderr,                    _TSK_T("Unsupported volume system type: %s\n"),                    OPTARG);                usage();            }            break;        case _TSK_T('v'):            tsk_verbose++;            break;        case _TSK_T('V'):            tsk_version_print(stdout);            exit(0);        case _TSK_T('?'):        default:            tsk_fprintf(stderr, "Unknown argument\n");            usage();        }    }    // if they want to hide metadata volumes, set that now    if (hide_meta) {        if (flags == 0)            flags = (TSK_VS_PART_FLAG_ALLOC | TSK_VS_PART_FLAG_UNALLOC);        else            flags &= ~TSK_VS_PART_FLAG_META;    }    else if (flags == 0) {        flags = TSK_VS_PART_FLAG_ALL;    }    /* We need at least one more argument */    if (OPTIND >= argc) {        tsk_fprintf(stderr, "Missing image name\n");        usage();    }    /* open the image */    img =        tsk_img_open(argc - OPTIND,        (const TSK_TCHAR **) &argv[OPTIND], imgtype);    if (img == NULL) {        tsk_error_print(stderr);        exit(1);    }    if (imgoff >= img->size) {        tsk_fprintf(stderr,            "Sector offset supplied is larger than disk image (maximum: %"            PRIu64 ")\n", img->size / 512);        exit(1);    }    /* process the partition tables */    vs = tsk_vs_open(img, (TSK_OFF_T) imgoff, vstype);    if (vs == NULL) {        tsk_error_print(stderr);        if (tsk_errno == TSK_ERR_VS_UNSUPTYPE)            tsk_vs_type_print(stderr);        tsk_img_close(img);        exit(1);    }    print_header(vs);    if (tsk_vs_part_walk(vs, 0, vs->part_count - 1,            (TSK_VS_PART_FLAG_ENUM) flags, part_act, NULL)) {        tsk_error_print(stderr);        tsk_vs_close(vs);        tsk_img_close(img);        exit(1);    }    tsk_vs_close(vs);    if ((recurse) && (vs->vstype == TSK_VS_TYPE_DOS)) {        int i;        /* disable recursing incase we hit another DOS partition         * future versions may support more layers */        recurse = 0;        for (i = 0; i < recurse_cnt; i++) {            vs = tsk_vs_open(img, recurse_list[i], TSK_VS_TYPE_DETECT);            if (vs != NULL) {                tsk_printf("\n\n");                print_header(vs);                if (tsk_vs_part_walk(vs, 0, vs->part_count - 1,                        (TSK_VS_PART_FLAG_ENUM) flags, part_act, NULL)) {                    tsk_error_reset();                }                tsk_vs_close(vs);            }            else {                /* Ignore error in this case and reset */                tsk_error_reset();            }        }    }    tsk_img_close(img);    exit(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -