Comment visualiser un fichier binaire?

45

D'après ce que j'ai compris, un compilateur crée un fichier binaire composé de 1 et de 0 qu'un processeur peut lire. J'ai un fichier binaire mais comment puis-je l'ouvrir pour voir les 1 et les 0 qu'il y a? Un éditeur de texte dit qu'il ne peut pas l'ouvrir ...

Post-scriptum J'ai un assemblage binaire compilé qui devrait être code binaire simple de 1 et 0?

Martin Zeltin
la source
1
lorsque vous affichez un fichier binaire, vous le verrez sous forme de caractères ascii
mardi
2
duplicate issue stackoverflow.com/questions/1765311/…
mardi
non - OP spécifié "binaire compilé par l'assemblage". Cela ne répond pas à la question. Par exemple, ce n'est pas un fichier de musique et il a une structure. Sans PO fournissant des informations supplémentaires, un outil non structuré est le point de départ.
Thomas Dickey
1
Voir ma réponse. Et soyez averti que le terme binaire est utilisé de deux manières totalement différentes dans la pratique: "Un fichier binaire" signifie un fichier dont le contexte n'est pas du texte ASCII pur. "Un nombre binaire" signifie un nombre écrit en utilisant sa forme binaire.
Pierre-Olivier Vares
@mazs ASCII? Je pense que UTF-8 est plus probable, ou une page de code si le programme pense qu'il semble être codé de cette façon par le biais de l'ouragan.
JDługosz

Réponses:

99

Selon cette réponse de tyranide :

hexdump -C yourfile.bin 

à moins que vous ne souhaitiez le modifier, bien sûr. La plupart des distributions Linux ont hexdumppar défaut (mais évidemment pas toutes).


Mise à jour

Selon cette réponse d' Emilio Bool :

xxd fait à la fois binaire et hexadécimal

Pour bin:

xxd -b file

Pour hex:

xxd file
Rahul
la source
Cela a vraiment aidé! Merci
Shravya Boggarapu
pour ne voir que head: xxd nom du fichier | head
Adam
45

Plusieurs personnes ont répondu à certains aspects de la requête, mais pas à toutes.

Tous les fichiers sur les ordinateurs sont stockés en tant que 1 et 0. Images, fichiers texte, musique, applications exécutables, fichiers objets, etc.

Ils sont tous des 0 et des 1. La seule différence est qu'ils sont interprétés différemment selon ce qui les ouvre.

Lorsque vous affichez un fichier texte en utilisant cat, l'exécutable ( catdans ce cas) lit tous les 1 et les 0 et vous les présente en les convertissant en caractères de votre alphabet ou de votre langue.

Lorsque vous affichez un fichier à l'aide d'une visionneuse d'images, il prend tous les 1 et les 0 et les transforme en image, en fonction du format du fichier et de la logique à utiliser pour résoudre le problème.

Les fichiers binaires compilés ne sont pas différents, ils sont stockés en tant que 1 et 0.

La réponse de arzyfex vous donne les outils pour afficher ces fichiers de différentes manières, mais lire un fichier en tant que fichier binaire fonctionne pour n'importe quel fichier sur un ordinateur, tout comme le visualiser sous forme octale, hexadécimale ou même ASCII, il se peut que cela n'ait aucun sens de ces formats.

Si vous voulez comprendre ce que fait un fichier binaire exécutable, vous devez le voir de manière à vous montrer le langage d'assembleur (au début), ce que vous pouvez faire avec,

objdump -d /path/to/binary

qui est un désassembleur, il prend le contenu binaire et le reconvertit en assembleur (qui est un langage de programmation de très bas niveau). objdumpn’est pas toujours installé par défaut, il peut donc être nécessaire de l’installer en fonction de votre environnement Linux.

Quelques lectures externes.

