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

📄 afxml.cpp

📁 sleuthit-2.09 一个磁盘的工具集
💻 CPP
字号:
/* * afxml.cpp: * * print AFF information as an XML *//* * Copyright (c) 2005 *	Simson L. Garfinkel and Basis Technology, Inc.  *      All rights reserved. * * This code is derrived from software contributed by * Simson L. Garfinkel * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software *    must display the following acknowledgement: *    This product includes software developed by Simson L. Garfinkel *    and Basis Technology Corp. * 4. Neither the name of Simson Garfinkel, Basis Technology, or other *    contributors to this program may be used to endorse or promote *    products derived from this software without specific prior written *    permission. * * THIS SOFTWARE IS PROVIDED BY SIMSON GARFINKEL, BASIS TECHNOLOGY, * AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL SIMSON GARFINKEL, BAIS TECHNOLOGy, * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE.   */#include "config.h"#include "afflib.h"#include "afflib_i.h"#include "base64.h"#include "quads.h"#if HAVE_CTYPE_H#include <ctype.h>#endif#if !defined(HAVE_ISALPHANUM) && defined(HAVE_ISALNUM)#define isalphanum(c) isalnum(c)#endif#if !defined(HAVE_ISALPHANUM) && !defined(HAVE_ISALNUM)#define isalphanum(c) (isalpha(c)||isdigit(c))#endifchar *progname = "afxml";int opt_x = 0;char **opt_j = 0;int opt_j_count = 0;void usage(){    printf("%s version %s\n",progname,PACKAGE_VERSION);    printf("usage: %s [options] infile... \n",progname);    printf("   -V         =   Just print the version number and exit\n");    printf("   -x         =   Don't include infile in output.\n");    printf("   -j segname =   Just print segname for the file.\n");    printf("                  (may be repeated)\n");    exit(0);}/* Return true if segname is in the optj list */bool in_opt_j_list(char *segname){    for(int i=0;i<opt_j_count;i++){	if(strcmp(segname,opt_j[i])==0) return true;    }    return false;}int xml_info(const char *infile){    AFFILE *af = af_open(infile,O_RDONLY,0);    if(!af){	warn("%s",infile);	return -1;    }    printf("<!-- XML generated by afxml version %s -->\n",PACKAGE_VERSION);    printf("<affinfo");    if(!opt_x) printf(" name='%s'",infile);    printf(">\n");    af_rewind_seg(af);			// start at the beginning    char segname[AF_MAX_NAME_LEN];    char segname2[AF_MAX_NAME_LEN];    size_t datalen = 0;    unsigned long arg;    int pages = 0;        while(af_get_next_seg(af,segname,sizeof(segname),&arg,0,&datalen)==0){	if(segname[0]==0) continue;	// segment to ignore	if(strcmp(segname,AF_DIRECTORY)==0) continue; // don't output the directories	/* See if it is a data segment */	int64 page_num = af_segname_page_number(segname);	if(page_num>=0){	    pages += 1;	    continue;	}	/* check optj */	if(opt_j_count > 0 && in_opt_j_list(segname)==false){	    continue;	}	/* Backspace, get the data and print it */	/* Special case for 64-bit values */	af_backspace(af);	unsigned char *data= (unsigned char *)malloc(datalen);	if(af_get_next_seg(af,segname2,sizeof(segname2),&arg,data,&datalen)!=0){	    warn("af_get_next_seg #2 failed");	    break;	}	/* Change bad characters in segname if present */	for(char *cc=segname;*cc;cc++){	    if(!isalphanum(*cc)) *cc = '_';	}	if(datalen==8 && (arg & AF_SEG_QUADWORD || display_as_quad(segname))){	    /* Print it as a 64-bit value.	     * The strcmp is there because early AF_IMAGESIZE segs didn't set	     * AF_SEG_QUADWORD...	     */	    printf("    <%s>%qd</%s>\n",segname,af_decode_q(data),segname);	    free(data);	    continue;	}	/* If arg is present and datasize datalen==0,	 * just print the arg as an unsigned number	 */	if(datalen==0){	    printf("    <%s>%ld</%s>\n",segname,arg,segname);	    free(data);	    continue;	}	/* Just handle it as binhex ... */	printf("    <%s",segname);	if(datalen==0){	    printf(" arg='%lu' />\n",arg);	}	else{	    int  b64size = datalen*2+2;	    char *b64buf = (char *)malloc(b64size);	    int  b64size_real = b64_ntop(data,datalen,b64buf,b64size);	    b64buf[b64size_real] = 000; // null-terminate	    printf(" coding='base64'>");	    fputs(b64buf,stdout);	    printf("</%s>\n",segname);	    free(b64buf);	}	free(data);    }    af_close(af);    printf("    <pages>%d</pages>\n",pages); // tell how many pages we have    printf("</affinfo>\n");    return 0;}	 int main(int argc,char **argv){    int bflag, ch;    const char *infile;    /* Figure out how many cols the screen has... */    bflag = 0;    while ((ch = getopt(argc, argv, "xj:h?V")) != -1) {	switch (ch) {	case 'j':	    if(opt_j==0) opt_j = (char **)malloc(0);	    opt_j_count++;	    opt_j = (char **)realloc(opt_j,sizeof(char *)*opt_j_count);	    opt_j[opt_j_count-1] = strdup(optarg); // make a copy	case 'x':	    opt_x++;	    break;	case 'h':	case '?':	default:	    usage();	    break;	case 'V':	    printf("%s version %s\n",progname,PACKAGE_VERSION);	    exit(0);	}    }    argc -= optind;    argv += optind;    if(argc<1){	usage();    }    /* Loop through all of the files */    printf("<?xml version='1.0' encoding='UTF-8'?>\n");    printf("<affobjects>\n");    while(*argv){	infile = *argv++;		// get the file	argc--;				// decrement argument counter	 	xml_info(infile);    }    printf("</affobjects>\n");    return 0;}

⌨️ 快捷键说明

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