Comment utiliser la commande strings sous Linux

Vous voulez voir le texte dans un fichier binaire ou de données? La commande Linux strings extrait ces morceaux de texte – appelés «chaînes» – pour vous.

Linux regorge de commandes qui peuvent ressembler à des solutions à la recherche de problèmes. La commande strings tombe définitivement dans ce camp. Quel est son but au juste? Y a-t-il un point vers une commande qui répertorie les chaînes imprimables à partir d’un fichier binaire?

Faisons un pas en arrière. Les fichiers binaires, tels que les fichiers programme, peuvent contenir des chaînes de texte lisible par l’homme. Mais comment pouvez-vous les voir? Si vous utilisez cat ou moins, vous risquez de vous retrouver avec une fenêtre de terminal suspendue. Les programmes conçus pour fonctionner avec des fichiers texte ne fonctionnent pas bien si des caractères non imprimables y sont introduits.

La plupart des octets d’un fichier binaire ne sont pas lisibles par l’homme et ne peuvent pas être imprimés dans la fenêtre du terminal d’une manière qui a du sens. Il n’y a pas de caractères ou de symboles standard pour représenter des valeurs binaires qui ne correspondent pas aux caractères alphanumériques, à la ponctuation ou aux espaces. Collectivement, ces derniers sont appelés caractères «imprimables». Les autres sont des caractères «non imprimables».

Donc, essayer d’afficher ou de rechercher dans un fichier binaire ou de données des chaînes de texte est un problème. Et c’est là que les cordes entrent en jeu. Il extrait chaînes de caractères imprimables à partir de fichiers afin que d’autres commandes puissent utiliser les chaînes sans avoir à faire face à des caractères non imprimables.

Utilisation de la commande strings

La commande strings n’a rien de compliqué et son utilisation de base est très simple. Nous fournissons le nom du fichier dans lequel nous souhaitons que les chaînes recherchent sur la ligne de commande.

  Comment ajouter des contacts iOS aux contacts sur Windows 10

Ici, nous allons utiliser des chaînes sur un fichier binaire – un fichier exécutable – appelé «jibber». Nous tapons des chaînes, un espace, «jibber» puis appuyez sur Entrée.

strings jibber

cordes jibber dans une fenêtre de terminal

Les chaînes sont extraites du fichier et répertoriées dans la fenêtre du terminal.

chaîne sortie dans une fenêtre de terminal

Définition de la longueur de chaîne minimale

Par défaut, les chaînes rechercheront des chaînes de quatre caractères ou plus. Pour définir une longueur minimale plus longue ou plus courte, utilisez l’option -n (longueur minimale).

Notez que plus la longueur minimale est courte, plus vous avez de chances de voir plus d’ordures.

Certaines valeurs binaires ont la même valeur numérique que la valeur qui représente un caractère imprimable. Si deux de ces valeurs numériques se trouvent côte à côte dans le fichier et que vous spécifiez une longueur minimale de deux, ces octets seront signalés comme s’il s’agissait d’une chaîne.

Pour demander aux chaînes d’utiliser deux comme longueur minimale, utilisez la commande suivante.

strings -n 2 jibber

strings -n 2 jibber dans une fenêtre de terminal

Nous avons maintenant des chaînes de deux lettres incluses dans les résultats. Notez que les espaces sont comptés comme un caractère imprimable.

chaînes de sortie avec deux chaînes de lettres dans une fenêtre de terminal

Piping strings Through Less

En raison de la longueur de la sortie des chaînes, nous allons la faire passer moins. Nous pouvons ensuite faire défiler le fichier à la recherche de texte d’intérêt.

strings jibber | less

cordes jibber | moins dans une fenêtre de terminal

La liste est maintenant présentée pour nous en moins, avec le haut de la liste affiché en premier.

chaînes de sortie en moins dans une fenêtre de terminal

Utilisation de chaînes avec des fichiers objets

En règle générale, les fichiers de code source du programme sont compilés dans des fichiers objet. Ceux-ci sont liés à des fichiers de bibliothèque pour créer un fichier exécutable binaire. Nous avons le fichier objet jibber à portée de main, alors jetons un œil à l’intérieur de ce fichier. Notez l’extension de fichier «.o».

jibber.o | less

jibber.o | moins dans une fenêtre de terminal

Le premier ensemble de chaînes est encapsulé dans la huitième colonne s’il contient plus de huit caractères. S’ils ont été encapsulés, un caractère «H» est dans la colonne neuf. Vous pouvez reconnaître ces chaînes comme des instructions SQL.

  Comment utiliser Google Maps et Apple Maps en déplacement sans connexion Internet

chaînes de sortie en moins dans une fenêtre de terminal

Le défilement de la sortie révèle que ce formatage n’est pas utilisé dans tout le fichier.

chaînes de sortie en moins dans une fenêtre de terminal

