Wie kann ich eine Binärdatei anzeigen?

45

Soweit ich weiß, erstellt ein Compiler eine Binärdatei, die aus Einsen und Nullen besteht und von einer CPU gelesen werden kann. Ich habe eine Binärdatei, aber wie öffne ich sie, um die dort vorhandenen Einsen und Nullen zu sehen? Ein Texteditor sagt, er könne es nicht öffnen ...

PS Ich habe eine Assembly-Binärdatei kompiliert, die einfacher Binärcode aus Einsen und Nullen sein sollte.

Martin Zeltin
quelle
1
Wenn Sie eine Binärdatei angezeigt werden , werden Sie es als ASCII - Zeichen sehen
mazs
no - OP hat "Assembly compiled binary" angegeben. Das spricht die Frage nicht an. Zum Beispiel ist es keine Musikdatei und hat eine Struktur. Ohne zusätzliche Informationen für OP ist ein unstrukturiertes Tool der Ausgangspunkt.
Thomas Dickey
1
Siehe meine Antwort. Und seien Sie gewarnt, dass der Begriff Binär in der Praxis auf zwei völlig unterschiedliche Arten verwendet wird: "Eine Binärdatei" bezeichnet eine Datei, deren Kontext kein reiner ASCII-Text ist. "Eine Binärzahl" bedeutet eine Zahl, die in ihrer Binärform geschrieben wurde.
Pierre-Olivier Vares
@ Mazs ASCII? Ich denke, UTF-8 ist wahrscheinlicher oder eine Codepage, wenn das Programm den Eindruck hat, dass es durch die Huristik auf diese Weise codiert ist.
JDługosz

Antworten:

99

Nach dieser Antwort von Tyraniden :

hexdump -C yourfile.bin 

es sei denn, Sie möchten es natürlich bearbeiten. Die meisten Linux-Distributionen haben hexdumpstandardmäßig (aber offensichtlich nicht alle).


Aktualisieren

Nach dieser Antwort von Emilio Bool :

xxd ist sowohl binär als auch hexadezimal

Für bin:

xxd -b file

Für hex:

xxd file
Rahul
quelle
Das hat wirklich geholfen! Vielen Dank
Shravya Boggarapu
45

Verschiedene Personen haben einige Aspekte der Abfrage beantwortet, jedoch nicht alle.

Alle Dateien auf Computern werden als Einsen und Nullen gespeichert. Bilder, Textdateien, Musik, ausführbare Anwendungen, Objektdateien usw.

Sie sind alle Nullen und Einsen. Der einzige Unterschied besteht darin, dass sie unterschiedlich interpretiert werden, je nachdem, was sie öffnet.

Wenn Sie eine Textdatei mit anzeigen cat, catliest die ausführbare Datei ( in diesem Fall) alle Einsen und Nullen und zeigt sie Ihnen an, indem sie sie in Zeichen aus Ihrem relevanten Alphabet oder Ihrer Sprache konvertiert.

Wenn Sie eine Datei mit einem Bildbetrachter anzeigen, werden alle Einsen und Nullen in ein Bild umgewandelt. Dies hängt vom Format der Datei und einer Logik ab, mit der das Problem gelöst werden kann.

Kompilierte Binärdateien unterscheiden sich nicht, sie werden als Einsen und Nullen gespeichert.

Die Antwort von arzyfex gibt Ihnen die Möglichkeit, diese Dateien auf unterschiedliche Weise anzuzeigen. Das Lesen einer Datei als Binärdatei funktioniert jedoch für jede Datei auf einem Computer, ebenso wie das Anzeigen als Oktal, Hexadezimal oder tatsächlich als ASCII dieser Formate.

Wenn Sie verstehen möchten, was eine ausführbare Binärdatei tut, müssen Sie sie so anzeigen, dass Sie die Assemblersprache (als Start) sehen, die Sie verwenden können.

objdump -d /path/to/binary

