Come visualizzare un file binario?


45

Da quanto ho capito, un compilatore crea un file binario composto da 1 e 0 che una CPU può leggere. Ho un file binario ma come posso aprirlo per vedere gli 1 e gli 0 presenti? Un editor di testo dice che non può aprirlo ...

PS Ho un binario compilato di assembly che dovrebbe essere un semplice codice binario di 1 e 0?


1
quando visualizzi un file binario, lo vedrai come caratteri ascii
mazs


no - OP specificato "assembly compilated binary". Questo non affronta la domanda. Ad esempio, non è un file musicale e ha una struttura. Senza OP che fornisce ulteriori informazioni, uno strumento non strutturato è il punto di partenza.
Thomas Dickey,

1
Vedi la mia risposta E tieni presente che il termine binario viene utilizzato in due modi totalmente diversi nella pratica: "Un file binario" indica un file il cui contesto non è puro testo ASCII. "Un numero binario" indica un numero scritto usando la sua forma binaria.
Pierre-Olivier Vares,

@mazs ASCII? Penso che UTF-8 sia più probabile, o qualche codepage se il programma pensa che sembra essere codificato in questo modo attraverso l'uristica.
JDługosz,

Risposte:


99

Secondo questa risposta del tiranide :

hexdump -C yourfile.bin 

a meno che tu non voglia modificarlo ovviamente. La maggior parte delle distro Linux ha hexdumpdi default (ma ovviamente non tutte).


Aggiornare

Secondo questa risposta di Emilio Bool :

xxd fa sia binario che esadecimale

Per il cestino:

xxd -b file

Per esadecimale:

xxd file

Questo mi ha davvero aiutato! Grazie
Shravya Boggarapu il

per vedere solo head: xxd nomefile | head
Adam

45

Varie persone hanno risposto ad alcuni aspetti della query, ma non a tutti.

Tutti i file sui computer sono memorizzati come 1 e 0. Immagini, file di testo, musica, applicazioni eseguibili, file oggetto, ecc.

Sono tutti 0 e 1. L'unica differenza è che vengono interpretati in modo diverso a seconda di ciò che li apre.

Quando visualizzi un file di testo utilizzando cat, l'eseguibile ( catin questo caso) legge tutti gli 1 e gli 0 e te li presenta convertendoli in caratteri dell'alfabeto o della lingua in questione.

Quando visualizzi un file utilizzando un visualizzatore di immagini, sono necessari tutti gli 1 e gli 0 e li trasforma in un'immagine, a seconda del formato del file e della logica per elaborarlo.

I file binari compilati non sono diversi, sono memorizzati come 1 e 0.

La risposta di arzyfex ti dà gli strumenti per visualizzare quei file in diversi modi, ma leggere un file come binario funziona per qualsiasi file su un computer, così come visualizzarlo come ottale, esadecimale, o addirittura ASCII, potrebbe non avere senso in ciascuno di quei formati.

Se vuoi capire cosa fa un file binario eseguibile, devi visualizzarlo in un modo che ti mostri il linguaggio assembler (come inizio), che puoi fare usando,

objdump -d /path/to/binary

che è un disassemblatore, prende il contenuto binario e lo converte in assemblatore (che è un linguaggio di programmazione di livello molto basso). objdumpnon è sempre installato per impostazione predefinita, quindi potrebbe essere necessario installarlo a seconda dell'ambiente Linux.

Qualche lettura esterna.

NB: come sottolinea @Wildcard, è importante notare che i file non contengono i caratteri 1 e 0 (come li vedi sullo schermo), contengono dati numerici reali, singoli bit di informazioni che sono su (1) o spento (0). Anche quella descrizione è solo un'approssimazione della verità. Il loro punto chiave è che se trovi un visualizzatore che ti mostra 1 e 0, anche quello sta ancora interpretando i dati dal file e quindi ti mostra i caratteri ASCII per 0 e 1. I dati sono memorizzati in un formato binario ( vedere il link al numero binario sopra). La voce wiki della community di Pierre-Olivier tratta questo in modo più dettagliato.


