Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
metasm — Dies ist das Haupt-Repository für metasm, einen freien Assembler / Disassembler / Compiler, der in Ruby geschrieben ist | Kitploit
Tools/GitHubGitHub/jjyg/metasm
Code-AnalyseReverse EngineeringShellcodeDebuggerBinäranalyse
GitHubjjyg/metasm

metasm

Dies ist das Haupt-Repository für metasm, einen freien Assembler / Disassembler / Compiler, der in Ruby geschrieben ist

Repository anzeigen
4758213vor 6 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Webseite

Metasm, die Ruby-Suite für Assembly-Manipulation

  • Beispielskripte in samples/ -- die Kommentare am Anfang der Dateien lesen
  • Alle Dateien sind unter den Bedingungen der LGPL lizenziert

Autor: Yoann Guillot

Grundlegender Überblick:

Metasm ermöglicht es Ihnen, mit ausführbaren Formaten (ExeFormat) zu interagieren: PE, ELF, Mach-O, Shellcode usw. Es gibt drei Ansätze für ein ExeFormat:

  • eines von Grund auf neu zusammenzustellen
  • ein vorhandenes Format zu dekompilieren
  • die Dateistruktur zu manipulieren

Einsatzbereite Skripte finden Sie im Unterverzeichnis samples/; lesen Sie die Kommentare in den Kopfzeilen der Skripte. Sie können auch das Argument --help ausprobieren, wenn Sie sich abenteuerlustig fühlen.

Weitere Informationen finden Sie im Unterverzeichnis doc/. Die Textdateien können mit dem Skript misc/txt2html.rb zu HTML kompiliert werden.

Hier ist ein kurzer Überblick über die Interna von Metasm.

Assemblierung:

Beim Kompilieren geht man von einem Quelltext aus (ein Ruby-String, der hauptsächlich aus einer Abfolge von Anweisungen/Daten/Padding-Direktiven besteht), der geparst wird.

