Wie ist eine binäre ausführbare Datei aufgebaut? Erkunden wir es!
- Eine ausführbare Datei ist nichts Unverständliches, sondern ein reguläres Dateiformat.
- Behandelt werden ELF-Binärdateien unter Linux, wobei C verwendet wird, aber auch andere kompilierte Sprachen möglich sind.
- Es geht um Symbole (symbols), Sektionen (sections) und Segmente (segments).
- Symbole entsprechen etwa Funktionsnamen, werden in Sektionen organisiert, und Sektionen bilden Segmente.
- Mit dem Tool
readelfwerden diese untersucht.
Schritt 1: In einem Texteditor öffnen!
- Als einfachste Methode kann man eine Binärdatei ansehen und dabei den Text "Penguin!" und "ELF" erkennen.
Schritt 2: Mit readelf die Symboltabelle ansehen
- Mit
readelf --symbolslassen sich Symbole anzeigen. - Symbole wie
main,putsund_startsind zu sehen. - Das Programm beginnt nicht bei
main, sondern bei_start.
Symbole
- Beim Schreiben eines Programms werden Symbole für Funktionen erzeugt.
- Wenn eine Funktion aus einer Bibliothek aufgerufen wird, werden Symbole benötigt, um den Code dieser Funktion zu finden.
- Das Linking erfolgt über statisches Linking und dynamisches Linking.
Schritt 3: Mit objdump die Binärdatei ansehen und etwas über Sektionen lernen!
objdumpbietet eine bessere Möglichkeit, Binärdateien zu betrachten.- Sektionen wie
.text,.rodataund.interplassen sich sehen. - Sektionen werden zur Link-Zeit verwendet, Segmente zur Laufzeit.
Schritt 4: Assembler ansehen!
- Die
.text-Sektion enthält Assembler-Code. - Mit
objdump -dlässt sich der Assembler-Code anzeigen.
Schritt 5: Segmente ansehen!
- Ein Programm besteht aus Segmenten beziehungsweise Programm-Headern.
- Mit
readelf --segmentslassen sich Segmente anzeigen. - Segmente legen fest, wie verschiedene Teile eines Programms im Speicher getrennt werden.
Keine Magie!
- Ausführbare Dateien sind keine Magie, und ELF ist wie andere Dateiformate.
- Mit
readelf,nmundobjdumplassen sich Linux-Binärdateien untersuchen.
GN⁺-Meinung
- Dieser Artikel ist für Software Engineers auf Einstiegsniveau sehr nützlich, um die Struktur binärer ausführbarer Dateien zu verstehen.
- Er bietet praktische Informationen zu den Konzepten von Symbolen, Sektionen und Segmenten sowie zu den Tools (
readelf,objdump) zu ihrer Untersuchung. - Außerdem vermittelt er ein grundlegendes Verständnis dafür, wie Programme tatsächlich in den Speicher geladen und ausgeführt werden, was Interesse an Systemprogrammierung wecken kann.
1 Kommentare
Hacker-News-Kommentare
Ein Nutzer empfiehlt, ELF (Executable and Linkable Format) selbst zu schreiben, da das sehr dabei hilft, die grundlegenden Bestandteile von ausführbaren Dateien zu verstehen. Außerdem sei dieser Artikel nützlich für Menschen, die statt des üblichen Bottom-up-Ansatzes einen Top-down-Ansatz bevorzugen.
Ein anderer Nutzer erklärt, dass man zwar annehmen könne, ein Programm beginne bei der Ausführung in
main, tatsächlich starte es aber bei_start._starterledigt mehrere wichtige Aufgaben, darunter den Aufruf vonmain; dabei handelt es sich nicht um etwas C-Spezifisches, sondern um den sprachunabhängigen Einstiegspunkt des Binärprogramms.Ein Nutzer erwähnt, dass Julias Artikel immer hervorragend seien, und dass er gute Erfahrungen damit gemacht habe, Menschen mithilfe einer Vorführung des Befehls
stringsbeizubringen, dass kompilierter Code keine Geheimnisse bewahrt.Ein Nutzer sagt, er habe dieses Thema zum ersten Mal studiert, als er seine akademische Laufbahn von der Mathematik zur Informatik verlagerte, und er habe diese tiefgehende Beschäftigung nie bereut. Julia habe ebenfalls einen mathematischen Hintergrund, und der Wunsch nach solcher Top-down-Argumentation könnte Mathematiker zu solchen Experimenten geführt haben.
Ein Nutzer verweist darauf, dass ausführbare Dateien plattformspezifisch sind, und teilt seine Erfahrung, als er bewies, dass eine „wirklich portable ausführbare Datei“ auf verschiedenen Plattformen laufen kann. Das bedeute, dass die Lösung für das Cross-Platform-Problem, das man mit Java, plattformübergreifenden Bibliotheken und anderen Ansätzen zu lösen versuchte, lange direkt vor unseren Augen lag.
Ein Nutzer sagt, er sei Anfang der 90er von Dateiformaten für ausführbare Dateien fasziniert gewesen und habe mit Modula 2 einen Viewer für DOS- und Windows-Executable-Dateien geschrieben. Das Programm wurde unter dem Namen VEXE 1991 als Shareware veröffentlicht, gewann unter Crackern eine gewisse Anhängerschaft und wurde sogar im +ORC-Tutorial erwähnt.
Ein Nutzer sagt, Binärdateien im Terminal auszugeben sei eine Ursache von Kummer, und bevorzuge stattdessen
hexdump -C.Mehrere Nutzer erwähnen, dass dies ein großartiger Thread zu diesem Thema sei.
Ein Nutzer empfiehlt Interessierten an diesem Thema, Cosmopolitan und RedBean sowie „αcτµαlly pδrταblε εxεcµταblε (2020)“ zu lesen.