Buona esposizione. Potresti voler aggiungere che i caratteri che vedi in una riga di testo come "1" o "0" non sono memorizzati come un singolo "1" o "0" dal computer; l'OP sembra avere una confusione al riguardo.
Carattere jolly

1
Vorrei cavillare (cioè, non sono d'accordo) con la tua affermazione, "Quando visualizzi un file di testo utilizzando cat, l'eseguibile ( catin questo caso) legge tutti gli 1 e gli 0 e li presenta a te convertendoli in caratteri dal tuo alfabeto o linguaggio." catnon lo fa; tutto catfa è byte di scrittura sullo standard output (a meno che non si sta utilizzando i "nocivi" opzioni). Il programma terminale (e / o l'hardware del terminale, se applicabile, ovvero il suo firmware) determina come rendere byte come caratteri, possibilmente con un aiuto dal driver TTY.
G-Man dice "Reinstate Monica"

Non sono in disaccordo, ma a un certo punto, tutte le semplici descrizioni si rompono, la domanda è quanto si scende nella tana del coniglio prima di smettere di descrivere semplicemente le cose.
EightBitTony,

14

A basso livello, un file viene codificato come una sequenza di 0 e 1.

Ma anche i programmatori raramente ci vanno in pratica.

Innanzitutto (e più importante di questa storia di 0 e 1), devi capire che tutto ciò che il computer manipola è codificato con numeri .

  • Un carattere è codificato con un numero, usando le tabelle dei set di caratteri. Ad esempio, la lettera "A" ha un valore di 65 se codificata utilizzando ASCII. Vedi http://www.asciitable.com

  • Un pixel è codificato con uno o più numeri (Esistono molti formati grafici) Ad esempio, nel formato standard a 3 colori, un pixel giallo è codificato come: 255 per il rosso, 255 per il verde, 0 per il blu. Vedi http://www.quackit.com/css/css_color_codes.cfm (scegli un colore e vedi le celle R, G e B)

  • Un file eseguibile binario è scritto in Assembly; ogni istruzione di assemblaggio è codificata come numeri. Ad esempio, l'istruzione assembly MOVB $0x61,%alè codificata da due numeri: 176,97 Vedi http://www.sparksandflames.com/files/x86InstructionChart.html (Ogni istruzione ha un numero associato da 00 a FF, poiché viene utilizzata la notazione esadecimale, vedi sotto)

In secondo luogo : ogni numero può avere più rappresentazioni o notazioni .

Di 'che ho 23 mele.

  • Se creo gruppi di dieci mele, otterrò: 2 gruppi di dieci e 3 mele solitarie. Questo è esattamente ciò che intendiamo quando scriviamo 23: un 2 (decine), quindi un 3 (unità).
  • Ma posso anche fare gruppi di 16 mele. Quindi otterrò un gruppo di 16 persone e 7 mele solitarie. In notazione esadecimale (è così che si chiama il 16 radix), scriverò: 17 (16 + 7). Per distinguere dalla notazione decimale, la notazione esadecimale è generalmente annotata con un prefisso o un suffisso: 17h, # 17 o $ 17. Ma come rappresentare più di 9 gruppi di 16 o più di 9 mele sole? Semplicemente, usiamo le lettere da A (10) a F (15). Il numero 31 (come in 31 mele) è scritto come # 1F in esadecimale.

  • Sulla stessa linea, possiamo fare un gruppo di due mele. (E un gruppo di due gruppi di due mele, cioè un gruppo di 2x2 mele e così via). Quindi 23 è: 1 gruppo di 2x2x2x2-mele, 0 gruppo-di-2x2x2-mele, 1 gruppo-di-2x2-mele, 1 gruppo di 2 mele e 1 mela solitaria che sarà notato 10111 in binario.

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

Fisicamente, i meccanismi che consentono due stati (switch) sono facili da fare, sia sul disco che nella memoria.

Ecco perché dati e programmi, visti come numeri, sono scritti e manipolati nella loro forma binaria.

Quindi tradotto - a seconda del tipo di dati - nella loro forma appropriata (lettera A, pixel giallo) o eseguito (istruzione MOV).

hexdumpelenca i numeri che codificano i dati (o il programma di assemblaggio) nella sua forma esadecimale. È quindi possibile utilizzare una calcolatrice per ottenere il modulo binario corrispondente.



4

Potresti aprirlo in un editor esadecimale che lo mostra come una serie di valori esadecimali. xxd file

Cosa stai cercando di realizzare?


Ma pensavo che il computer potesse leggere solo 1 e 0. Posso vederli? Sto cercando di capire come funzionano i computer
Martin Zeltin,

2
Questo da solo non ti aiuterà molto. Se vuoi sapere come funziona esattamente, su un box Linux dai un'occhiata al formato di file ELF e en.wikipedia.org/wiki/X86_instruction_listings . Se vuoi solo vedere il codice che viene generato dal compilatore dai un'occhiata a eseguirlo con gdb. Dato che vuoi ottenere più "basso livello", controlla anche nand2tetris.org. Per il linguaggio assembly ho sentito che l'assemblaggio 6502 e mips è molto più bello dell'assembly x86_64 / x86
theblazehen

@theblazehen Il moderno assemblatore della famiglia x86 è una bestia. L'8086 era gestibile e penso che qualsiasi CPU di quell'epoca (dalla fine degli anni '70 alla prima metà degli anni '80) dovrebbe essere tollerabile per quanto riguarda l'assemblatore.
un CVn

4

bviè un editor binario VI con combinazioni di tasti vim. È disponibile sulla maggior parte dei sistemi Linux.

inserisci qui la descrizione dell'immagine


3

Il comando stringhe Linux stampa le stringhe di caratteri stampabili in file, ad esempio:

$ 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

ecc ... è molto più leggibile del binario.


L'OP ha chiesto come posso aprirlo per vedere gli 1 e gli 0 presenti? ma il stringscomando rimuoverà la maggior parte dei byte che vuole vedere.
jlliagre,

@jlliagre - benché tu abbia ragione, il stringscomando - specialmente con una lunghezza più lunga come strings -n 6- aiuta davvero a capire cosa contiene un file binario se contiene costanti di stringa, ecc. Questa risposta avrebbe dovuto essere un commento, quindi sarebbe sono andato bene.
Joe,

@Joe Sì, non metto in dubbio l' stringsutilità del comando, solo il fatto che non risponde alla domanda OP qui.
jlliagre,

3

Una parte importante su cui sembri ancora confuso: i valori esadecimali sono solo una diversa rappresentazione dei valori binari. La maggior parte degli editor esadecimali o degli hexdump visualizzerà i valori nella base esadecimale, perché è più leggibile che nella base binaria.

Per esempio:

Binario:

xxd -b README.md                                                                
00000000: 00100011 00100000

Che è 35 e 32 in decimale

xxd README.md                                                                   
00000000: 2320

Anche 35 e 32 in decimale


Altre persone hanno menzionato questo. Tuttavia, questo è un buon riassunto. Puoi modificare la tua risposta se vuoi cambiare il primo paragrafo.
wizzwizz4,

Molto bene, non ho visto nessuno menzionarlo, forse mi sarei perso.
Giovedì prossimo

Si noti che è necessario viminstallare per utilizzare xxd.
starbeamrainbowlabs il

2

È possibile visualizzare il file in formato binario in vim:

  • Apertura del file in vim
  • Entrando :% !xxd -b

Il xxdcomando può essere ulteriormente modificato, ad esempio:

  • Aggiungendo -g4, che raggrupperà i bit in pacchetti a 32 bit
  • Aggiungendo -c4, che formatterà l'output, per avere 4 byte per riga

Aggiungendo entrambi i flag sopra, otterrai un numero intero a 32 bit per riga.


1

Puoi farlo ad esempio con questo rubino one-liner:

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

Il tradizionale sistema basato su C ha un supporto scadente per la produzione di materiale binario, AFAIK. Di solito non è molto utile in quanto è piuttosto difficile da leggere a differenza dei dump esadecimali.


Grazie! L'aggiunta di uno spazio direttamente dopo %08bprovoca il raggruppamento dell'output in byte.
starbeamrainbowlabs il

0

GHex è tuo amico :)
Puoi installarlo usando la riga di comando

Ubuntu:

sudo apt-get install ghex

Fedora:

sudo yum installa ghex

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.