Der String wird einer Preprocessor-Instanz übergeben (die #if, #ifdef, #include, #define, /* */ usw. behandelt und zu 100 % mit gcc -E kompatibel sein sollte), die für Assembler-Quellen in einen AsmPreprocessor eingebettet ist (um Asm-Makrodefinitionen, 'equ' und Asm-';'-Kommentare zu behandeln). Die Schnittstelle dazu ist ExeFormat#parse(text[, filename, lineno]) oder ExeFormat.assemble (was .new, #parse und #assemble aufruft).

Der (Asm)Preprocessor gibt Tokens an das ExeFormat zurück, das sie als Daten, Padding, Labels oder Parser-Direktiven parst. Parser-Direktiven beginnen immer mit einem Punkt. Sie können generisch sein (.pad, .offset...) oder ExeFormat-spezifisch (.section, .import, .entrypoint...). Sie werden von #parse_parser_instruction() behandelt. Wenn das ExeFormat ein Wort nicht erkennt, wird es an seine CPU-Instanz übergeben, die für das Parsen von Instruktionen zuständig ist (oder eine Ausnahme auslöst). Alle diese Tokens werden in einem oder mehreren Arrays im @source-Attribut des ExeFormat gespeichert (Der @source von Shellcode ist ein Array; bei PE/ELF ist es ein Hash [Abschnittsname] => [Array geparster Daten]). Jeder Immediate-Wert kann ein beliebiger Expression sein (siehe später).

Anschließend können Sie die Quelle mit ExeFormat#assemble zu Binärsektionen assemblieren.

Sobald die Sektions-Binärdaten verfügbar sind, kann das gesamte binäre ausführbare Programm mit ExeFormat#encode_file(filename[, format]) auf die Festplatte geschrieben werden.

PE und ELF enthalten eine Autoimport-Funktion, die die automatische Erstellung von importbezogenen Daten für bekannte betriebssystemspezifische Funktionen ermöglicht (z. B. erzeugen unaufgelöste Aufrufe von 'strcpy' Daten, sodass das Binärprogramm zur Laufzeit gegen die libc-Bibliothek gelinkt wird).

Die Skripte samples/{exe,pe,elf}encode.rb können eine Assembler-Quelldatei als Argument nehmen und zu einem lauffähigen ausführbaren Programm kompilieren.

Die CPU-Klassen sind für das Parsen und Kodieren einzelner Instruktionen verantwortlich. Der aktuelle Ia32-Parser verwendet die Intel-Syntax (z. B. mov eax, 42). Der generische Parser erkennt Labels als einen String am Anfang einer Zeile, gefolgt von einem Doppelpunkt (z. B. 'some_label:'). GCC-artige lokale Labels können verwendet werden (z. B. '1:', referenziert mit '1b' (rückwärts) oder '1f' (vorwärts); sie können beliebig oft neu definiert werden.) Daten werden mit der 'db'-Notation angegeben (z. B. 'dd 42h', 'db "blabla", 0'). Siehe samples/asmsyntax.rb

EncodedData:

In Metasm werden alle Binärdaten als EncodedData gespeichert. EncodedData hat 3 Hauptattribute:

  • #data, das die rohen Binärdaten enthält (normalerweise ein Ruby-String, siehe aber VirtualString)
  • #export, ein Hash, der einen Exportnamen (Labelnamen) einem Offset innerhalb von #data zuordnet
  • #reloc, ein Hash, dessen Schlüssel Offsets innerhalb von #data sind und dessen Werte Relocation-Objekte sind. Ein Relocation-Objekt hat eine Endianness (:little/:big), einen Typ (:u32 für unsigned 32-Bit) und ein Ziel (den beabsichtigten Wert, der hier gespeichert wird). Das Ziel ist ein beliebiger arithmetischer/logischer Expression.

EncodedData hat außerdem eine #virtsize (z. B. für .bss-Sektionen) und einen #ptr (interner Offset, der beim Dekodieren verwendet wird).

Sie können ein Fixup an einem EncodedData durchführen, mit einem Hash Variablenname => Wert (der Wert sollte ein Expression oder ein numerischer Wert sein). Wenn Sie das tun, wird das Ziel jeder Relocation anhand der Bindung gebunden, und wenn das Ergebnis berechenbar ist (kein externer Variablenname wird in dem Expression verwendet), wird das Ergebnis mit den Größen-/Vorzeichen-/Endianness-Informationen der Relocation kodiert. Wenn es überläuft (versucht, 128 in eine 8-Bit-Relocation mit Vorzeichen zu speichern), wird eine EncodeError-Ausnahme ausgelöst. Verwenden Sie den Typ :a32, um ein stilles Überlaufen durch Abschneiden zu erlauben. Wenn das Ziel der Relocation nicht numerisch ist, bleibt das Ziel unverändert, wenn Sie EncodedData#fixup verwenden, oder es wird mit #fixup! . durch das gebundene Ziel ersetzt.

Disassemblierung:

Dieser Code befindet sich in der Quelldatei metasm/decode.rb, die die Disassembler-Klasse definiert.

Der Disassembler benötigt ein dekodiertes ExeFormat (um sagen zu können, welche Daten sich an welcher virtuellen Adresse befinden) und einen Einstiegspunkt (eine virtuelle Adresse oder einen Exportnamen). Er kann dann beginnen, Instruktionen zu disassemblieren. Wenn er auf einen als :setip markierten Opcode stößt, fragt er die CPU nach dem Sprungziel (ein Expression, das Registerwerte enthalten kann, z. B. jmp eax) und verfolgt Instruktionen rückwärts, bis er den numerischen Wert findet.

Beim Dekodieren verwaltet der Disassembler einen #decoded-Hash, der Adressen (Expressions/Integer, #normalize()d) DecodedInstructions zuordnet.

Die Disassemblierung erzeugt einen InstructionBlock-Graphen. Jeder Block enthält eine Liste von DecodedInstruction und Zeiger auf den nächsten/vorherigen Block (per Adresse).

Der Disassembler verfolgt auch Datenzugriffe von Instruktionen und speichert Xrefs für diese. Die Backtrace-Parameter können angepasst werden, und die maximale Tiefe kann für :r/:w-Backtraces (Instruktionsspeicher-Xrefs) gezielt über #backtrace_maxblocks_data geändert werden. Wenn ein Expression zurückverfolgt wird, wird jeder durchlaufene Block markiert, sodass Schleifen erkannt werden und, falls ein neuer Codepfad zu einem vorhandenen Block gefunden wird, Backtraces über diesen neuen Pfad wieder aufgenommen werden können.

Der Disassembler macht nur sehr wenige Annahmen und geht insbesondere nicht davon aus, dass Funktionen zurückkehren; sie tun es nur, wenn die Rückverfolgung der 'ret'-Instruktionen schlüssig ist. Das ist ziemlich mächtig, bedeutet aber auch, dass jeder Fehler im Rückverfolgungsprozess zu einem vollständigen Stopp führen kann; außerdem ist der Disassembler dadurch recht langsam.

Die spezielle Methode #disassemble_fast kann verwendet werden, um dies zu umgehen, wenn bekannt ist, dass der Code wohlgeformt ist (d. h. sie nimmt an, dass alle Aufrufe zurückkehren).

Tool herunterladen