140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
/* 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);
 | 
						|
}
 |