Vous souhaitez explorer le contenu textuel caché dans un fichier binaire ou de données? La commande `strings` de Linux est votre alliée, elle extrait ces portions de texte, appelées « chaînes », pour les rendre accessibles.
L’écosystème Linux regorge de commandes dont l’utilité peut parfois sembler obscure. `strings` fait partie de celles-ci. Quel est précisément son rôle? Pourquoi vouloir extraire les chaînes de caractères imprimables d’un fichier binaire?
Prenons un peu de recul. Les fichiers binaires, comme les exécutables, peuvent contenir des séquences de texte lisibles par un humain. Comment les révéler? Utiliser `cat` ou `less` pourrait mener à un blocage du terminal. Les utilitaires conçus pour des fichiers texte ne gèrent pas correctement les caractères non imprimables.
En effet, la plupart des octets d’un fichier binaire ne sont pas lisibles et ne peuvent être affichés de manière compréhensible dans un terminal. Il n’existe pas de symboles standard pour représenter les valeurs binaires qui ne correspondent pas aux caractères alphanumériques, à la ponctuation ou aux espaces. L’ensemble de ces derniers est qualifié de caractères « imprimables », les autres étant « non imprimables ».
Tenter d’afficher ou de rechercher du texte dans un fichier binaire représente donc un défi. C’est là que `strings` intervient. Elle extrait les chaînes de caractères imprimables d’un fichier, permettant à d’autres outils de les manipuler sans être perturbés par des caractères non imprimables.
Mise en Œuvre de la Commande `strings`
La commande `strings` est simple et son usage basique est intuitif. Il suffit de spécifier le nom du fichier cible en argument sur la ligne de commande.
Par exemple, pour extraire les chaînes d’un exécutable nommé « jibber », il faut taper `strings jibber`, puis valider avec la touche Entrée.
strings jibber
Les chaînes sont alors extraites du fichier et affichées dans le terminal.
Ajuster la Longueur Minimale des Chaînes
Par défaut, `strings` identifie les chaînes d’au moins quatre caractères. Pour ajuster cette longueur, on utilise l’option `-n`, suivie de la longueur souhaitée.
Il est important de noter que plus la longueur minimale est courte, plus le risque d’obtenir des résultats indésirables augmente.
En effet, certaines valeurs binaires peuvent correspondre numériquement à des caractères imprimables. Si deux de ces valeurs sont consécutives et que la longueur minimale est fixée à deux, `strings` les identifiera comme une chaîne.
Pour spécifier une longueur minimale de deux, on utilise la commande :
strings -n 2 jibber
Les résultats incluent désormais des chaînes de deux caractères, les espaces étant considérés comme des caractères imprimables.
Utiliser `strings` avec `less` pour la Pagination
En raison de la potentielle abondance des résultats, il est conseillé de rediriger la sortie de `strings` vers `less`, pour faciliter la navigation. On peut ainsi parcourir les chaînes à la recherche de données spécifiques.
strings jibber | less
La liste est maintenant affichée via `less`, avec les premières chaînes visibles en haut.
Analyse de Fichiers Objets
Habituellement, les fichiers de code source sont compilés en fichiers objets, qui sont ensuite liés à des bibliothèques pour former un exécutable. En examinant un fichier objet, tel que « jibber.o », on peut observer des différences intéressantes. L’extension « .o » identifie ce type de fichier.
jibber.o | less
Les premières chaînes sont formatées, celles de plus de huit caractères étant encapsulées dans la huitième colonne, avec un « H » dans la neuvième colonne. On peut reconnaître des instructions SQL.
En parcourant la sortie, on constate que ce formatage n’est pas constant sur l’ensemble du fichier.
Comparer les chaînes des fichiers objets et des exécutables finaux peut être instructif.
Cibler des Sections Spécifiques
Les fichiers compilés sont structurés en zones distinctes. Par défaut, `strings` explore l’ensemble du fichier, équivalent à l’option `-a` (all). Pour restreindre la recherche aux sections de données initialisées et chargées, on utilise l’option `-d` (data).
strings -d jibber | less
Sauf indication contraire, il est généralement préférable d’utiliser le comportement par défaut et d’analyser l’intégralité du fichier.
Afficher le Décalage des Chaînes
On peut demander à `strings` d’afficher le décalage de chaque chaîne par rapport au début du fichier. L’option `-o` (offset) permet cela.
strings -o parse_phrases | less
Le décalage est exprimé en octal.
Pour afficher le décalage dans une autre base numérique, comme le décimal ou l’hexadécimal, on utilise l’option `-t` (base). L’option base doit être suivie de d (décimal), X (hexadécimal) ou o (octal). L’utilisation de `-to` est identique à `-o`.
strings -t d parse_phrases | less
Les décalages sont désormais affichés en décimal.
strings -t x parse_phrases | less
Les décalages sont affichés en hexadécimal.
Inclure les Espaces
Par défaut, `strings` considère les tabulations et les espaces comme partie intégrante des chaînes. Les autres caractères d’espacement, comme les sauts de ligne, ne le sont pas. L’option `-w` (whitespace) permet à `strings` de traiter tous les caractères d’espacement comme appartenant aux chaînes.
strings -w add_data | less
On observe la ligne vide dans la sortie, qui résulte des caractères invisibles de saut de ligne à la fin de la seconde ligne.
Au-Delà des Fichiers
La commande `strings` peut être utilisée avec toute source de données produisant un flux d’octets.
On peut par exemple examiner la mémoire vive (RAM) de l’ordinateur.
L’accès à `/dev/mem` requiert les privilèges administrateur (`sudo`), car ce fichier est une image de la mémoire principale de l’ordinateur.
sudo strings /dev/mem | less
La liste affichée ne représente pas l’intégralité du contenu de la RAM, mais seulement les chaînes de caractères qui peuvent en être extraites.
Traitement de Plusieurs Fichiers
On peut utiliser des caractères génériques pour sélectionner des groupes de fichiers. L’astérisque `*` représente une série de caractères, et le point d’interrogation `?` un unique caractère. On peut aussi lister les noms de fichiers directement sur la ligne de commande.
Pour analyser tous les exécutables du répertoire `/bin`, on utilise un caractère générique. Étant donné la quantité de données résultante, on utilisera l’option `-f` (filename) pour afficher le nom du fichier en début de chaque ligne. Cela permet de savoir d’où provient chaque chaîne.
On redirige la sortie vers grep pour identifier les chaînes contenant le mot « Copyright ».
strings -f /bin/* | grep Copyright
On obtient une liste des déclarations de copyright de chaque fichier de `/bin`, avec le nom du fichier en début de ligne.
`strings` : Une Commande Éclaircie
La commande `strings` est sans mystère, elle est une commande Linux typique : elle effectue une action précise avec efficacité.
Elle est un rouage de l’écosystème Linux qui prend tout son sens lorsqu’elle interagit avec d’autres commandes. Comprendre comment elle peut se positionner entre des fichiers binaires et des outils comme `grep` permet d’apprécier son rôle, bien que parfois méconnu.