Maschinencode-Parser für Linux

Ich suche eine Linux-Bibliothek/-Tool, das Maschinencode-Anweisungen analysieren kann, vorzugsweise für die Power-Architektur (ppc64 oder ppc64 Little Endian). Ich möchte im Grunde in der Lage sein, eine Maschinenanweisung in eine lesbare Assembler-Anweisungszeichenfolge umzuwandeln, die ich mit einem Skript verarbeiten kann.

Diese Funktionalität ist offensichtlich bereits Bestandteil von GCC und GDB. Beispielsweise kann GDB die aktuelle Bauanleitung mit ausdrucken x /i $pc. Gibt es eine zugrunde liegende Bibliothek, die ich wiederverwenden könnte? GCC kann eine Assembler-Anweisung nehmen und beim Kompilieren den entsprechenden Maschinencode generieren.

Also im Grunde ist es nur ein Disassembler. Warum rufen Sie nicht einfach die verfügbaren Tools wie objdump auf?
Guter Punkt, ich denke, es kann funktionieren. Ich hätte lieber eine Bibliothek gehabt, die eine übersichtliche API bereitstellt, die ich zur Laufzeit aufrufen kann. Mit objdump muss ich: 1) die Adresse der Anweisung abrufen, die ich dekompilieren möchte (z. B. RIP-Register für die aktuelle Anweisung), 2) herausfinden, welche Bibliothek/ausführbare Datei diese Anweisung enthält (wahrscheinlich mit /proc/maps), 3) aufrufen objdump in der Bibliothek/ausführbaren Datei, analysieren Sie die Ausgabe und speichern Sie sie in einer Datenstruktur, und 4) finden Sie heraus, an welcher Anweisung in dieser Datenstruktur ich tatsächlich interessiert bin.

Antworten (1)

https://github.com/aquynh/capstone

Capstone ist ein Disassemblierungs-Framework mit dem Ziel, die ultimative Disasm-Engine für die binäre Analyse und Umkehrung in der Sicherheitsgemeinschaft zu werden.

Capstone wurde von Nguyen Anh Quynh entwickelt und von einer kleinen Community entwickelt und gepflegt. Capstone bietet einige unvergleichliche Funktionen:

  • Unterstützt mehrere Hardwarearchitekturen: ARM, ARM64 (ARMv8), Mips, PPC, Sparc, SystemZ, XCore und X86 (einschließlich X86_64).
  • ...

http://mkfs.github.io/content/opdis/

Opdis ist ein Wrapper für die Disassembler-Bibliothek libopcodes, die als Teil von GNU vertrieben wird binutils. Es erweitert die libopcodes-Bibliothek, indem es lineare und Kontrollfluss-Disassemblierungsalgorithmen, Befehls- und Operandenobjekte, die für die Analyse geeignet sind, und ein Befehlszeilendienstprogramm zum Durchführen der Disassemblierung an beliebigen Stellen in einer Datei anbietet.

Diese Funktionen fehlen in libopcodesund objdump. Das Design von libopcodes macht es umständlich, sie für die binäre Analyse zu verwenden; Es geht davon aus, dass zerlegte Anweisungen gedruckt, nicht gespeichert oder analysiert werden, und ruft daher einen Rückruf mit einer fprintf(3)Signatur auf. Die Mängel von objdumpsind sogar noch größer: Es unterstützt weder die Control-Flow-Disassemblierung, noch erlaubt es dem Benutzer, anzugeben, welche Bytes in der Datei disassembliert werden sollen.

Das Opdis-Projekt besteht aus der libopdisBibliothek und dem opdisBefehlszeilendienstprogramm.

Unterstützte Architekturen

Opdis unterstützt die Disassemblierung aller Architekturen, die GNU binutilsunterstützt . Auf den meisten dieser Architekturen ist jedoch nur der ASCII-String für die disassemblierte Anweisung verfügbar.

Weitere Bibliotheken finden Sie hier

Capstone sieht so aus, wie ich es möchte, unterstützt jedoch keine 64-Bit-Leistung (ppc64).