Linux objdump-Befehl
objdump ist ein wichtiges Kommandozeilenwerkzeug im GNU-Binutils-Toolset, das verwendet wird, um verschiedene Informationen über Objektdateien und ausführbare Dateien anzuzeigen. Es ist ein leistungsstarkes Werkzeug für Binäranalyse, Reverse Engineering und Debugging auf Linux-Systemen.
Die Hauptfunktionen von objdump umfassen:
- Binärdateien disassemblieren
- Dateiheader-Informationen anzeigen
- Abschnittsinhalte anzeigen
- Symboltabelle anzeigen
- Relokationsinformationen anzeigen
- Dateistruktur analysieren
Grundlegende Syntax
Das grundlegende Befehlsformat von objdump lautet wie folgt:
objdump [选项] 文件名
Wenn keine Optionen angegeben werden, zeigt objdump die Abschnittsheader-Informationen der Datei an.
Detaillierte Erklärung der gängigen Optionen
Disassemblierungsbezogene Optionen
Beispiel
-D, --disassemble-all # Alle Abschnitte disassemblieren
-S, --source # Gemischte Anzeige von Quellcode und Assembler-Code (erfordert -g-Option beim Kompilieren)
--prefix-addresses # Vollständige Adressen während der Disassemblierung anzeigen
--no-addresses # Adressinformationen nicht anzeigen
Optionen für Abschnittsinformationen
Beispiel
-j, --section=name# Nur den Inhalt des angegebenen Abschnitts anzeigen
Optionen für die Symboltabelle
Beispiel
-T, --dynamic-syms # Dynamische Symboltabelle anzeigen
Dateiheader-Informationen
-f, --file-headers # 显示文件头部信息
Weitere nützliche Optionen
Beispiel
-r, --reloc # Relokationseinträge anzeigen
-R, --dynamic-reloc # Dynamische Relokationseinträge anzeigen
-s, --full-contents # Den vollständigen Inhalt aller Abschnitte anzeigen
Praktische Beispiele
Beispiel 1: Anzeigen der Struktur einer ausführbaren Datei
objdump -h /bin/ls
Beispielausgabe:
/bin/ls: file format elf64-x86-64
Sections:
Idx Name Size VMA LMA File off Algn
0 .interp 0000001c 0000000000400238 0000000000400238 00000238 2**0
CONTENTS, ALLOC, LOAD, READONLY, DATA
1 .note.ABI-tag 00000020 0000000000400254 0000000000400254 00000254 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
...
Beispiel 2: Disassemblieren einer ausführbaren Datei
objdump -d /bin/ls
Beispielausgabe (teilweise):
0000000000405a50 : 405a50: 31 ed xor %ebp,%ebp 405a52: 49 89 d1 mov %rdx,%r9 405a55: 5e pop %rsi 405a56: 48 89 e2 mov %rsp,%rdx 405a59: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp ...
Beispiel 3: Anzeigen der Symboltabelle
objdump -t myprogram.o
Beispielausgabe:
myprogram.o: file format elf64-x86-64 SYMBOL TABLE: 0000000000000000 l df *ABS* 0000000000000000 myprogram.c 0000000000000000 l d .text 0000000000000000 .text 0000000000000000 g F .text 0000000000000015 main 0000000000000000 *UND* 0000000000000000 printf
Beispiel 4: Gemischte Anzeige von Quellcode und Assemblercode
objdump -S myprogram
Beispielausgabe:
Beispiel
400526: 55 push %rbp
400527: 48 89 e5 mov %rsp,%rbp
printf("Hello, World!n");
40052a: bf d4 05 40 00 mov $0x4005d4,%edi
40052f: e8 cc fe ff ff callq 400400
return 0;
400534: b8 00 00 00 00 mov $0x0,%eax
}
Praktische Anwendungsszenarien
Szenario 1: Debuggen von Programmabstürzen
Wenn ein Programm abstürzt, können Sie mit objdump den Code in der Nähe der Absturzadresse anzeigen:
objdump -d --start-address=0x400526 --stop-address=0x400536 myprogram
Szenario 2: Analysieren von Bibliotheksfunktionsaufrufen
Anzeigen, welche dynamischen Bibliotheksfunktionen das Programm aufruft:
objdump -T myprogram | grep UND
Szenario 3: Assemblersprache lernen
Assemblersprache lernen, indem Sie einfache C-Programme disassemblieren:
Beispiel
objdump -d simple
Hinweise
- Debug-Informationen: Um Informationen auf Quellcodeebene zu erhalten, müssen Sie hinzufügen
-goption - Auswirkung der Optimierung: Compiler-Optimierung beeinflusst den generierten Assembly-Code; seien Sie vorsichtig bei der Analyse
- Architekturunterschiede: Unterschiedliche CPU-Architekturen haben unterschiedliche Assemblerbefehle; stellen Sie sicher, dass Sie die richtigen Disassemblierungsoptionen verwenden
- Berechtigungsprobleme: Die Analyse von Systemdateien kann Root-Rechte erfordern
- Dateiformat: objdump ist hauptsächlich für Dateien im ELF-Format gedacht; andere Formate erfordern möglicherweise eine spezielle Behandlung
Fortgeschrittene Tipps
Verwendung mit anderen Werkzeugen
Beispiel
objdump -d myprogram | grep -A20 "main>:"
# Funktionsgrößen berechnen
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'
Ein Disassemblierungsskript erstellen
Beispiel
# Beispiel für ein Disassemblierungsskript
if [ $# -ne 1 ]; then
echo "Verwendung: $0 "
exit 1
fi
echo "=== Dateikopf-Informationen ==="
objdump -f $1
echo -e "n=== Abschnittsinformationen ==="
objdump -h $1
echo -e "n=== Disassemblierungscode ==="
objdump -d $1
Zusammenfassung
objdump ist ein leistungsstarkes Werkzeug zur Binäranalyse auf Linux-Systemen. Wenn Sie es beherrschen, können Sie:
- Programmausführungsmechanismen tiefgehend verstehen
- Programmprobleme schnell lokalisieren
- Assemblersprache und Systemkenntnisse lernen
- Grundlegende Reverse-Engineering-Analyse durchführen
Mit der in diesem Artikel vorgestellten grundlegenden Verwendung und den praktischen Beispielen sollten Sie bereits in der Lage sein, objdump für die grundlegende Analyse von Binärdateien zu verwenden. Wenn Sie praktische Erfahrung sammeln, werden Sie weitere clevere Anwendungsmöglichkeiten in der Systemprogrammierung und beim Debuggen entdecken.
Andere Erweiterungen
Linux-Befehlsenzyklopädie