Finn tekst i binære filer med Linux-kommandoen `strings`

Ønsker du å avdekke tekstinnholdet i binære filer eller datafiler? Linux-kommandoen «strings» er et kraftig verktøy som trekker ut disse tekstbitene, kjent som «strenger», for deg.

Linux tilbyr et mangfold av kommandoer, og «strings» kan i utgangspunktet virke som et verktøy uten en åpenbar bruksområde. Men hva er egentlig poenget? Hvilken verdi har en kommando som avslører lesbare tekststrenger fra en binær fil?

La oss ta et steg tilbake. Binære filer, som for eksempel programfiler, kan inneholde tekststrenger som er lesbare. Men hvordan får du tak i disse? Forsøk med kommandoer som «cat» eller «less» kan føre til at terminalvinduet henger seg opp. Programmer som er designet for å håndtere tekstfiler, håndterer dårlig situasjoner der ikke-utskrivbare tegn blir matet inn.

Majoriteten av bytene i en binær fil er ikke lesbare for mennesker og kan ikke vises i terminalen på en meningsfull måte. Det finnes ingen tegn eller standard symboler som representerer binære verdier som ikke samsvarer med alfanumeriske tegn, tegnsetting eller mellomrom. Disse er samlet kjent som «utskrivbare» tegn. De resterende tegnene faller under kategorien «ikke-utskrivbare» tegn.

Det å vise eller søke gjennom en binær- eller datafil etter tekststrenger kan derfor være problematisk. Det er her «strings» kommer inn. Kommandoen henter ut sekvenser av utskrivbare tegn fra filer, slik at andre kommandoer kan bruke dem uten problemer med tegn som ikke kan skrives ut.

Hvordan Bruke «strings» Kommandoen

Det er enkelt å bruke «strings», og den grunnleggende funksjonen er veldig rett frem. Du angir bare filnavnet som du vil at «strings» skal gjennomsøke, i kommandolinjen.

La oss bruke «strings» på en binær fil – en kjørbar fil – som vi har kalt «jibber». Vi skriver «strings», et mellomrom, «jibber» og trykker Enter:

strings jibber

Strengene hentes ut av filen og vises i terminalvinduet.

Angi Minimum Lengde for Strenger

Som standard søker «strings» etter strenger som består av fire tegn eller mer. For å endre minimumslengden, kan du bruke alternativet «-n» (minimumslengde).

Vær oppmerksom på at jo kortere minimumslengde du angir, jo større er risikoen for å se mer «søppel» i resultatet.

Enkelte binære verdier kan ha samme numeriske verdi som et utskrivbart tegn. Hvis to slike verdier tilfeldigvis ligger ved siden av hverandre i filen, og du setter minimumslengden til to, vil disse bytene bli tolket som en streng.

For å be «strings» om å bruke en minimumslengde på to tegn, bruker du følgende kommando:

strings -n 2 jibber

Resultatet inneholder nå strenger med to tegn. Merk at mellomrom også regnes som et utskrivbart tegn.

Overføre «strings» til «less» for Enklere Navigering

På grunn av den potensielt lange utdataen fra «strings», er det nyttig å sende den gjennom kommandoen «less». Dette gjør det enklere å bla gjennom og søke etter interessant tekst.

strings jibber | less

Utdataen vises nå i «less», med begynnelsen av filen først.

«strings» med Objektfiler

Vanligvis blir programkildekodefiler kompilert til objektfiler, som deretter kobles sammen med biblioteksfiler for å lage en kjørebar binærfil. Vi har objektfilen for «jibber», så la oss se hva vi finner der. Legg merke til filtypen «.o».

strings jibber.o | less

Det første settet med strenger er pakket inn i kolonne åtte hvis de er lenger enn åtte tegn, og merket med et «H» i kolonne ni hvis innpakking har skjedd. Du kan se at disse strengene er SQL-setninger.

Bla gjennom utdataen viser at denne formateringen ikke blir brukt i hele filen.

Det er interessant å se forskjellene i tekststrengene mellom objektfilen og den ferdige, kjørbare filen.

Søke i Spesifikke Områder av Filen

Kompilerte programmer har forskjellige områder for lagring av tekst. Som standard søker «strings» i hele filen, akkurat som om du brukte alternativet «-a» (alle). For å instruere «strings» om å søke kun i initialiserte dataseksjoner i filen, bruker du alternativet «-d» (data).

strings -d jibber | less

Med mindre du har en spesiell grunn, kan du like godt bruke standardinnstillingen og søke i hele filen.

Viser Strengens Offset

Vi kan be «strings» om å vise offset-verdien fra begynnelsen av filen der hver streng er lokalisert. For å gjøre dette bruker vi alternativet «-o» (offset).

strings -o parse_phrases | less

Offset-verdien er gitt i oktal format.

For å vise offset-verdien i et annet tallsystem, som desimal eller heksadesimal, kan du bruke alternativet «-t» (radix). Radix-alternativet må følges av «d» (desimal), «x» (heksadesimal) eller «o» (oktal). «-to» er det samme som å bare bruke «-o».

strings -t d parse_phrases | less

Offset-verdiene vises nå i desimaltall.

strings -t x parse_phrases | less

Offset-verdiene vises nå i heksadesimaltall.

Inkluderer Mellomrom i Strenger

«strings» ser tabulator- og mellomromstegn som en del av strengene den finner. Andre mellomromstegn, som nye linjer og vognretur, blir ikke behandlet som en del av strengene. Alternativet «-w» (mellomrom) får «strings» til å behandle alle mellomromstegn som deler av strengen.

strings -w add_data | less

Vi kan se den tomme linjen i utdataen som er et resultat av (usynlige) vognretur- og nylinjetegn på slutten av den andre linjen.

Ikke Bare Begrenset til Filer

Vi kan bruke «strings» med alt som er, eller kan produsere, en byte-strøm.

Med denne kommandoen kan vi for eksempel se på tilfeldig tilgangsminne (RAM) på datamaskinen vår.

Vi må bruke «sudo» fordi vi vil ha tilgang til «/dev/mem», en fil som representerer datamaskinens hovedminne.

sudo strings /dev/mem | less

Utdataen representerer ikke hele innholdet i RAM, men bare de strengene som kan hentes ut.

Søke i Flere Filer Samtidig

Jokertegn kan brukes for å velge grupper av filer for søk. Stjernen (*) representerer flere tegn, mens spørsmålstegnet (?) står for ett enkelt tegn. Du kan også liste opp flere filnavn i kommandolinjen.

Vi bruker et jokertegn til å søke gjennom alle kjørbare filer i «/bin»-katalogen. Fordi utdataen vil inneholde resultater fra mange filer, vil vi bruke alternativet «-f» (filnavn). Dette vil skrive ut filnavnet i begynnelsen av hver linje, slik at vi kan se hvilken fil hver streng kommer fra. Deretter sender vi resultatet gjennom grep og ser etter strenger som inneholder ordet «Copyright».

strings -f /bin/* | grep Copyright

Vi får en oversiktlig liste over opphavsrettserklæringene i hver fil i «/bin»-katalogen, med filnavnet i begynnelsen av hver linje.

«strings» forklart

Det er ingen hemmelighet bak «strings». Det er en typisk Linux-kommando som gjør en spesifikk oppgave veldig bra.

Kommandoen er et av de mange verktøyene i Linux-økosystemet, og den kommer virkelig til sin rett når den samarbeider med andre kommandoer. Når du ser hvordan den kan binde sammen binære filer og andre verktøy, som «grep», begynner du å sette pris på nytten til denne litt obskure kommandoen.