Kann maschinelles Lernen verwendet werden, um bessere Reverse Engineering- / Dekompilierungswerkzeuge zu entwickeln?

7

Ich habe dies gegoogelt, aber abgesehen von einigen Artikeln konnte ich kein Reverse Engineering-Tool finden, das mit maschinellem Lernen erstellt wurde.

Ich bin kein Experte für maschinelles Lernen und tiefes Lernen, aber es scheint vernünftig zu denken, dass wir angesichts der Tatsache, dass wir Milliarden von Open-Source-Codezeilen haben, diese verwenden können, damit unsere "Maschine" lernen kann, wie diese zusammengesetzt und ausführbar ist Code sieht so aus und studiert sie einfach, beherrscht die Kunst des Umkehrens und erstellt daher auf diese Weise ein Tool, mit dem jedes Programm mit großer Genauigkeit rückgängig gemacht werden kann.

Ist das jetzt machbar oder fehlt mir hier etwas? Gibt es ein Werkzeug, das auf diese Weise oder auf dem Weg zum Herauskommen gebaut wurde? Was denkst du darüber? Wird überhaupt ein besseres Umkehrwerkzeug benötigt oder gibt es bereits ein großartiges Umkehrwerkzeug, das die Arbeit mit der bestmöglichen Genauigkeit erledigen kann?

John Pence
quelle
Können Sie genau beschreiben, was Sie in diesem Zusammenhang unter "Reverse Engineering" verstehen?
DrMcCleod
@ DrMcCleod Dekompilieren Sie die ausführbare Datei
John Pence
Die Ergebnisse sollen nur mit Hilfe von Google Scholar auf wissenschaftliche Arbeiten beschränkt werden. Es wurden 7610 Treffer für "Dekompilierung" gefunden. Die Frage ist nicht, ob es möglich ist, den Quellcode für eine Binärdatei zu erhalten, sondern ob Sie genetische Algorithmen, Deeplearning, LSTM oder Expertensysteme bevorzugen.
Manuel Rodriguez

Antworten:

4

KI im Allgemeinen, einschließlich maschinelles Lernen, verspricht signifikante Verbesserungen bei Reverse Engineering-Werkzeugen. Disassembler sind ziemlich dumm. Wenn Symbole nicht aus der ausführbaren Datei entfernt werden, kann aus einer ausführbaren Datei eine Datei erstellt werden, die ähnlich wie der Quellassemblierungscode formatiert ist. Bibliotheksdateien wie .a, .so oder .dll-Dateien können ebenfalls in Assembly wiederhergestellt werden. Im Fall von Java kann Bytecode in der Sprache der virtuellen Maschine wiederhergestellt werden.

Das Wiederherstellen von Code höherer Ebene in C oder Java ist schwieriger. Höhere Strukturen in C ++ oder Scala verursachen größere Schwierigkeiten. Das Problem besteht darin, dass mehr als eine übergeordnete Struktur zu einer einzelnen Maschine, einem Bytecode oder einem Programm auf Assemblyebene kompiliert wird. Das Kompilieren ist für jede Compiler- und Optomisierungsstufe nahezu eine Eins-zu-Eins-Beziehung. Das Dekompilieren ist eine Eins-zu-Viele-Beziehung, und die Optimierung verschlechtert die Situation nur. Der Code in einer vorgetäuschten kompilierten Sprache

    for int i = 0 to 10 by 2
      squares[i] = x[i]^2

kann mit einem hohen Grad an Optimierung zu demselben Code wie dieser Code in derselben vorgetäuschten Sprache kompiliert werden.

    int i = 0
    while (true)
      s = x[i]^2
      squares[i ++] = s
      if ((i ++) > 10) break

So wie AI bei der Optimierung verwendet werden kann (um den kleinsten und schnellsten Satz von Maschinenanweisungen zum Ausführen des Algorithmus zu finden), kann AI auch entwickelt werden, um der Dekompilierung von Assembly-, Maschinen- oder Bytecode einen höheren Programmierstil zuzuweisen. Ein paar Dinge wären nötig.

  • Ein tiefes Netzwerk, das möglicherweise ein Modell nutzt, das Entwicklung und Reverse Engineering darstellt, um es in das Training und die Nutzung des Netzwerks zu integrieren
  • Eine Reihe von Compilern {gcc, g ++, llvm, llvm ++, vcc, v ++, javac, scala, ...} zum Generieren von Features (kompilierte Programme) aus Labels (Quellcode)
  • Ein Generator gültiger Programme oder eine vorhandene große Sammlung davon (von GitHub, Bitbucket oder GitLab), um die Compiler zu versorgen

Beim Dekompilieren von Dateien, aus denen Symbolinformationen entfernt wurden, kann AI Variablen, Konstanten und Funktionen möglicherweise sinnvolle Namen zuweisen, indem die Variablen im Programm und das domänenspezifische Vokabular aus jedem über die Programme geschriebenen Text extrahiert werden .

Dies mag ein Bereich sein, der etwas über dem neuesten Stand der Technik liegt, aber nicht unmöglich ist.

FelicityC
quelle
-1

Derzeit ist die Dekompilierung lediglich ein Prozess zum Erzeugen eines Hochsprachencodes aus einer bestimmten Binärdatei (Maschinen-, Bytecode usw.), der auf denselben Code zurückgeführt werden kann.

Dieser Prozess wird mehr oder weniger für die Sprachen durchgeführt, die wichtig sind.

Ich glaube nicht, dass es dringend notwendig ist, bessere Dekompilierungswerkzeuge zu generieren, da ich mir nicht einmal sicher bin, wie das helfen würde. Ja, Sie könnten ML anwenden, um mehr menschlich aussehenden Code mit potenziell variablen Namen und Kommentaren zu erhalten, aber das war es auch schon.

Mit zwei Worten: Die aktuellen Bedürfnisse werden erfüllt und eine weitere Entwicklung in diesem Bereich ist nicht gerechtfertigt.

Aleck
quelle