2012-03-30 3 views
9

Ich lerne Montage, Motivation in der Lage zu Reverse-Engineer. Ich versuche, den Assembler zu finden, mit dem ich beginnen sollte, damit ich dann Tutorials finden und anfangen kann, etwas Assembly zu schreiben.NASM ist reine Assembly, aber MASM ist High-Level-Assembly?

Ich kam zu wissen, dass MASM viele eingebaute Konstrukte hat, also werde ich sie meistens verwenden, anstatt sie zu kodieren, was ich tun muss, wenn ich NASM wähle.

Meine Frage ist .. ist das wahr? Wenn es ist, welchen Assembler Sie empfehlen, Assembly aus der Perspektive eines Reverse-Engineers zu lernen und einige gute Tutorials dafür.

Auch, wenn Sie andere Vorschläge zum Rückwärtsfahren haben? Alternative Vorgehensweise oder etwas?

P.S: Ich habe viele Artikel und Fragen hier gelesen, bin aber immer noch verwirrt.

+4

Beim Rückwärtsfahren lesen Sie hauptsächlich die Montage. Sie profitieren also nicht von High-Level-Konstrukten. – CodesInChaos

+0

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

+0

negative Wähler? Irgendein Grund? – questions

Antwort

7

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.

  1. Sie müssen wirklich verstehen, was die Einschränkungen der Architektur sind.
  2. 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
  3. 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.

+3

Aber für das Verständnis der Demontage ... muss ich nicht Montage lernen? – questions

+2

@questions: Ich denke, der beste Weg, Assembly zu lernen, ist es, disassemblierten Code zu betrachten und herauszufinden, was er tut. Aber das ist meine persönliche Meinung. – hirschhornsalz