Das ist ein Disassembler. Es nimmt den binären Inhalt und konvertiert ihn zurück in Assembler (eine sehr einfache Programmiersprache). objdumpist nicht immer standardmäßig installiert, muss also möglicherweise in Abhängigkeit von Ihrer Linux-Umgebung installiert werden.

Etwas externes Lesen.

NB: Wie @Wildcard betont, ist es wichtig zu beachten, dass die Dateien nicht die Zeichen 1 und 0 enthalten (wie Sie sie auf dem Bildschirm sehen), sondern tatsächliche numerische Daten und einzelne Informationsbits, die entweder auf (1) stehen. oder aus (0). Auch diese Beschreibung ist nur eine Annäherung an die Wahrheit. Der entscheidende Punkt ist, dass wenn Sie einen Viewer finden, der Ihnen die Einsen und Nullen anzeigt, auch wenn dieser die Daten aus der Datei noch interpretiert und Ihnen dann die ASCII-Zeichen für 0 und 1 anzeigt. Die Daten werden in einem binären Format gespeichert ( siehe den Link Binärzahl oben). Der Community-Wiki-Eintrag von Pierre-Olivier behandelt dies genauer.

EightBitTony
quelle
Gutes Exposé. Möglicherweise möchten Sie hinzufügen, dass die Zeichen, die in einer Textzeile als "1" oder "0" angezeigt werden, vom Computer nicht als einzelne "1" oder "0" gespeichert werden. das OP scheint diesbezüglich eine Verwirrung zu haben.
Wildcard
1
Ich würde mit Ihrer Aussage streiten (dh nicht einverstanden sein): "Wenn Sie eine Textdatei unter Verwendung von anzeigen cat, catliest die ausführbare Datei ( in diesem Fall) alle Einsen und Nullen und präsentiert sie Ihnen, indem sie sie in Zeichen aus Ihrem relevanten Alphabet oder konvertiert Sprache." catmacht das nicht; Alles cat, was Sie tun müssen, ist, Bytes in die Standardausgabe zu schreiben (es sei denn, Sie verwenden die "schädlichen" Optionen). Das Terminalprogramm (und / oder die Terminalhardware, falls zutreffend, dh seine Firmware) bestimmt, wie Bytes als Zeichen gerendert werden, möglicherweise mit Unterstützung des TTY-Treibers.
G-Man sagt, dass Monica
Ich bin damit nicht einverstanden, aber irgendwann brechen alle einfachen Beschreibungen zusammen. Die Frage ist, wie weit Sie im Kaninchenbau sind, bevor Sie aufhören, Dinge einfach zu beschreiben.
EightBitTony
14

Auf niedriger Ebene wird eine Datei als Folge von Nullen und Einsen codiert .

Aber auch Programmierer gehen in der Praxis selten dorthin.

Zunächst (und wichtiger als diese Geschichte von Nullen und Einsen) müssen Sie verstehen, dass alles, was der Computer manipuliert, mit Zahlen codiert ist .

  • Ein Zeichen wird mithilfe von Zeichensatztabellen mit einer Zahl codiert. Beispielsweise hat der Buchstabe "A" einen Wert von 65, wenn er mit ASCII codiert wird. Siehe http://www.asciitable.com

  • Ein Pixel ist mit einer oder mehreren Zahlen codiert (es gibt viele Grafikformate). Im Standardformat mit drei Farben wird ein gelbes Pixel beispielsweise wie folgt codiert: 255 für Rot, 255 für Grün, 0 für Blau. Siehe http://www.quackit.com/css/css_color_codes.cfm (wählen Sie eine Farbe aus und sehen Sie sich die R-, G- und B-Zellen an.)

  • Eine binär ausführbare Datei wird in Assembly geschrieben. Jede Montageanleitung ist als Nummer kodiert. Beispielsweise wird die Assembly-Anweisung MOVB $0x61,%aldurch zwei Zahlen codiert: 176,97 Siehe http://www.sparksandflames.com/files/x86InstructionChart.html (Jeder Anweisung ist eine Nummer von 00 bis FF zugeordnet, da die hexadezimale Notation verwendet wird. siehe unten)

