Meine Empfehlung rein aus einer "Reverse-Engineering" -Perspektive ist zu verstehen, wie ein Compiler in erster Linie High-Level-Konzepte in Assembler-Anweisungen übersetzt. Das Verständnis, wie die Registerzuweisung in verschiedenen Compilern erfolgt und wie verschiedene Optimierungen die High-Level-Repräsentation verschachtelter Schleifen (u.a.) verdecken, ist wichtiger als die Fähigkeit, einen bestimmten Dialekt der Assembly-Eingabe zu schreiben.
Am besten beginnen Sie mit den Assembler-Zwischendateien aus dem Quellcode, den Sie schreiben (siehe this question for more information). Dann können Sie die Quelle ändern und sehen, wie sie sich auf die Zwischendateien auswirkt. Der andere Ort zum Starten ist mit einem interaktiven Disassembler wie IDA Pro.
Eigentlich das Schreiben von Assemblerprogrammen und das Erlernen der Syntax von NASM, MASM, gas
, von as
ist der einfachste Teil und es spielt keine Rolle, welchen Sie lernen. Sie sind sehr ähnlich, weil die Syntax der Ausgangssprache sehr einfach ist. Wenn Sie planen, zu disassemblieren und zu verstehen, was ein Programm macht, würde ich Makro-Assemblierer komplett ignorieren, da die Makros während der Übersetzung vollständig verschwinden und Sie sie nicht sehen, wenn Sie sich die Disassembler-Ausgabe ansehen.
Diatribe auf Learning Assembly
eine Assemblersprache zu lernen, ist anders als eine höhere Programmiersprache zu lernen. Wenn Sie Makro-Assembler ignorieren, gibt es weniger syntaktische Konstrukte. Das Problem ist, dass jede Compiler-Kette eine etwas andere Darstellung hat, so dass Sie sich auf die Konzepte wie unterstützte Adressmodi, Registereinschränkungen usw. konzentrieren müssen. Diese sind nicht Teil der Sprache per se, da sie von der Hardware diktiert werden.
Der Ansatz, den ich (teilweise weil die Universität mich dazu gezwungen hat), ist, die Hardware selbst zu erforschen und zu verstehen (zB Anzahl der Register, Größe der Register, Art der unterstützten Verzweigungsbefehle usw.) und etwas mehr akademische Konzepte wie Interrupts und Verwendung der bitweisen Manipulation für Integer Match, bevor Sie mit dem Schreiben von Assemblerprogrammen beginnen. Dies ist eine viel längere Route, führt aber zu einem umfassenden Verständnis von Assembly und dem Schreiben von Hochleistungsprogrammen.
Die interessante Sache ist, dass in der Zeit, die ich verbrachte lernen Montage-und Compiler-Konstruktion (die an sich verwandt ist), schrieb ich wirklich sehr wenige Assembly-Programme. Meistens muss ich hier und da kleine Snippets der Inline-Assembly schreiben (z. B. das Einrichten von Indexregistern, wenn der Runtime Loader dies nicht getan hat).Ich habe enorm viel Zeit damit verbracht, Crash-Dumps von einem Speicherort, einer Lader-Map-Datei und Assembler-Ausgabeauflistungen zu analysieren. Ich kann ehrlich sagen, dass die Syntax jedes Assemblers dramatisch verschieden ist und was verschiedene Compiler tun werden, um die Absicht in schnellen oder kleinen Code zu verwandeln.
Das Lernen, wie man Montageprogramme schreibt, war der am wenigsten lohnende Teil des Bildungsprozesses. Es war notwendig zu verstehen, wie die Quelle in die Bits und Bytes übersetzt wird, die der Computer ausführt, aber es war wirklich nicht das, was ich wirklich aus einer rohen Binärdatei rekonstruieren musste (Disassembler -> Assembly-Liste -> Beste Schätzung der High-Level-Intents) oder ein Speicherabbild. Ich mache mehr von letzterem, aber die Anforderungen des Jobs sind die gleichen.
- Sie müssen wirklich verstehen, was die Einschränkungen der Architektur sind.
- Sie haben die sehr grundlegende Syntax des Assembler in Frage wissen - wie werden Adreßmodi angegeben, wie sind Register angegeben ist, was ist die Reihenfolge der Argumente für ein
move
- Was einen Compiler von
if (a > 0)
nicht gehen Transformationen mov.b r0,d0 ... bnz $L
Starten von über Computerarchitektur Lernen (zB lesen etwas von Andrew Tanenbaum), dann, wie ein Betriebssystem tatsächlich lädt und führt ein Programm (Levine Linkers & Loaders), dann kompilieren einfache Programme in C/C++ und Blick auf die Montage Sprachlistings.
Beim Rückwärtsfahren lesen Sie hauptsächlich die Montage. Sie profitieren also nicht von High-Level-Konstrukten. – CodesInChaos
Etwas außerhalb des Themas, aber da Sie an Reverse Engineering interessiert sind, verpflichten Sie sich bitte zum Reverse Engineering Site-Vorschlag hier: http://area51.stackexchange.com/proposals/26607/reverse-engineering – teukkam
negative Wähler? Irgendein Grund? – questions