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.