Il est intéressant de voir les différences dans les chaînes de texte entre le fichier objet et l’exécutable terminé.

Recherche dans des zones spécifiques du fichier

Les programmes compilés ont différentes zones en eux-mêmes qui sont utilisées pour stocker du texte. Par défaut, les chaînes recherchent du texte dans tout le fichier. C’est comme si vous aviez utilisé l’option -a (all). Pour que les chaînes ne recherchent que dans les sections de données initialisées et chargées du fichier, utilisez l’option -d (données).

strings -d jibber | less

cordes -d jibber | moins dans une fenêtre de terminal

Sauf si vous avez une bonne raison de le faire, vous pouvez également utiliser le paramètre par défaut et rechercher l’ensemble du fichier.

Impression du décalage de chaîne

Nous pouvons faire en sorte que les chaînes impriment le décalage depuis le début du fichier dans lequel se trouve chaque chaîne. Pour ce faire, utilisez l’option -o (offset).

strings -o parse_phrases | less

chaînes -o parse_phrases | Moins

Le décalage est donné en Octal.

chaînes avec le décalage en octal dans une fenêtre de terminal

Pour afficher le décalage dans une base numérique différente, telle que décimale ou hexadécimale, utilisez l’option -t (base). L’option radix doit être suivie de d (décimal), X (hexadécimal) ou o (octal). Utiliser -to équivaut à utiliser -o.

strings -t d parse_phrases | less

strings -td parse_phrases | moins dans une fenêtre de terminal

Les décalages sont maintenant imprimés en décimal.

chaînes de sortie avec décalages en décimal dans une fenêtre de terminal

strings -t x parse_phrases | less

chaînes -tx parse_phrases | moins dans une fenêtre de terminal

Les décalages sont maintenant imprimés en hexadécimal.

chaînes de sortie avec des décalages en hexadécimal dans une fenêtre de terminal

Y compris les espaces blancs

strings considère que les caractères tabulation et espace font partie des chaînes trouvées. Les autres caractères d’espacement, tels que les retours à la ligne et les retours chariot, ne sont pas traités comme s’ils faisaient partie des chaînes. L’option -w (espace) permet aux chaînes de traiter tous les caractères d’espacement comme s’ils faisaient partie de la chaîne.

strings -w add_data | less

chaînes -w add_data | moins dans une fenêtre de terminal

Nous pouvons voir la ligne vide dans la sortie, qui est le résultat du retour chariot (invisible) et des caractères de nouvelle ligne à la fin de la deuxième ligne.

  Comment définir les applications par défaut sur Windows 10 1809

chaîne sortie dans une fenêtre de terminal

Nous ne sommes pas limités aux fichiers

Nous pouvons utiliser des chaînes avec tout ce qui est, ou peut produire, un flux d’octets.

Avec cette commande, nous pouvons parcourir le mémoire vive (RAM) de notre ordinateur.

Nous devons utiliser sudo car nous accédons à / dev / mem. Il s’agit d’un fichier de périphérique de caractères contenant une image de la mémoire principale de votre ordinateur.

sudo strings /dev/mem | less

sudo strings / dev / mem | moins dans une fenêtre de terminal

La liste n’est pas le contenu entier de votre RAM. Ce ne sont que les chaînes qui peuvent en être extraites.

chaînes de sortie en moins dans une fenêtre de terminal

Recherche de plusieurs fichiers à la fois

Les caractères génériques peuvent être utilisés pour sélectionner des groupes de fichiers à rechercher. Le caractère * représente plusieurs caractères et le? caractère représente n’importe quel caractère unique. Vous pouvez également choisir de fournir de nombreux noms de fichiers sur la ligne de commande.

Nous allons utiliser un caractère générique et rechercher dans tous les fichiers exécutables dans le répertoire / bin. Puisque la liste contiendra les résultats de nombreux fichiers, nous utiliserons l’option -f (nom de fichier). Cela imprimera le nom de fichier au début de chaque ligne. Nous pouvons alors voir dans quel fichier chaque chaîne a été trouvée.

Nous transmettons les résultats grepet recherchez les chaînes contenant le mot « Copyright ».

strings -f /bin/* | grep Copyright

chaînes -f / bin / * | grep Copyright dans une fenêtre de terminal

Nous obtenons une liste ordonnée des déclarations de copyright pour chaque fichier dans le répertoire / bin, avec le nom du fichier au début de chaque ligne.

sortie de chaînes montrant les déclarations de copyright dans une fenêtre de terminal

chaînes Unraveled

Il n’y a pas de mystère aux cordes; c’est une commande Linux typique. Il fait quelque chose de très spécifique et le fait très bien.

C’est un autre rouage de Linux, et prend vraiment vie lorsqu’il fonctionne avec d’autres commandes. Quand vous voyez comment il peut se situer entre les fichiers binaires et d’autres outils comme grep, vous commencez à apprécier la fonctionnalité de cette commande légèrement obscure.