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

📄 softmagic.c

📁 sleuthit-2.09 一个磁盘的工具集
💻 C
📖 第 1 页 / 共 3 页
字号:
/* * Convert the byte order of the data we are looking at * While we're here, let's apply the mask operation * (unless you have a better idea) */private intmconvert(struct magic_set *ms, struct magic *m){	union VALUETYPE *p = &ms->ms_value;	switch (m->type) {	case FILE_BYTE:		cvt_8(p, m);		return 1;	case FILE_SHORT:		cvt_16(p, m);		return 1;	case FILE_LONG:	case FILE_DATE:	case FILE_LDATE:		cvt_32(p, m);		return 1;	case FILE_QUAD:	case FILE_QDATE:	case FILE_QLDATE:		cvt_64(p, m);		return 1;	case FILE_STRING:	case FILE_BESTRING16:	case FILE_LESTRING16: {		size_t len;				/* Null terminate and eat *trailing* return */		p->s[sizeof(p->s) - 1] = '\0';		len = strlen(p->s);		if (len-- && p->s[len] == '\n')			p->s[len] = '\0';		return 1;	}	case FILE_PSTRING: {		char *ptr1 = p->s, *ptr2 = ptr1 + 1;		size_t len = *p->s;		if (len >= sizeof(p->s))			len = sizeof(p->s) - 1;		while (len--)			*ptr1++ = *ptr2++;		*ptr1 = '\0';		len = strlen(p->s);		if (len-- && p->s[len] == '\n')			p->s[len] = '\0';		return 1;	}	case FILE_BESHORT:		p->h = (short)((p->hs[0]<<8)|(p->hs[1]));		cvt_16(p, m);		return 1;	case FILE_BELONG:	case FILE_BEDATE:	case FILE_BELDATE:		p->l = (int32_t)		    ((p->hl[0]<<24)|(p->hl[1]<<16)|(p->hl[2]<<8)|(p->hl[3]));		cvt_32(p, m);		return 1;	case FILE_BEQUAD:	case FILE_BEQDATE:	case FILE_BEQLDATE:		p->q = (int64_t)		    (((int64_t)p->hq[0]<<56)|((int64_t)p->hq[1]<<48)|		     ((int64_t)p->hq[2]<<40)|((int64_t)p->hq[3]<<32)|		     (p->hq[4]<<24)|(p->hq[5]<<16)|(p->hq[6]<<8)|(p->hq[7]));		cvt_64(p, m);		return 1;	case FILE_LESHORT:		p->h = (short)((p->hs[1]<<8)|(p->hs[0]));		cvt_16(p, m);		return 1;	case FILE_LELONG:	case FILE_LEDATE:	case FILE_LELDATE:		p->l = (int32_t)		    ((p->hl[3]<<24)|(p->hl[2]<<16)|(p->hl[1]<<8)|(p->hl[0]));		cvt_32(p, m);		return 1;	case FILE_LEQUAD:	case FILE_LEQDATE:	case FILE_LEQLDATE:		p->q = (int64_t)		    (((int64_t)p->hq[7]<<56)|((int64_t)p->hq[6]<<48)|		     ((int64_t)p->hq[5]<<40)|((int64_t)p->hq[4]<<32)|		     (p->hq[3]<<24)|(p->hq[2]<<16)|(p->hq[1]<<8)|(p->hq[0]));		cvt_64(p, m);		return 1;	case FILE_MELONG:	case FILE_MEDATE:	case FILE_MELDATE:		p->l = (int32_t)		    ((p->hl[1]<<24)|(p->hl[0]<<16)|(p->hl[3]<<8)|(p->hl[2]));		cvt_32(p, m);		return 1;	case FILE_REGEX:	case FILE_SEARCH:	case FILE_DEFAULT:		return 1;	default:		file_magerror(ms, "invalid type %d in mconvert()", m->type);		return 0;	}}private voidmdebug(uint32_t offset, const char *str, size_t len){	(void) fprintf(stderr, "mget @%d: ", offset);	file_showstr(stderr, str, len);	(void) fputc('\n', stderr);	(void) fputc('\n', stderr);}private intmcopy(struct magic_set *ms, union VALUETYPE *p, int type, int indir,    const unsigned char *s, uint32_t offset, size_t nbytes, size_t linecnt){	/*	 * Note: FILE_SEARCH and FILE_REGEX do not actually copy	 * anything, but setup pointers into the source	 */	if (indir == 0) {		switch (type) {		case FILE_SEARCH:			ms->search.s = (const char *)s + offset;			ms->search.s_len = nbytes - offset;			return 0;		case FILE_REGEX: {			/*			 * offset is interpreted as last line to search,			 * (starting at 1), not as bytes-from start-of-file			 */			const char *b;			const char *c;			const char *last;	/* end of search region */			const char *buf;	/* start of search region */			size_t lines;			if (s == NULL) {				ms->search.s_len = 0;				ms->search.s = NULL;				return 0;			}			buf = (const char *)s + offset;			last = (const char *)s + nbytes;			/* mget() guarantees buf <= last */			for (lines = linecnt, b = buf;			     lines && ((b = strchr(c = b, '\n')) || (b = strchr(c, '\r')));			     lines--, b++) {				last = b;				if (b[0] == '\r' && b[1] == '\n')					b++;			}			if (lines)				last = (const char *)s + nbytes;						ms->search.s = buf;			ms->search.s_len = last - buf;			ms->search.offset = offset;			ms->search.rm_len = 0;			return 0;		}		case FILE_BESTRING16:		case FILE_LESTRING16: {			const unsigned char *src = s + offset;			const unsigned char *esrc = s + nbytes;			char *dst = p->s;			char *edst = &p->s[sizeof(p->s) - 1];						if (type == FILE_BESTRING16)				src++;						/* check for pointer overflow */			if (src < s) {				file_magerror(ms, "invalid offset %zu in mcopy()",				    offset);				return -1;			}			for (/*EMPTY*/; src < esrc; src++, dst++) {				if (dst < edst)					*dst = *src++;				else					break;				if (*dst == '\0')					*dst = ' ';			}			*edst = '\0';			return 0;		}		case FILE_STRING:	/* XXX - these two should not need */		case FILE_PSTRING:	/* to copy anything, but do anyway. */		default:			break;		}	}	if (offset >= nbytes) {		(void)memset(p, '\0', sizeof(*p));		return 0;	}	if (nbytes - offset < sizeof(*p))		nbytes = nbytes - offset;	else		nbytes = sizeof(*p);	(void)memcpy(p, s + offset, nbytes);	/*	 * the usefulness of padding with zeroes eludes me, it	 * might even cause problems	 */	if (nbytes < sizeof(*p))		(void)memset(((char *)(void *)p) + nbytes, '\0',		    sizeof(*p) - nbytes);	return 0;}private intmget(struct magic_set *ms, const unsigned char *s,    struct magic *m, size_t nbytes, unsigned int cont_level){	uint32_t offset = ms->offset;	uint32_t count = m->str_count;	union VALUETYPE *p = &ms->ms_value;	if (mcopy(ms, p, m->type, m->flag & INDIR, s, offset, nbytes, count) == -1)		return -1;	if ((ms->flags & MAGIC_DEBUG) != 0) {		mdebug(offset, (char *)(void *)p, sizeof(union VALUETYPE));		file_mdump(m);	}	if (m->flag & INDIR) {		int off = m->in_offset;		if (m->in_op & FILE_OPINDIRECT) {			const union VALUETYPE *q =			    ((const void *)(s + offset + off));			switch (m->in_type) {			case FILE_BYTE:				off = q->b;				break;			case FILE_SHORT:				off = q->h;				break;			case FILE_BESHORT:				off = (short)((q->hs[0]<<8)|(q->hs[1]));				break;			case FILE_LESHORT:				off = (short)((q->hs[1]<<8)|(q->hs[0]));				break;			case FILE_LONG:				off = q->l;				break;			case FILE_BELONG:				off = (int32_t)((q->hl[0]<<24)|(q->hl[1]<<16)|						 (q->hl[2]<<8)|(q->hl[3]));				break;			case FILE_LELONG:				off = (int32_t)((q->hl[3]<<24)|(q->hl[2]<<16)|						 (q->hl[1]<<8)|(q->hl[0]));				break;			case FILE_MELONG:				off = (int32_t)((q->hl[1]<<24)|(q->hl[0]<<16)|						 (q->hl[3]<<8)|(q->hl[2]));				break;			}		}		switch (m->in_type) {		case FILE_BYTE:			if (nbytes < (offset + 1))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = p->b & off;					break;				case FILE_OPOR:					offset = p->b | off;					break;				case FILE_OPXOR:					offset = p->b ^ off;					break;				case FILE_OPADD:					offset = p->b + off;					break;				case FILE_OPMINUS:					offset = p->b - off;					break;				case FILE_OPMULTIPLY:					offset = p->b * off;					break;				case FILE_OPDIVIDE:					offset = p->b / off;					break;				case FILE_OPMODULO:					offset = p->b % off;					break;				}			} else				offset = p->b;			if (m->in_op & FILE_OPINVERSE)				offset = ~offset;			break;		case FILE_BESHORT:			if (nbytes < (offset + 2))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) &						 off;					break;				case FILE_OPOR:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) |						 off;					break;				case FILE_OPXOR:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) ^						 off;					break;				case FILE_OPADD:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) +						 off;					break;				case FILE_OPMINUS:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) -						 off;					break;				case FILE_OPMULTIPLY:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) *						 off;					break;				case FILE_OPDIVIDE:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) /						 off;					break;				case FILE_OPMODULO:					offset = (short)((p->hs[0]<<8)|							 (p->hs[1])) %						 off;					break;				}			} else				offset = (short)((p->hs[0]<<8)|						 (p->hs[1]));			if (m->in_op & FILE_OPINVERSE)				offset = ~offset;			break;		case FILE_LESHORT:			if (nbytes < (offset + 2))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) &						 off;					break;				case FILE_OPOR:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) |						 off;					break;				case FILE_OPXOR:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) ^						 off;					break;				case FILE_OPADD:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) +						 off;					break;				case FILE_OPMINUS:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) -						 off;					break;				case FILE_OPMULTIPLY:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) *						 off;					break;				case FILE_OPDIVIDE:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) /						 off;					break;				case FILE_OPMODULO:					offset = (short)((p->hs[1]<<8)|							 (p->hs[0])) %						 off;					break;				}			} else				offset = (short)((p->hs[1]<<8)|						 (p->hs[0]));			if (m->in_op & FILE_OPINVERSE)				offset = ~offset;			break;		case FILE_SHORT:			if (nbytes < (offset + 2))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = p->h & off;					break;				case FILE_OPOR:					offset = p->h | off;					break;				case FILE_OPXOR:					offset = p->h ^ off;					break;				case FILE_OPADD:					offset = p->h + off;					break;				case FILE_OPMINUS:					offset = p->h - off;					break;				case FILE_OPMULTIPLY:					offset = p->h * off;					break;				case FILE_OPDIVIDE:					offset = p->h / off;					break;				case FILE_OPMODULO:					offset = p->h % off;					break;				}			}			else				offset = p->h;			if (m->in_op & FILE_OPINVERSE)				offset = ~offset;			break;		case FILE_BELONG:			if (nbytes < (offset + 4))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) &						 off;					break;				case FILE_OPOR:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) |						 off;					break;				case FILE_OPXOR:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) ^						 off;					break;				case FILE_OPADD:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) +						 off;					break;				case FILE_OPMINUS:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) -						 off;					break;				case FILE_OPMULTIPLY:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) *						 off;					break;				case FILE_OPDIVIDE:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) /						 off;					break;				case FILE_OPMODULO:					offset = (int32_t)((p->hl[0]<<24)|							 (p->hl[1]<<16)|							 (p->hl[2]<<8)|							 (p->hl[3])) %						 off;					break;				}			} else				offset = (int32_t)((p->hl[0]<<24)|						 (p->hl[1]<<16)|						 (p->hl[2]<<8)|						 (p->hl[3]));			if (m->in_op & FILE_OPINVERSE)				offset = ~offset;			break;		case FILE_LELONG:			if (nbytes < (offset + 4))				return 0;			if (off) {				switch (m->in_op & FILE_OPS_MASK) {				case FILE_OPAND:					offset = (int32_t)((p->hl[3]<<24)|							 (p->hl[2]<<16)|							 (p->hl[1]<<8)|							 (p->hl[0])) &						 off;					break;				case FILE_OPOR:					offset = (int32_t)((p->hl[3]<<24)|							 (p->hl[2]<<16)|							 (p->hl[1]<<8)|							 (p->hl[0])) |						 off;					break;				case FILE_OPXOR:					offset = (int32_t)((p->hl[3]<<24)|							 (p->hl[2]<<16)|							 (p->hl[1]<<8)|							 (p->hl[0])) ^						 off;					break;

⌨️ 快捷键说明

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