bvi, l'éditeur binaire/hexadécimal plein écran
Description
bvi est un éditeur capable de traiter des fichiers quelconques : textes ou binaires (exécutables, fichiers objets, disques...). Il a été créé par Gerhard Bürgmann en 1996 pour pallier le manque d’outil de ce type sur UNIX et Linux.
Il est très similaire à vi dans son mode de fonctionnement et dans ses commandes, mais permet la saisie en hexadécimal ou en binaire, ce qui est particulièrement utile lorsqu’il faut corriger (patcher) des fichiers objets, des bibliothèques d’objets, des exécutables ou des fichiers non manipulables par des éditeurs de textes.
Son affichage a l’apparence suivante :
Il permet la modification, mais aussi l’ajout et la suppression de caractères quelconques.
L’ajout ou la suppression d’octets entraînent une modification de la taille du fichier, ce qui n’est généralement pas désiré lorsqu’on manipule des fichiers binaires. C’est la raison pour laquelle la modification de taille est désactivée par défaut. Si l’on souhaite modifier la taille du fichier que l’on édite, il faut le spécifier explicitement.
bvi est diffusé sous licence GPL (GNU Public License), et est disponible dans les principales distributions Linux. Il est également possible de le télécharger à...
Points communs avec vi
bvi possède de nombreux points communs avec vi puisque c’est ce dernier qui a inspiré bvi à Gerhard Bürgmann. De façon non exhaustive, on notera entre les deux éditeurs les similitudes suivantes :
-
existence du mode commandes et du mode saisie,
-
mêmes commandes de déplacement de curseur (h, j, k, l, flèches...),
-
mêmes commandes d’ajout, insertion, remplacement et suppression de caractères (a, i, r, R, x, X),
-
même commande undo (u) limitée à la dernière action effectuée,
-
mêmes commandes de positionnement sur des caractères spécifiés (f, F, t, T, ;, ,) et possibilité d’utiliser un facteur de répétition devant ces commandes,
-
mêmes commandes de recherche de chaînes (/, ?),
-
marquage des emplacements avec mx, et positionnement avec ’x,
-
présence d’un mode de configuration accessible avec le caractère :,
-
accès à un éditeur ligne,
-
etc.
Spécificités de bvi
bvi comporte des différences avec vi. Tout d’abord, il affiche trois groupes d’informations :
1. |
La colonne de gauche affiche les adresses hexadécimales des octets relativement au début du fichier. |
2. |
La colonne centrale affiche les valeurs hexadécimales des octets du fichier. |
3. |
La colonne de droite affiche la représentation ASCII (quand elle existe) des octets du fichier. |
La ligne en bas de l’écran affiche des informations d’état, comme le nom du fichier et son mode d’ouverture sur la gauche, et sur la droite les valeurs binaire, octale, hexadécimale, décimale et caractère de l’octet sur lequel le curseur est positionné.
Ensuite, contrairement à vi, bvine connaît pas le concept de ligne : il ne traite que des suites de caractères sans signification particulière pour lui. Par exemple, pour se positionner en début de fichier, il faudra utiliser 0G (aller au caractère numéro 0) et non 1G (aller à la ligne numéro 1, dans vi).
Cette différence est très importante et doit être bien...
Rappel de quelques commandes
1. Avertissement
Nous ne détaillerons dans les sections qui suivent que quelques commandes de base permettant des manipulations simples avec bvi.
Pour connaître l’intégralité des commandes disponibles, veuillez vous reporter à la documentation de l’auteur :
-
page de manuel de bvi, disponible dans les distributions Linux et les paquets d’installation,
-
site web d’hébergement du produit : http://bvi.sourceforge.net/overview.html
2. Positionnement en début de ligne
La ligne dont il s’agit ici n’est pas une ligne du fichier (ce qui peut n’avoir aucun sens si le fichier édité n’est pas un fichier texte) mais une des lignes de valeurs affichées par bvi.
3. Positionnement en fin de ligne
Comme dans la section précédente, il s’agit de positionnement relatif à une ligne affichée par bvi, et non à une ligne du fichier.
Les expressions régulières
1. Généralités
Les expressions régulières basiques sont utilisables sous bvi, pour des recherches de caractères ou des recherches de valeurs hexadécimales.
2. Recherche en début de ligne
Contrairement aux éditeurs classiques (ed, sed, vi, vim, ...), le concept de ligne n’existe pas dans bvi, et il est impossible d’utiliser le caractère ^ (qui désigne généralement le début d’une ligne) pour spécifier qu’une expression se trouve en début de ligne. L’équivalent approximatif à cette recherche avec bvi serait de spécifier que la chaîne recherchée se trouve derrière un caractère matérialisant les fins de lignes en ASCII, soit le caractère \n ou 0A en valeur hexadécimale.
Syntaxe
/\nchaîne_ASCII
ou
\0Achaîne_hexa
3. Recherche en fin de ligne
Pour les raisons citées dans la section précédente, il est impossible d’utiliser le caractère $ qui désigne généralement la fin d’une ligne. L’équivalent à cette recherche avec bvi serait de spécifier que la chaîne recherchée se trouve devant un caractère matérialisant les fins de lignes en ASCII, soit le caractère \nou 0A en valeur...
Commande bmore
On notera également l’existence, dans le paquet logiciel de la commande bvi, de la commande bmore. Également conçue par Gerhard Bürgmann, elle permet la visualisation, page par page, des valeurs hexadécimales des octets d’un fichier ou des données lues sur l’entrée standard. Elle semble, a priori, avoir la même fonction que la commande Linux suivante :
xxd | more
mais présente en fait le grand intérêt de pouvoir effectuer une recherche d’une chaîne exprimée directement en valeurs hexadécimales, et non en caractères ASCII comme dans more (ou less). La différence réside dans le fait que le flux de données dans lequel on peut rechercher des chaînes avec la commande more est un flux ASCII, et que les valeurs hexadécimales d’octets consécutifs dans le flux d’entrée peuvent être séparées dans le flux ASCII par des espaces, des représentations ASCII de caractères proches, des sauts de lignes ou des offsets hexadécimaux. La localisation de chaînes exprimées sous forme hexadécimale ne peut donc pas être garantie avec ces commandes.
Au contraire, la recherche avec la commande bmore est une recherche native dans le flux de données. Elle n’est donc pas parasitée par les caractères utilisés...
Exercices
1. Exercice 1
Comment rechercher en hexadécimal les chaînes correspondant à l’expression régulière AB*C ?
Solution 1
\4142*43\
Les codes hexadécimaux des caractères A, B et C sont respectivement 41, 42 et 43. La recherche de la chaîne suivante est déclenchée par le caractère n. La recherche en sens inverse est déclenchée par le caractère N.
Solution 2
\41 42* 43\
Les valeurs hexadécimales des octets peuvent être séparées par un (ou plusieurs) espace(s).
On peut également utiliser une recherche mixte comme \"A" 42* "C"\ ou \"A" 42* 43\, mais la syntaxe \41 "B"* 43\ ne fonctionne pas, tout du moins dans la version 1.3.2-2 utilisée.
2. Exercice 2
Dans le fichier suivant :
Ligne 1 : abc1
Ligne 2 : abc2
Ligne 3 : abc3
Ligne 4 : abc4
Ligne 5 : abc5
Ligne 6 : abc6
Ligne 7 : abc7
Ligne 8 : abc8
Ligne 9 : abc9
rechercher les lignes contenant la chaîne Ligne, suivie d’un espace, suivie d’un chiffre strictement supérieur à 5, avec la contrainte que seule la chaîne Ligne pourra être spécifiée en ASCII : les autres caractères devront être exprimés en hexadécimal.
Solutions
\"Ligne" 20 [^31 32 33 34 35]\
\"Ligne" 20 [36 37 38 39]\
Ces commandes peuvent être écrites plus simplement de la façon suivante, en utilisantles plages de caractères :
\"Ligne" 20 [^31-35]\
\"Ligne" 20 [36-39]\
3. Exercice 3
Rechercher dans le fichier précédent le caractère 8 en fin de ligne.
Solution 1
\38 0A\
Le caractère hexadécimal 0A est le caractère saut de ligne, ou encore \n, ou encore newline. Rechercher le caractère 38H suivi du caractère 0AH revient donc à rechercher le caractère 8 en fin de ligne.
Solution 2
\"8" 0A\
Les caractères ASCII peuvent être passés entre doubles quotes dans une recherche en hexadécimal.
4. Exercice 4
Dans le fichier de l’exercice 2, dont le contenu apparaît sous bvi de la façon suivante :
00000000 4C 69 67 6E 65 20 31 20 3A 20 61 62 63 31 0A 4C Ligne 1 : abc1.L
00000010 69...