140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* strings - print ASCII strings in a file	Author: Peter S. Housel */
 | |
| 
 | |
| /*
 | |
|   This is a version of the BSD "strings" program for Minix. It is used
 | |
|   to search a file for printable strings. To install,
 | |
| 
 | |
|   cc -o strings strings.c
 | |
|   chmem =8000 strings
 | |
| 
 | |
| Command:  strings - search file for printable strings
 | |
| Syntax:	  strings [-] [-o] [-len] file ...
 | |
| Flags:	  -	Search the entire file. If this option is not given, only
 | |
| 	 	the initialized data segment of files that appear to be
 | |
| 		"a.out" format is searched.
 | |
|     	  -o	Print the offset (in octal) with each string.
 | |
|           -len	Use "len" as the minimum string length. The default is 4.
 | |
| 
 | |
| Examples: strings core
 | |
| 	  strings -o a.out > str
 | |
| 
 | |
| Strings searches the specified file(s) for printable ASCII strings (four
 | |
| or more printable characters followed by a newline or a null) and writes
 | |
| them to the standard output. This can be used to find out, for example, to
 | |
| find out what program a "core" file came from, what kinds of error messages
 | |
| are in an executable, or to see ASCII data hidden in a "binary" data file.
 | |
| 
 | |
| P.S. The program doesn't use the "a.out.h" file posted last week by
 | |
| Dick van Veen, both because it was written before then, and because
 | |
| not everybody has a.out.h yet. Future revisions probably ought to, though.
 | |
| 
 | |
| */
 | |
| 
 | |
| 
 | |
| 
 | |
| #include <ctype.h>
 | |
| #include <stdlib.h>
 | |
| #include <string.h>
 | |
| #include <stdio.h>
 | |
| 
 | |
| /* Minix (8086 version) dependant definitions */
 | |
| #define SMALLMAGIC	0x04100301L	/* small model a.out magic number */
 | |
| #define SEPARATEMAGIC	0x04200301L	/* separate instruction/data a.out */
 | |
| 
 | |
| #define HDR_MAGIC	0	/* 0'th long  magic number */
 | |
| #define HDR_HSIZE	1	/* 1'st long  size of header */
 | |
| #define HDR_TSIZE	2	/* 2'nd long  size of text */
 | |
| #define HDR_DSIZE	3	/* 3'rd long  size of init'ed data */
 | |
| #define HDR_BSIZE	4	/* 4'th long  size of bss */
 | |
| #define HDR_TOTMEM	6	/* 6'th long  total memory */
 | |
| 
 | |
| #define HDR_LEN		8	/* total length of header */
 | |
| 
 | |
| /* Miscellaneous definitions */
 | |
| #define	STRLEN		4	/* default minimum string length */
 | |
| #define STRBUF		512	/* buffer length for strings */
 | |
| 
 | |
| _PROTOTYPE(int main, (int argc, char **argv));
 | |
| _PROTOTYPE(void strings, (char *filename));
 | |
| _PROTOTYPE(void usage, (void));
 | |
| 
 | |
| int strmin = STRLEN;		/* minimum string length */
 | |
| int printoff = 0;		/* print octal offset of each str */
 | |
| int objall = 0;			/* search entire a.out file, not */
 | |
| 
 | |
| /* Just initialized data segment */
 | |
| 
 | |
| int main(argc, argv)
 | |
| int argc;
 | |
| char *argv[];
 | |
| {
 | |
|   while ((++argv, --argc) && '-' == (*argv)[0]) {
 | |
| 	if (!strcmp(*argv, "-"))
 | |
| 		++objall;
 | |
| 	else if (!strcmp(*argv, "-o"))
 | |
| 		++printoff;
 | |
| 	else if (isdigit((*argv)[1]))
 | |
| 		strmin = atoi(&(*argv)[1]);
 | |
| 	else
 | |
| 		usage();
 | |
|   }
 | |
| 
 | |
|   if (0 == argc) usage();
 | |
|   while (argc--) strings(*argv++);
 | |
|   return(0);
 | |
| }
 | |
| 
 | |
| void strings(filename)
 | |
| char *filename;
 | |
| {
 | |
|   char buf[STRBUF];		/* the strings buffer */
 | |
|   char *bufptr;			/* pointer into the strings buffer */
 | |
|   FILE *input;			/* input file */
 | |
|   long header[HDR_LEN];		/* buffer for reading the header */
 | |
|   long offset;			/* file offset */
 | |
|   long limit;			/* limit, if doing data segment only */
 | |
|   int c;			/* input character */
 | |
| 
 | |
|   if (NULL == (input = fopen(filename, "r"))) {
 | |
| 	fprintf(stderr, "strings: ");
 | |
| 	perror(filename);
 | |
| 	exit(1);
 | |
|   }
 | |
|   if (HDR_LEN == fread(header, sizeof(long), (size_t)HDR_LEN, input)
 | |
|       && (SMALLMAGIC == header[HDR_MAGIC]
 | |
| 	||SEPARATEMAGIC == header[HDR_MAGIC]) && !objall) {
 | |
| 	offset = header[HDR_HSIZE] + header[HDR_TSIZE];	/* object file */
 | |
| 	limit = offset + header[HDR_DSIZE];
 | |
|   } else {
 | |
| 	offset = 0L;
 | |
| 	limit = 0L;
 | |
|   }
 | |
| 
 | |
|   fseek(input, offset, 0);
 | |
|   bufptr = buf;
 | |
| 
 | |
|   while (!limit || offset < limit) {
 | |
| 	if (EOF == (c = getc(input))) break;
 | |
| 	if ((('\0' == c || '\n' == c) && bufptr - buf >= strmin)
 | |
| 	    || (bufptr - buf == STRBUF - 1)) {
 | |
| 		*bufptr = '\0';
 | |
| 		if (printoff) printf("%lo:", offset - (bufptr - buf));
 | |
| 		puts(buf);
 | |
| 		bufptr = buf;
 | |
| 	} else if ((' ' <= c && c < 0177) || '\t' == c)
 | |
| 		*bufptr++ = c;
 | |
| 	else
 | |
| 		bufptr = buf;
 | |
| 
 | |
| 	++offset;
 | |
|   }
 | |
| 
 | |
|   fclose(input);
 | |
| }
 | |
| 
 | |
| void usage()
 | |
| {
 | |
|   fprintf(stderr, "usage: strings [-] [-o] [-num] file ...\n");
 | |
|   exit(1);
 | |
| }
 | 
