diff --git a/bin/strings/Makefile b/bin/strings/Makefile new file mode 100644 index 0000000..cf0152c --- /dev/null +++ b/bin/strings/Makefile @@ -0,0 +1,5 @@ +strings.a: strings.c + compile strings.c keep=strings + +strings: strings.a + link strings 2/direct256 keep=strings diff --git a/bin/strings/strings.1 b/bin/strings/strings.1 new file mode 100644 index 0000000..08dda5b --- /dev/null +++ b/bin/strings/strings.1 @@ -0,0 +1,96 @@ +.\" Copyright (c) 1980, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" 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 the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 THE REGENTS 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. +.\" +.\" @(#)strings.1 6.11 (Berkeley) 5/9/91 +.\" +.Dd May 9, 1991 +.Dt STRINGS 1 +.Os BSD 3 +.Sh NAME +.Nm strings +.Nd find printable strings in a file +.Sh SYNOPSIS +.Nm strings +.Op Fl afo +.Op Fl n Ar number +.Op Ar file ... +.Sh DESCRIPTION +.Nm Strings +displays the sequences of printable characters in each of the specified +files, or in the standard input, by default. +By default, a sequence must be at least four characters in length +before being displayed. +.Pp +The options are as follows: +.Bl -tag -width Ds +.It Fl a +By default, +.Nm strings +only searches the text and data segments of object files. +The +.Fl a +option causes +.Nm strings +to search the entire object file. +.It Fl f +Each string is preceded by the name of the file +in which it was found. +.It Fl n +Specifies the minimum number of characters in a sequence to be +.Ar number , +instead of four. +.It Fl o +Each string is preceded by its decimal offset in the +file. +.El +.Pp +.Nm Strings +is useful for identifying random binaries, among other things. +.Sh SEE ALSO +.Xr hexdump 1 +.Sh BUGS +The algorithm for identifying strings is extremely primitive. +In particular, machine code instructions on certain architectures +can resemble sequences of ASCII bytes, which +will fool the algorithm. +.Sh COMPATIBILITY +Historic implementations of +.Nm +only search the initialized data portion of the object file. +This was reasonable as strings were normally stored there. +Given new compiler technology which installs strings in the +text portion of the object file, the default behavior was +changed. +.Sh HISTORY +The +.Nm +command appeared in +.Bx 3.0 . diff --git a/bin/strings/strings.1G b/bin/strings/strings.1G new file mode 100644 index 0000000..9b75365 --- /dev/null +++ b/bin/strings/strings.1G @@ -0,0 +1,89 @@ +.\" Copyright (c) 1980, 1990 The Regents of the University of California. +.\" All rights reserved. +.\" +.\" 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 the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 THE REGENTS 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. +.\" +.\" @(#)strings.1 6.11 (Berkeley) 5/9/91 +.\" +.TH STRINGS 1 "9 May 1991" GNO "Commands and Applications" +.SH NAME +.BR strings +\- find printable strings in a file +.SH SYNOPSIS +.BR strings +.RB [ -afo ] +.RB [ -n +.IR number ] +.RI [ "file ..." ] +.SH DESCRIPTION +.BR Strings +displays the sequences of printable characters in each of the specified +files, or in the standard input, by default. +By default, a sequence must be at least four characters in length +before being displayed. +.LP +.BR Strings +is useful for identifying random binaries, among other things. +.SH OPTIONS +.IP \fB-a\fR +By default, +.BR strings +only searches the text and data segments of object files. The +.BR \-a +option causes +.BR strings +to search the entire object file. +.IP \fB-f\fR +Each string is preceded by the name of the file in which it was found. +.IP \fB-n\fR +Specifies the minimum number of characters in a sequence to be +.BR number , +instead of four. +.IP \fB-o\fR +Each string is preceded by its decimal offset in the +file. +.SH SEE ALSO +.BR hexdump (1) +.SH BUGS +The algorithm for identifying strings is extremely primitive. +In particular, machine code instructions on certain architectures +can resemble sequences of ASCII bytes, which +will fool the algorithm. +.SH COMPATIBILITY +Historic implementations of +.BR strings +only search the initialized data portion of the object file. +This was reasonable as strings were normally stored there. +Given new compiler technology which installs strings in the +text portion of the object file, the default behavior was +changed. +.SH HISTORY +The +.BR strings +command appeared in 3.0 BSD. diff --git a/bin/strings/strings.c b/bin/strings/strings.c new file mode 100644 index 0000000..17349f4 --- /dev/null +++ b/bin/strings/strings.c @@ -0,0 +1,96 @@ +#pragma stacksize 1024 + +#include +#include +#include +#include + +const long bufSize = 512l; +int all; + +int myprint(char c) +{ + if (all) { + if (isprint(c) || (c==9)) return 1; + } else { + if ( ((c>64) && (c<91)) || ((c>96) && (c<123)) || ((c>47) && (c<58)) + || (c==32) || (c==9) ) return 1; + } + return 0; +} + +main(int argc,char **argv) +{ +FILE *duh; +int concur,c,errflg = 0,size,pos; +int inRow = 4,keepOff = FALSE; +unsigned char *buffer,*string; +unsigned long stringSize = 256l,offSet; +extern char *optarg; +extern int optind; +extern int getopt(int,char **,char*); + +/* optarg = NULL; optind = 0; */ /* this makes getopt restartable */ + all = FALSE; + + while ((c = getopt(argc,argv, "c:na")) != EOF) { + switch (c) { + case 'c' : + inRow = atoi(optarg); + break; + case 'n' : + keepOff = TRUE; + break; + case 'a' : + all = TRUE; + break; + default : errflg++; + } + } + if (errflg) { + fprintf(stderr,"usage: strings [-a] [-c #chars] [-n] files...\n"); + exit(2); + } + if (inRow < 4) inRow = 4; + printf("optind: %d argc: %d\n",optind,argc); + argv += optind; + buffer = (unsigned char *)malloc(bufSize); + string = (unsigned char *)malloc(stringSize); + if (optind == argc) { + duh = stdin; + goto action; + } + for (;optind stringSize) { + stringSize += 256l; + if ((string = realloc(string,stringSize)) == NULL) + exit(2); + } + } else if ((isspace(c) || !c) && (concur >= inRow)) { + string[concur] = 0; + if (keepOff) printf("%6.6lX : ",offSet); + printf("%s\n",string); + concur = 0; + } else { + concur = 0; + } + } + } + fclose(duh); + } + free(buffer); + free(string); + exit(0); +}