Assembly Analysis Tools

8

Hat jemand Vorschläge für Analysewerkzeuge für Montagedateien? Ich versuche ARM / Thumb-2 ASM-Dateien zu analysieren, die von LLVM (oder alternativ GCC) generiert wurden, wenn die Option -S übergeben wurde. Ich interessiere mich besonders für Anweisungsstatistiken auf der Basisblockebene, z. Speicheroperationen zählen, usw. Ich kann mein eigenes Tool in Python rollen lassen, war aber neugierig, ob es bereits existierende Tools gab, bevor ich anfing.

Update: Ich habe ein wenig gesucht und eine gute Ressource für Disassemblierungs-Tools / Hex-Editoren / etc hier , aber leider konzentriert es sich hauptsächlich auf x86-Assembly und enthält auch keine tatsächlichen Assembly File Analysis.

    
Zeke 05.11.2010, 23:18
quelle

3 Antworten

2

Was Sie brauchen, ist ein Werkzeug, für das Sie eine Syntax für Assembler definieren und dann benutzerdefinierte Analysatoren erstellen können. Sie Analysatoren können einfach sein ("wie viel Platz nimmt eine Anweisung?") Oder komplex ("Wie viele Zyklen wird diese Anweisung ausführen?" [Was von der vorhergehenden Sequenz von Anweisungen und möglicherweise ein ausgeklügeltes Modell des Prozessors Sie abhängt kümmern sich um]).

Eine speziell dafür entworfene New Jersey Machine Toolkit . Es ist wirklich entworfen, um Code-Generatoren und Debugger zu bauen. Ich vermute, es wäre gut bei "Instruktions-Byte-Zählung". Es ist nicht klar, es ist gut für anspruchsvollere Analysen. Und ich glaube, es besteht darauf, dass Sie seinen -Syntaxstil befolgen, anstatt Ihren.

Einer, der nicht speziell dafür entwickelt wurde, aber gut in der Analyse / Analyse von Sprachen im Allgemeinen ist, ist unser DMS Software Reengineering Toolkit .

DMS kann eine Grammatikbeschreibung für praktisch jede kontextfreie Sprache erhalten (die die meisten Assemblersprachensyntax abdeckt) und kann dann eine bestimmte Instanz dieser Grammatik (Assemblercode) in ASTs für die weitere Verarbeitung analysieren. Wir haben mit mehreren Assemblysprachen, einschließlich der IBM 370, der 8-Bit-CPU-Linie von Motorola und einem ziemlich eigenartigen DSP, ohne Probleme fertig.

Sie können eine Attributgrammatik (Berechnung über eine AST) für DMS einfach festlegen. Dies sind großartige Möglichkeiten, um Analysen zu kodieren, die nur lokale Informationen benötigen, wie "Wie groß ist diese Anweisung?". Für komplexere Analysen benötigen Sie ein Prozessormodell, das aus einer Reihe von Anweisungen besteht. Die Übergabe eines solchen Maschinenmodells an die ASTs für einzelne Anweisungen wäre ein einfacher Weg, ein Maschinenmodell anzuwenden, um komplexere Dinge zu berechnen, wie "Wie lange dauert diese Anweisung?".

Weitere Analysen wie Kontrollfluss und Datenfluss werden vom DMS generisch zur Verfügung gestellt. Sie können einen Attribut-Evaluator verwenden, um lokale Fakten zu sammeln ("Steuerung-nächste für diese Anweisung ist ...", "Daten von dieser Anweisung fließen an ...") und sie an die Flussanalysatoren zur Berechnung globaler Fluss-Fakten ( "Wenn ich diese Instruktion ausführe, welche anderen Instruktionen könnten stromabwärts ausgeführt werden?" ..)

Sie müssen DMS für Ihre spezielle (Assembly) Sprache konfigurieren. Es ist designed für solche Aufgaben konfiguriert zu sein.

Ja, Sie können wahrscheinlich alles in Python programmieren; Schließlich ist es eine Turing-Maschine. Aber wahrscheinlich nicht annähernd so einfach.

Ein weiterer Vorteil: DMS ist bereit, Transformationen basierend auf Ihren Analysen auf Ihren Code anzuwenden. Sie können damit auch Ihren Optimierer implementieren. Schließlich müssen Sie die Analyse, die die Optimierung sicherstellt, mit den tatsächlichen Optimierungsschritten verbinden.

    
Ira Baxter 08.11.2010 05:17
quelle
2

Ich habe viele Disassembler geschrieben, einschließlich Arm und Daumen. Nicht Produktionsqualität, sondern zum Lernen des Assemblers. Sowohl für den ARM als auch für den Thumb hat der ARM ARM (ARM Architectural Reference Manual) ein schönes Diagramm, in dem Sie Datenoperationen von Laden / Speichern usw. bequem zählen können, vielleicht eine Stunde Arbeit, vielleicht zwei. Zumindest würden Sie am Anfang Datenwerte zählen.

Das andere Poster mag recht haben, wie bei der Grafik, über die ich spreche, sollte es sehr einfach sein, ein Programm zu schreiben, das nach ldr, str, add usw. sucht. Es ist nicht nötig, alles zu analysieren, wenn Sie interessiert sind in Speicher-Operationen zählt, etc. Natürlich ist der Nachteil, dass Sie wahrscheinlich keine Schleifen untersuchen können. Eine Funktion kann geladen und gespeichert werden, eine andere kann geladen und gespeichert werden, sie wird jedoch von einer Schleife umschlossen, wodurch nach der Ausführung viel mehr Speicheroperationen verursacht werden.

Ich weiß nicht, woran Sie wirklich interessiert sind. Ich schätze, Sie möchten vielleicht den Code simulieren und diese Art von Dingen zählen. Ich habe einen Daumen-Simulator (Thumbulator) geschrieben, der genau das versucht. (und ich habe es verwendet, um llvm Ausführung vs gcc Ausführung zu vergleichen, wenn es um die Anzahl der ausgeführten Befehle, Fetches, Speicheroperationen, etc. kommt) Das Problem kann sein, dass es nur Daumen ist, kein ARM nein Thumb2. Thumb2 könnte einfacher hinzugefügt werden als ARM. Es gibt einen Armulator vom Arm, der unter anderem in den gdb Quellen ist. Ich kann mich jetzt nicht erinnern, ob es thumb2 ausführt. Mein Verständnis ist, dass, wenn Arm verwendete, es genau diese Arten von Statistiken erzählen würde.

    
old_timer 14.11.2010 05:05
quelle
1

Sie können Ihre Statistiken in den LLVM-Codegenerator einbinden, er ist recht flexibel und sammelt bereits einige Statistiken, die als Beispiel dienen könnten.

    
SK-logic 16.11.2010 11:42
quelle

Tags und Links