NB: comme le fait remarquer @Wildcard, il est important de noter que les fichiers ne contiennent pas les caractères 1 et 0 (comme vous les voyez à l'écran), ils contiennent des données numériques réelles, des bits d'information individuels qui sont soit sur (1) ou off (0). Même cette description n'est qu'une approximation de la vérité. Le point clé est que si vous trouvez un visualiseur qui vous montre les 1 et les 0, même s'il interprète toujours les données du fichier et vous montre ensuite les caractères ASCII pour 0 et 1. Les données sont stockées dans un format binaire ( voir le lien Numéro binaire ci-dessus). Le wiki de la communauté de Pierre-Olivier couvre cette question plus en détail.

EightBitTony
la source
Bon exposé. Vous voudrez peut-être ajouter que les caractères que vous voyez dans une ligne de texte sous la forme "1" ou "0" ne sont pas stockés sous forme de "1" ou de "0" par l'ordinateur; le PO semble avoir une confusion à ce sujet.
Wildcard
1
Je voudrais chicaner (c’est-à-dire ne pas être d’accord) avec votre affirmation: "Lorsque vous affichez un fichier texte avec cat, l’exécutable ( catdans ce cas) lit tous les 1 et les 0 et vous les présente en les convertissant en caractères de votre alphabet approprié. la langue." catne fait pas ça; tout catce que vous faites est d'écrire des octets sur la sortie standard (à moins que vous n'utilisiez les options "nuisibles" ). Le programme du terminal (et / ou le matériel du terminal, le cas échéant, c'est-à-dire son microprogramme) détermine comment restituer les octets sous forme de caractères, éventuellement avec l'assistance du pilote TTY.
G-Man dit 'Réintégrez Monica'
Je ne suis pas en désaccord avec vous, mais à un moment donné, toutes les descriptions simples s'effondrent, la question est de savoir jusqu'où vous allez dans le terrier des lapins avant d'arrêter de décrire les choses simplement.
EightBitTony
14

Au niveau bas, un fichier est codé sous forme d'une séquence de 0 et de 1.

Mais même les programmeurs y vont rarement en pratique.

Premièrement (et plus important que cette histoire de 0 et de 1), vous devez comprendre que tout ce que l'ordinateur manipule est codé avec des nombres .

  • Un caractère est codé avec un nombre, à l'aide de tables de jeux de caractères. Par exemple, la lettre "A" a une valeur de 65 lorsqu'elle est codée en ASCII. Voir http://www.asciitable.com

  • Un pixel est codé avec un ou plusieurs chiffres (il existe de nombreux formats graphiques). Par exemple, dans le format standard à 3 couleurs, un pixel jaune est codé comme suit: 255 pour le rouge, 255 pour le vert, 0 pour le bleu. Voir http://www.quackit.com/css/css_color_codes.cfm (choisissez une couleur et voyez les cellules R, G et B)

  • Un fichier exécutable binaire est écrit dans Assembly; chaque instruction d'assemblage est codée sous forme de chiffres. Par exemple, l'instruction d'assemblage MOVB $0x61,%alest codée par deux nombres: 176,97 Voir http://www.sparksandflames.com/files/x86InstructionChart.html (Chaque instruction a un numéro associé de 00 à FF, car la notation hexadécimale est utilisée, voir ci-dessous)

Deuxièmement, chaque numéro peut avoir plusieurs représentations ou notations .

Dis que j'ai 23 pommes.

  • Si je fais des groupes de dix pommes, j'aurai: deux groupes de dix et trois pommes seules. C'est exactement ce que nous entendons par 23: un 2 (dizaines), puis un 3 (unités).
  • Mais je peux aussi faire des groupes de 16 pommes. Je vais donc avoir un groupe de 16 et 7 pommes isolées. En notation hexadécimale (c'est ainsi qu'on appelle la base 16), j'écrirai: 17 (16 + 7). Pour distinguer la notation décimale, la notation hexadécimale est généralement notée avec un préfixe ou un suffixe: 17h, # 17 ou $ 17. Mais comment représenter plus de 9 groupes de 16, ou plus de 9 pommes seules? Nous utilisons simplement les lettres de A (10) à F (15). Le nombre 31 (comme dans 31 pommes) est écrit comme # 1F en hexadécimal.

  • Sur la même ligne, nous pouvons faire un groupe de deux pommes. (Et groupe de deux pommes de groupe de deux, c'est-à-dire groupe de 2x2 pommes, etc.). Alors 23 est: 1 groupe de 2x2x2x2 pommes, 0 groupe de 2x2x2 pommes, 1 groupe de 2x2 pommes, 1 groupe de 2 pommes et 1 pomme solitaire qui sera noté 10111 en binaire.

(Voir https://en.wikipedia.org/wiki/Radix )

Physiquement, les mécanismes permettant deux états (commutateurs) sont faciles à faire, aussi bien sur disque que dans la mémoire.

C'est pourquoi les données et les programmes, vus sous forme de nombres, sont écrits et manipulés sous leur forme binaire.

Puis traduits - en fonction du type de données - dans leur forme appropriée (lettre A, pixel jaune) ou exécutés (instruction MOV).

hexdumpliste les nombres codant les données (ou le programme d'assemblage) dans sa forme hexadécimale. Vous pouvez ensuite utiliser une calculatrice pour obtenir la forme binaire correspondante.

Pierre-Olivier Vares
la source
10

Je commencerais par od(octal dump) et, en fonction du système, des outils tels que objdumputiles.

Thomas Dickey
la source
L'option POSIX.
Ciro Santilli a annoncé
4

Vous pouvez l'ouvrir dans un éditeur hexadécimal qui le présente sous la forme d'une série de valeurs hexadécimales. xxd file

Qu'est-ce que vous essayez d'accomplir?

theblazehen
la source
Mais je pensais que l'ordinateur ne pouvait lire que les 1 et les 0. Puis-je les voir? J'essaie de comprendre le fonctionnement des ordinateurs
Martin Zeltin
2
Cela seul ne vous aidera pas beaucoup. Si vous voulez savoir comment cela fonctionne, jetez un coup d'œil sur le format de fichier ELF sur Linux, puis sur fr.wikipedia.org/wiki/X86_instruction_listings . Si vous voulez juste voir le code généré par le compilateur, jetez-y un œil pour l'exécuter avec gdb. Puisque vous voulez obtenir plus de "bas niveau", consultez également nand2tetris.org. Pour le langage d'assemblage, j'entends dire que l'assemblage 6502 et mips est beaucoup plus agréable que l'assemblage x86_64 / x86
theblazehen
@theblazehen Modern assembleur de la famille x86 est une bête. 8086 était gérable, et je pense que presque tous les processeurs de cette époque (fin des années 1970 et première moitié des années 80) devraient être tolérables en ce qui concerne l'assembleur.
un CVn
4

bviest un éditeur binaire virtuel avec des liaisons de clé vim. Il est disponible sur la plupart des systèmes Linux.

entrez la description de l'image ici

Gilles Castel
la source
3

La commande Linux strings imprime les chaînes de caractères imprimables dans des fichiers, par exemple:

$ strings /usr/bin/gnome-open 
/lib64/ld-linux-x86-64.so.2
3;o:)
libgnome-2.so.0
_ITM_deregisterTMCloneTable
g_object_unref
gmon_start__
g_dgettext
_Jv_RegisterClasses
g_strdup
_ITM_registerTMCloneTable
g_error_free
gnome_program_init
libgnome_module_info_get
libgio-2.0.so.0
g_ascii_strncasecmp

etc ... c'est plutôt plus lisible que binaire.

Ponsfrilus
la source
Le PO a demandé comment puis-je l'ouvrir pour voir les 1 et les 0 qu'il y a? mais la stringscommande supprimera la plupart des octets qu'il veut voir.
Juillet
@jlliagre - tant que vous avez raison, la stringscommande - en particulier avec une longueur plus longue strings -n 6- aide vraiment à déterminer le contenu d'un fichier binaire s'il contient des constantes de chaîne, etc. Cette réponse aurait dû être un commentaire. ont été bien.
Joe
@ Joe Oui, je ne remets pas en question l' stringsutilité de la commande, mais le fait qu'elle ne réponde pas à la question sur l'OP ici.
Juillet
3

Une partie importante à propos de laquelle vous semblez encore confus: les valeurs hexadécimales ne sont qu'une représentation différente des valeurs binaires. La plupart des éditeurs hexadécimaux ou des vidages hexadécimaux affichent les valeurs dans la base hexadécimale, car elles sont plus lisibles que dans la base binaire.

Par exemple:

Binaire:

xxd -b README.md                                                                
00000000: 00100011 00100000

Ce qui est 35 et 32 ​​en décimal

xxd README.md                                                                   
00000000: 2320

Aussi 35 et 32 ​​en décimal

Jeudi prochain
la source
D'autres personnes ont mentionné cela. Cependant, c'est un bon résumé. Vous pouvez modifier votre réponse si vous souhaitez modifier le premier paragraphe.
wizzwizz4
Très bien, je n'ai vu personne en parler, je l'aurais peut-être manqué.
Jeudi prochain
Notez que vous devez être viminstallé pour utiliser xxd.
starbeamrainbowlabs
2

Vous pouvez visualiser le fichier en binaire dans vim, par:

  • Ouvrir le fichier dans vim
  • Entrer :% !xxd -b

La xxdcommande peut être modifiée davantage, par exemple:

  • En ajoutant -g4, qui regroupera les bits dans des packs 32 bits
  • En ajoutant -c4, ce qui formatera la sortie, avoir 4 octets par ligne

L'ajout des deux indicateurs ci-dessus vous donnera un entier de 32 bits par ligne.

Leandros
la source
1

Vous pouvez le faire avec, par exemple, ce ruby ​​one-liner:

$ ruby -e 'while c=STDIN.read(1); printf "%08b" % c.bytes.first; end'

Les systèmes traditionnels basés sur le C supportent mal la sortie de données en binaire, autant que je sache. Ce n'est généralement pas très utile car il est assez difficile à lire, contrairement aux dumps hexadécimaux.

PSkocik
la source
Merci! L'ajout d'un espace directement après %08bprovoque le regroupement de la sortie en octets.
starbeamrainbowlabs
0

GHex est votre ami :)
Vous pouvez l'installer en ligne de commande

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo yum installer ghex

fou
la source