Zweitens : Jede Zahl kann mehrere Darstellungen oder Notationen haben .

Angenommen, ich habe 23 Äpfel.

  • Wenn ich Gruppen von zehn Äpfeln mache, bekomme ich: 2 Gruppen von zehn und 3 Einzeläpfeln. Genau das meinen wir, wenn wir 23 schreiben: eine 2 (Zehner), dann eine 3 (Einheiten).
  • Ich kann aber auch Gruppen von 16 Äpfeln machen. Also bekomme ich eine 16er-Gruppe und 7 einsame Äpfel. In hexadezimaler Schreibweise (so nennt man den 16-Radix) schreibe ich: 17 (16 + 7). Zur Unterscheidung von der Dezimalschreibweise wird die Hexadezimalschreibweise im Allgemeinen mit einem Präfix oder einem Suffix versehen: 17h, # 17 oder $ 17. Aber wie kann man mehr als 9 Gruppen von 16 oder mehr von 9 Äpfeln darstellen? Wir verwenden einfach Buchstaben von A (10) bis F (15). Die Zahl 31 (wie bei 31 Äpfeln) wird hexadezimal als # 1F geschrieben.

  • Auf der gleichen Linie können wir eine Zweiergruppe machen. (Und eine Gruppe von zwei Zweiergruppen-Äpfeln, dh eine Gruppe von 2x2-Äpfeln und so weiter). Dann ist 23: 1 Gruppe von 2x2x2x2-Äpfeln, 0 Gruppe von 2x2x2-Äpfeln, 1 Gruppe von 2x2-Äpfeln, 1 Gruppe von 2 Äpfeln und 1 einziger Apfel.

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

Physikalisch sind Mechanismen, die zwei Zustände (Schalter) zulassen, einfach zu bewerkstelligen, ebenso auf der Festplatte, die sich im Speicher befindet.

Deshalb werden Daten und Programme als Zahlen geschrieben und in ihrer binären Form manipuliert.

Dann übersetzt - je nach Datentyp - in die entsprechende Form (Buchstabe A, gelbes Pixel) oder ausgeführt (MOV-Anweisung).

hexdumplistet die Zahlen auf, die die Daten (oder das Assemblerprogramm) in hexadezimaler Form codieren. Sie können dann einen Taschenrechner verwenden, um die entsprechende Binärform zu erhalten.

Pierre-Olivier Vares
quelle
10

Ich würde mit od(octal dump) beginnen und je nach System möglicherweise objdumpnützliche Tools finden .

Thomas Dickey
quelle
Die POSIX-Option.
Ciro Santilli 新疆 新疆 改造 法轮功 六四
4

Sie können es in einem Hex-Editor öffnen, der es als eine Reihe von Hexadezimalwerten anzeigt. xxd file

Was versuchst du zu erreichen?

theblazehen
quelle
Aber ich dachte, der Computer kann nur Einsen und Nullen lesen. Kann ich die sehen? Ich versuche zu verstehen, wie Computer funktionieren
Martin Zeltin
2
Das allein hilft dir nicht viel. Wenn Sie wissen möchten, wie genau das funktioniert, sehen Sie sich auf einer Linux-Box das ELF-Dateiformat und die en.wikipedia.org/wiki/X86_instruction_listings an . Wenn Sie nur den Code sehen möchten, der vom Compiler generiert wird, schauen Sie sich an, wie er mit gdb ausgeführt wird. Da Sie mehr "Low Level" wollen, schauen Sie auch bei nand2tetris.org vorbei. Für Assembler-Sprache höre ich, dass 6502 und Mips-Assembler viel schöner sind als x86_64 / x86-Assembler
theblazehen
@theblazehen Moderner x86-Familienassembler ist ein Biest. 8086 war überschaubar, und ich denke, so gut wie jede CPU aus dieser Zeit (Ende der 1970er bis in die erste Hälfte der 1980er Jahre) sollte vom Assembler her erträglich sein.
ein Lebenslauf
4

