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.
Antworten:
Nach dieser Antwort von Tyraniden :
Aktualisieren
Nach dieser Antwort von Emilio Bool :
quelle
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
,cat
liest 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).
objdump
ist 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.
quelle
cat
,cat
liest 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."cat
macht das nicht; Allescat
, 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.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,%al
durch 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.
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).
hexdump
listet 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.quelle
Ich würde mit
od
(octal dump) beginnen und je nach System möglicherweiseobjdump
nützliche Tools finden .quelle
Sie können es in einem Hex-Editor öffnen, der es als eine Reihe von Hexadezimalwerten anzeigt.
xxd file
Was versuchst du zu erreichen?
quelle
bvi
ist ein binärer visueller Editor mit vim Tastenkombinationen. Es ist auf den meisten Linux-Systemen verfügbar.quelle
Der Linux- Befehl strings gibt die Zeichenfolgen druckbarer Zeichen in Dateien aus, z.
etc ... es ist besser lesbar als binär.
quelle
strings
Befehl entfernt jedoch die meisten Bytes, die er sehen möchte.strings
Befehl - insbesondere mit einer längeren Länge wiestrings -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 gutstrings
Nützlichkeit des Befehls nicht in Frage , nur die Tatsache, dass die OP-Frage hier nicht beantwortet wird.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:
Welches ist 35 und 32 in Dezimalzahl
Auch 35 und 32 dezimal
quelle
vim
für die Verwendung installiert sein müssenxxd
.Sie können die Datei im Binärformat anzeigen
vim
, indem Sie:vim
:% !xxd -b
Der
xxd
Befehl kann weiter optimiert werden, zum Beispiel:-g4
werden die Bits in 32-Bit-Packs gruppiert-c4
, wird die Ausgabe formatiert, um 4 Bytes pro Zeile zu habenWenn Sie beide oben genannten Flags hinzufügen, erhalten Sie eine 32-Bit-Ganzzahl pro Zeile.
quelle
Du kannst es zB mit diesem rubinroten Einzeiler machen:
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.
quelle
%08b
bewirkt, dass die Ausgabe in Bytes gruppiert wird.GHex ist dein Freund :)
Du kannst es über die Kommandozeile von
Ubuntu installieren :
Fedora:
quelle