Zasm bietet eine sehr flexible und leichte Bibliothek, um X86-64-Code mit Zydis als Backend zu manipulieren und zu generieren. Zasm speichert alles als Knoten wie Anweisungen, Daten, Beschriftungen, Abschnitte usw., was eine Möglichkeit bietet, den Code leicht zu manipulieren/umwandeln, bevor er ihn in binärer Serialisierung serialisiert. Die API ist von ASMJIT inspiriert. Wenn Sie also ASMJIT verwendet haben, sollte sich dies sehr vertraut anfühlen.
Einige meiner Projekte verwendeten Zydis und Asmjit, wobei Anweisungen zuerst mit Zydis dekodiert und dann in den ASMJIT-Bauunternehmer gesteckt wurden, um die Verarbeitung/Analyse der Anweisungen/Zweige zu ermöglichen, bevor der geänderte Code neu kodiert/verlegt wird, gibt es ein paar Abgründen, die weiter unten erklärt werden. Zydis hat kürzlich eine Möglichkeit eingeführt, die gleichen Strukturen/Daten zu verwenden, die bereits Anweisungen codieren müssen, die zu Zasm führen. Diese Bibliothek zielt darauf ab, Assembler/Decoder auf höherer Ebene zu sein, der für verschiedene Dinge wie das zuvor genannte Beispiel verwendet werden kann.
Ein starker Unterschied zwischen Zasm und Asmjit ist der Fokus auf genaue Anweisungsdaten wie Operand -Zugriff, versteckte Registeranwendung, korrekte CPU -Flaggen, die in Asmjit entweder fehlen oder falsch fehlen können. Natürlich zielt ASMJIT auf einen freundlichen Weg, um Code für Lets -Sagen oder High Performance -Computer zu generieren. Zasm versucht in keiner Weise, ASMJIT zu ersetzen, sondern hat unterschiedliche Ziele.
Der zweite Grund für Zasm ist, dass Zydis -Encoder extrem niedrig ist, was bedeutet, dass Sie keine Dinge wie Etiketten haben. Zasm bietet eine hochstufige Klasse für die Zusammenstellung von Anweisungen und liefert Beschriftungen wie ein normaler Assembler.
Zasm verwendet CMake in Kombination mit CMKR, um die Wartung der CMakelists zu vereinfachen. Das Gebäude sollte so einfach sein wie die Verwendung der folgenden Befehle aus einem Terminal im Stammverzeichnis:
cmake . -B build
cmake --build build --config Release
Wenn Sie auch die Tests erstellen möchten
cmake . -B build -DZASM_BUILD_TESTS=ON
Programm ist der Container, der alle Daten enthält und auch als doppelt verknüpfte Liste dient. Anweisungen, Beschriftungen, Daten, Abschnitte usw. werden als Knoten gespeichert, mit denen der Benutzer ganz einfach entfernen/einfügen/nachbestellt kann.
Die Assembler -Klasse bietet generierte Mitgliederfunktionen, um Anweisungen/Daten/Beschriftungen in das Programm an der angegebenen Cursorposition zu generieren. Um mov rax, -1 Das Äquivalent wäre asssembler.mov(operands::rax, operands::Imm(-1));
Die Serializer -Klasse serialisiert die Programmknoten in binäre und speichert den resultierenden Zustand. Nach einer erfolgreichen Serialisierung kann der Benutzer den resultierenden Binärcode und Daten wie die Adresse von Beschriftungen, Umzugsinformationen, Abschnittsdaten usw. abfragen.
Decodiert Binärdaten in das Befehlsobjekt, das entweder direkt verwendet oder im Programm gespeichert werden kann.
Das Projekt enthält einige grundlegende Beispiele, die hier gefunden werden können. Es gibt auch verschiedene Tests für fast alles, was Zasm bietet, wenn es etwas fehlt, das zuerst die Tests fehlt, liefern sie auch gute Beispiele. Wenn Sie noch Fragen haben, können Sie uns über Discord kontaktieren.