bviist ein binärer visueller Editor mit vim Tastenkombinationen. Es ist auf den meisten Linux-Systemen verfügbar.

Bildbeschreibung hier eingeben

Gilles Castel
quelle
3

Der Linux- Befehl strings gibt die Zeichenfolgen druckbarer Zeichen in Dateien aus, z.

$ 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 ... es ist besser lesbar als binär.

ponsfrilus
quelle
Das OP fragte, wie ich es öffne, um die Einsen und Nullen zu sehen, die es gibt? Der stringsBefehl entfernt jedoch die meisten Bytes, die er sehen möchte.
Juli
@jlliagre - während Sie korrekt sind, hilft der stringsBefehl - insbesondere mit einer längeren Länge wie strings -n 6- wirklich herauszufinden, was eine Binärdatei enthält, wenn sie Zeichenfolgenkonstanten usw. enthält. Diese Antwort hätte ein Kommentar sein müssen, dann wäre es ein Kommentar war gut
Joe
@Joe Ja, ich stelle die stringsNützlichkeit des Befehls nicht in Frage , nur die Tatsache, dass die OP-Frage hier nicht beantwortet wird.
Juli
3

Ein wichtiger Teil, über den Sie immer noch verwirrt zu sein scheinen: Hexadezimalwerte sind nur eine andere Darstellung von Binärwerten. Die meisten Hex-Editoren oder Hex-Speicherauszüge zeigen Werte in hexadezimaler Basis an, da sie besser lesbar sind als in binärer Basis.

Z.B:

Binär:

xxd -b README.md                                                                
00000000: 00100011 00100000

Welches ist 35 und 32 in Dezimalzahl

xxd README.md                                                                   
00000000: 2320

Auch 35 und 32 dezimal

Donnerstag weiter
quelle
Andere Leute haben dies erwähnt. Dies ist jedoch eine gute Zusammenfassung. Sie können Ihre Antwort bearbeiten, wenn Sie den ersten Absatz ändern möchten.
wizzwizz4
Sehr gut, ich habe noch niemanden gesehen, der es erwähnt hat. Vielleicht habe ich es verpasst.
Donnerstag, den nächsten
Beachten Sie, dass Sie vimfür die Verwendung installiert sein müssen xxd.
Starbeamrainbowlabs
2

Sie können die Datei im Binärformat anzeigen vim, indem Sie:

  • Öffnen Sie die Datei in vim
  • Betreten :% !xxd -b

Der xxdBefehl kann weiter optimiert werden, zum Beispiel:

  • Durch das Hinzufügen -g4werden die Bits in 32-Bit-Packs gruppiert
  • Durch Hinzufügen -c4, wird die Ausgabe formatiert, um 4 Bytes pro Zeile zu haben

Wenn Sie beide oben genannten Flags hinzufügen, erhalten Sie eine 32-Bit-Ganzzahl pro Zeile.

Leandros
quelle
1

Du kannst es zB mit diesem rubinroten Einzeiler machen:

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

Herkömmliche C-basierte Systeme bieten eine schlechte Unterstützung für die Ausgabe von Inhalten in der Binärdatei AFAIK. Es ist normalerweise nicht sehr nützlich, da es im Gegensatz zu hexadezimalen Speicherauszügen ziemlich schwer zu lesen ist.

PSkocik
quelle
Vielen Dank! Das Hinzufügen eines Leerzeichens direkt nach %08bbewirkt, dass die Ausgabe in Bytes gruppiert wird.
Starbeamrainbowlabs
0

GHex ist dein Freund :)
Du kannst es über die Kommandozeile von

Ubuntu installieren :

sudo apt-get install ghex

Fedora:

sudo yum installiere ghex

verrückt machen
quelle