Linux objdump-Befehl

Linux 命令大全Linux-Befehlsenzyklopädie


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        # Abschnitte mit Code disassemblieren
-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

-h, --section-headers    # Abschnittsheader-Informationen anzeigen
-j, --section=name# Nur den Inhalt des angegebenen Abschnitts anzeigen

Optionen für die Symboltabelle

Beispiel

-t, --syms               # Symboltabelle anzeigen
-T, --dynamic-syms       # Dynamische Symboltabelle anzeigen

Dateiheader-Informationen

-f, --file-headers       # 显示文件头部信息

Weitere nützliche Optionen

Beispiel

-l, --line-numbers       # Zeilennummerninformationen anzeigen (erfordert Debuginformationen)
-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

int main() {
  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

gcc -o simple simple.c
objdump -d simple

Hinweise

  1. Debug-Informationen: Um Informationen auf Quellcodeebene zu erhalten, müssen Sie hinzufügen-goption
  2. Auswirkung der Optimierung: Compiler-Optimierung beeinflusst den generierten Assembly-Code; seien Sie vorsichtig bei der Analyse
  3. Architekturunterschiede: Unterschiedliche CPU-Architekturen haben unterschiedliche Assemblerbefehle; stellen Sie sicher, dass Sie die richtigen Disassemblierungsoptionen verwenden
  4. Berechtigungsprobleme: Die Analyse von Systemdateien kann Root-Rechte erfordern
  5. 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

# grep verwenden, um bestimmte Funktionen zu filtern
objdump -d myprogram | grep -A20 "main>:"

# Funktionsgrößen berechnen
objdump -d myprogram | awk '/^[0-9a-f]+ :/ {print $1,$2}'

Ein Disassemblierungsskript erstellen

Beispiel

#!/bin/bash
# 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.


Linux 命令大全Linux-Befehlsenzyklopädie

Andere Erweiterungen