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.
Table des matières
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.
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
Les chaînes sont extraites du fichier et répertoriées dans la fenêtre du 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
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.
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
La liste est maintenant présentée pour nous en moins, avec le haut de la liste affiché en premier.
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
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.
Le défilement de la sortie révèle que ce formatage n’est pas utilisé dans tout le fichier.
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
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
Le décalage est donné en Octal.
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
Les décalages sont maintenant imprimés en décimal.
strings -t x parse_phrases | less
Les décalages sont maintenant imprimés en hexadécimal.
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
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.
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
La liste n’est pas le contenu entier de votre RAM. Ce ne sont que les chaînes qui peuvent en être extraites.
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
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.
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.