D'après ce que je comprends, 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 qui s'y trouvent? Un éditeur de texte dit qu'il ne peut pas l'ouvrir ...
P.S. J'ai un assemblage binaire compilé qui devrait être un code binaire simple de 1 et 0?
Selon cette réponse par tyranide :
hexdump -C yourfile.bin
sauf si vous souhaitez le modifier bien sûr. La plupart des distributions Linux ont
hexdump
par défaut (mais évidemment pas toutes).
Selon cette réponse par Emilio Bool :
xxd
fait à la fois binaire et hexadécimalPour bin:
xxd -b file
Pour hex:
xxd file
Plusieurs personnes ont répondu à certains aspects de la requête, mais pas à tous.
Tous les fichiers sur les ordinateurs sont stockés sous forme de 1 et de 0. Images, fichiers texte, musique, applications exécutables, fichiers objets, etc.
Ce 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 à l'aide de cat
, l'exécutable (cat
dans ce cas) lit tous les 1 et 0 et vous les présente en les convertissant en caractères à partir 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 0 et les transforme en image, selon le format du fichier et une logique pour tout résoudre.
Les fichiers binaires compilés ne sont pas différents, ils sont stockés sous forme de 1 et de 0.
la réponse de arzyfex vous donne les outils pour afficher ces fichiers de différentes manières, mais la lecture d'un fichier en tant que binaire fonctionne pour n'importe quel fichier sur un ordinateur, comme le fait de le visualiser en octal, ou hex, ou en fait ASCII, cela pourrait ne pas avoir de sens dans chaque de ces formats.
Si vous voulez comprendre ce que fait un fichier binaire exécutable, vous devez le visualiser d'une manière qui vous montre le langage assembleur (comme début), ce que vous pouvez faire en utilisant,
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). objdump
n'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 souligne @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 activés (1) soit désactivés (0). Même cette description n'est qu'une approximation de la vérité. Leur point clé est que si vous trouvez une visionneuse qui vous montre les 1 et les 0, même cela 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). Entrée wiki communautaire de Pierre-Olivier couvre cela plus en détail.
À un niveau bas, un fichier est encodé comme une séquence de 0 et de 1.
Mais même les programmeurs y vont rarement en pratique.
Tout d'abord (et plus important que cette histoire de 0 et de 1), vous devez comprendre que tout ce que l'ordinateur manipule est encodé avec 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 nombres (il existe de nombreux formats graphiques) Par exemple, au format 3 couleurs standard, 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 & B)
Un fichier exécutable binaire est écrit dans Assembly; chaque instruction d'assemblage est codée sous forme de nombres. Par exemple, l'instruction Assembly MOVB $0x61,%al
est codé 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é, voir ci-dessous)
Deuxièmement : chaque nombre peut avoir plusieurs représentations ou notations .
Disons que j'ai 23 pommes.
Mais je peux aussi faire des groupes de 16 pommes. Je vais donc obtenir un groupe de 16 et 7 pommes seules. En notation hexadécimale (c'est ainsi qu'on appelle le 16 radix), j'écrirai: 17 (16 + 7). Pour se distinguer de 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? Simplement, nous utilisons des 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 groupes de deux pommes, c'est-à-dire groupe de pommes 2x2, etc.). Alors 23 est: 1 groupe de pommes 2x2x2x2, 0 groupe de pommes 2x2x2, 1 groupe de pommes 2x2, 1 groupe de 2 pommes et 1 seule Apple 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 qu'en mémoire.
C'est pourquoi les données et les programmes, considérés comme des nombres, sont écrits et manipulés sous leur forme binaire.
Puis traduit - selon le type de données - dans leur forme appropriée (lettre A, pixel jaune) ou exécuté (instruction MOV).
hexdump
répertorie les nombres codant les données (ou le programme d'assemblage) sous sa forme hexadécimale. Vous pouvez ensuite utiliser une calculatrice pour obtenir la forme binaire correspondante.
Je commencerais par od
(vidage octal) , et selon le système, peut trouver des outils tels que objdump
utiles.
La commande Linux strings imprime les chaînes de caractères imprimables dans les 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 plus lisible que binaire.
Vous pouvez l'ouvrir dans un éditeur hexadécimal qui l'affiche sous la forme d'une série de valeurs hexadécimales. xxd file
Qu'est-ce que vous essayez d'accomplir?
Une partie importante sur 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 hexdumps afficheront des valeurs dans la base hexadécimale, car ils sont plus lisibles que dans la base binaire.
Par exemple.:
Binaire:
xxd -b README.md
00000000: 00100011 00100000
Qui est 35 et 32 en décimal
xxd README.md
00000000: 2320
Aussi 35 et 32 en décimal
Vous pouvez visualiser le fichier en binaire dans vim
, par:
vim
:% !xxd -b
La commande xxd
peut être modifiée davantage, par exemple:
-g4
, qui regroupera les bits dans des packs 32 bits-c4
, qui formatera la sortie, pour avoir 4 octets par ligneL'ajout des deux indicateurs ci-dessus vous donnera un entier 32 bits par ligne.
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 basés sur C traditionnels ont un support moche pour sortir des trucs en binaire, AFAIK. Ce n'est généralement pas très utile car il est assez difficile à lire contrairement aux vidages hexadécimaux.
GHex est votre ami :)
Vous pouvez l'installer en utilisant la ligne de commande
Ubuntu:
Sudo apt-get install ghex
Fedora:
Sudo yum install ghex