
Skalierbare Assembly-Analyseplattform zur Indexierung, Klonsuche und Klassifikation ausführbarer Dateien mittels statischer, dynamischer und maschineller Lernverfahren für mehrere Architekturen.
Kam1n0 v2.x ist eine skalierbare Plattform zur Verwaltung und Analyse von Assembler-Code. Sie ermöglicht einem Benutzer, zunächst eine (große) Sammlung von Binärdateien in verschiedene Repositories zu indizieren und bietet verschiedene Analysedienste wie Clone-Suche und Klassifizierung. Sie unterstützt Multi-Tenancy-Zugriff und -Verwaltung von Assembly-Repositories durch das Konzept der Application. Eine Anwendungsinstanz enthält ihr eigenes exklusives Repository und bietet einen spezialisierten Analysedienst. Angesichts der Vielseitigkeit von Reverse-Engineering-Aufgaben bietet der Kam1n0 v2.x-Server derzeit drei verschiedene Arten von Clone-Such-Anwendungen: Asm-Clone, Sym1n0 und Asm2Vec, sowie eine Klassifizierung ausführbarer Dateien auf Basis von Asm2Vec. Neue Anwendungstypen können der Plattform hinzugefügt werden.
Ein Benutzer kann mehrere Anwendungsinstanzen erstellen. Eine Anwendungsinstanz kann mit einer bestimmten Gruppe von Benutzern geteilt werden. Der Lese-/Schreibzugriff auf das Anwendungs-Repository und der Ein-/Aus-Status können vom Anwendungsbesitzer gesteuert werden. Der Kam1n0 v2.x-Server kann die Anwendungen gleichzeitig über mehrere gemeinsam genutzte Ressourcenpools bedienen.
Kam1n0 wurde von Steven H. H. Ding und Miles Q. Li unter der Leitung von Benjamin C. M. Fung vom Data Mining and Security Lab an der McGill University in Kanada entwickelt. Es gewann den zweiten Preis beim Hex-Rays Plug-In Contest 2015. Wenn Sie Kam1n0 nützlich finden, zitieren Sie bitte unsere Arbeiten:
S. H. H. Ding, B. C. M. Fung, and P. Charland. Kam1n0: MapReduce-based Assembly Clone Search for Reverse Engineering. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (SIGKDD), pages 461-470, San Francisco, CA: ACM Press, August 2016.
S. H. H. Ding, B. C. M. Fung, and P. Charland. Asm2Vec: boosting static representation robustness for binary clone search against code obfuscation and compiler optimization. In Proceedings of the 40th IEEE Symposium on Security and Privacy (S&P), 18 pages, San Francisco, CA: IEEE Computer Society, May 2019.
Asm-Clone-Anwendungen versuchen, das effiziente Subgraph-Suchproblem (d.h. das Graph-Isomorphieproblem) für Assembler-Funktionen zu lösen (durchschnittliche Abfragezeit <1,3s und durchschnittliche Indexzeit <30ms bei 2,3 Mio. Funktionen). Bei einer gegebenen Zielfunktion (links im Bild) kann es die geklonten Subgraphen unter anderen Funktionen im Repository identifizieren (rechts im Bild).
Semantische Clone-Suche durch differenziertes Fuzz-Testing und Constraint-Lösung. Ein effizienter und skalierbarer dynamisch-statischer hybrider Ansatz (durchschnittliche Abfragezeit <1s, durchschnittliche Indexzeit <100ms bei 1,5 Mio. Funktionen). Bei einer gegebenen Zielfunktion (links im Bild) kann das geklonte Subgraphen unter anderen Funktionen im Repository identifiziert werden (rechts im Bild). Unterstützt Visualisierung von abstrakten Syntaxgraphen.
Asm2Vec nutzt Repräsentationslernen. Es versteht die lexikalisch-semantische Beziehung von Assemblercode. Zum Beispiel sind xmm*-Register semantisch mit Vektoroperationen wie addps verwandt. memcpy ist ähnlich wie strcpy. Die Grafik unten zeigt verschiedene Assemblerfunktionen, die aus demselben Quellcode von gmpz_tdiv_r_2exp in libgmp kompiliert wurden. Von links nach rechts sind die Assemblerfunktionen mit GCC O0-Option, GCC O3-Option, O-LLVM-Obfuscator Control Flow Graph, Flattening-Option und LLVM-Obfuscator Bogus Control Flow Graph-Option kompiliert. Asm2Vec kann sie statisch als Klone identifizieren.
In dieser Anwendung definiert der Benutzer eine Reihe von Softwareklassen, die auf funktionaler Verwandtschaft basieren, und stellt Binärdateien bereit, die zu jeder Klasse gehören. Dann gruppiert das System automatisch Funktionen in Cluster, in denen Funktionen direkt oder indirekt durch eine Clone-Beziehung verbunden sind. Die Cluster, die für die Klassifizierung diskriminierend sind, werden beibehalten und dienen als Signaturen ihrer Klassen. Bei einer gegebenen Ziel-Binärdatei zeigt das System den Grad an, zu dem es zu jeder Softwareklasse gehört.
Verwendet Asm2Vec als Berechnungsmodell für Funktionsähnlichkeit
Die folgende Abbildung zeigt die wichtigsten UI-Komponenten und Funktionen von Kam1n0 v2.x. Wir verwenden ein Material Design. Im Allgemeinen hat jeder Benutzer eine Anwendungsliste, eine Liste laufender Aufträge und eine Ergebnisdateiliste.
Die aktuelle Version von Kam1n0 besteht aus zwei Installationsprogrammen: dem Kernserver und dem IDA Pro-Plug-in.
| Installationsprogramm | Enthaltene Komponenten | Beschreibung |
|---|---|---|
| Kam1n0-Server.msi | Kern-Engine | Haupt-Engine, die Dienste für Indizierung und Suche bereitstellt. |
| Workbench | Eine Benutzeroberfläche zur Verwaltung der Repositories und des laufenden Dienstes. | |
| Web-Benutzeroberfläche | Web-Benutzeroberfläche zum Suchen/Indizieren von Binärdateien und Assemblerfunktionen. | |
| Visual C++ Redistributable für VS 15 | Abhängigkeit für z3. | |
| Kam1n0-IDA-Plugin.msi | Plug-in | Verbindungsstücke und Benutzeroberfläche. |
| PyPI-Räder für Cefpython | Rendering-Engine für die Benutzeroberfläche. | |
| PyPI und abhängige Räder | Paketverwaltung für Python. Enthalten für IDA 6.8 & 6.9. |
Die Kam1n0-Kern-Engine ist vollständig in Java geschrieben. Sie benötigen die folgenden Abhängigkeiten:
Laden Sie die Datei Kam1n0-Server.msi von unserer Release-Seite herunter. Folgen Sie den Anweisungen zur Installation des Servers. Sie werden aufgefordert, einen Installationspfad auszuwählen. IDA Pro ist optional, wenn der Server sich nicht mit dem Disassemblieren befassen muss. Mit anderen Worten: Die Client-Seite verwendet das Kam1n0-Plug-in für IDA Pro. Es wird dringend empfohlen, IDA Pro zusammen mit dem Kam1n0-Server zu installieren. Der Kam1n0-Server erkennt Ihre IDA Pro automatisch, indem er nach der Standardanwendung sucht, die Sie zum Öffnen von .i64-Dateien verwenden.
Das Kam1n0 IDA Pro-Plug-in ist in Python für die Logik und in HTML/JavaScript für die Darstellung geschrieben. Für die Installation sind die folgenden Abhängigkeiten erforderlich:
Laden Sie als Nächstes den Installer Kam1n0-IDA-Plugin.msi von unserer Release-Seite herunter. Folgen Sie den Anweisungen zur Installation des Plug-ins und der Laufzeit. Bitte beachten Sie, dass das Plug-in im IDA Pro-Plugins-Ordner installiert werden muss, der sich unter $IDA_PRO_PATH$/plugins befindet. Beispielsweise könnte der Pfad unter Windows C:/Program Files (x86)/IDA 6.95/plugins lauten. Der Installer erkennt und validiert den Pfad.
Stellen Sie sicher, dass Sie die Oracle Version von Java 11 haben. (Nicht default-jdk in apt.)
sudo add-apt-repository ppa:webupd8team/java
~webupd8team not found), stellen Sie bei Verwendung eines Proxys sicher, dass Sie Ihre Umgebungsvariablen http_proxy und https_proxy setzen und exportieren, und versuchen Sie es dann erneut mit der Option -E bei sudo. Wenn Sie außerdem einen Befehl 'add-apt repository not found error' erhalten, versuchen Sie: sudo apt install -y software-properties-common.sudo apt-get update und sudo apt-get install oracle-java8-installer
java -version; Sie müssen möglicherweise die Umgebungsvariable JAVA_HOME manuell setzen (in /etc/environment), JAVA_HOME=/usr/lib/jvm/java-11-oracleLaden Sie die neueste Version für Linux (Kam1n0-IDA-Plugin.tar.gz und Kam1n0-Server.tar.gz) von Kam1n0-Community herunter.
Entpacken Sie die zwei Tarballs (d.h. tar –xvzf Kam1n0-IDA-Plugin.tar.gz und tar –xvzf Kam1n0-Server.tar.gz)
Die Datei Kam1n0-Server.tar.gz erstellt das Server-Verzeichnis.
Innerhalb des server-Verzeichnisses sollten Sie eine Datei namens kam1n0.properties sehen, in der Sie verschiedene Konfigurationen für kam1n0 festlegen; dies ist sehr wichtig.
Setzen Sie kam1n0.data.path auf den Ort, an dem Ihre kam1n0-bezogenen Daten geschrieben werden sollen. Wir wählen, es am gleichen Ort wie unser server zu platzieren. kam1n0.ida.home bezieht sich darauf, wo Ihre IDA-Installation ist. Kommentieren Sie diese Zeile (und die folgende Zeile kam1n0.ida.batch) aus, wenn Sie kein IDA haben und kam1n0 nicht für die Disassemblierung verwenden möchten. Weitere (genaue) Informationen zur Datei kam1n0.properties finden Sie in der Datei kam1n0.properties.explained.
Führen Sie kam1n0-server-workbench aus: java -jar kam1n0-server-workbench.jar. Dies sollte ein Fenster öffnen, das Sie auffordert, kam1n0 tatsächlich zu starten. Alternativ führen Sie kam1n0-server aus: java -jar kam1n0-server.jar --start. Dadurch wird der Server von der Konsole aus ohne Fenster gestartet.
Um eine Verbindung herzustellen und es zu verwenden, gehen Sie in Ihrem Browser zu 127.0.0.1:8571 (der Standardport, den kam1n0 überwacht, sollte 8571 sein, kann aber in kam1n0.properties geändert werden). Sie sollten die schöne Web-UI von kam1n0 sehen. Folgen Sie dann dem Tutorial im Kam1n0-Community-Repository, wenn Sie nicht wissen, wie man kam1n0 verwendet.
Die Assembly-Code-Repositories und Konfigurationsdateien, die in früheren Versionen (<2.0.0) verwendet wurden, werden von der neuesten Version nicht mehr unterstützt. Bitte kontaktieren Sie uns, wenn Sie Ihre alten Repositories migrieren müssen.
Klonen Sie den neuesten stabilen Branch (vergessen Sie nicht --recursive!):```bash
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
## Importieren des Projekts.
IntelliJ: Importieren Sie das Root-Verzeichnis /kam1n0/kam1n0/ als Maven-Projekt. Alle Submodule werden entsprechend geladen.
EclipseEE: Fügen Sie das geklonte Git-Repository zur Git-Ansicht hinzu. Importieren Sie alle Maven-Projekte aus dem Git-Repository.
Möglicherweise müssen Sie den Classpath anpassen, um eventuelle Fehler zu beheben.
Alle Ressourcenpfade werden dynamisch geändert, wenn innerhalb einer IDE ausgeführt wird
(über das Submodul kam1n0-resources).
So erstellen Sie das Projekt:```
cd /kam1n0/kam1n0
mvn -DskipTests clean package
mvn -DskipTests package
Die resultierenden Binärdateien befinden sich in /kam1n0/build-bins/
Um den Testcode auszuführen, müssen Sie zuerst chromedriver.exe von http://chromedriver.chromium.org/ herunterladen und seinen absoluten Pfad in eine Umgebungsvariable namens webdriver.chrome.driver einfügen. Es wird außerdem vorausgesetzt, dass ein Chrome-Browser im System installiert ist. Der Testcode startet eine Browser-Instanz, um die UI-Schnittstellen zu testen. Der gesamte Testvorgang dauert etwa 3 Stunden.```
cd /kam1n0/kam1n0
mvn -DskipTests clean package # you can skip this one if you already built the package
mvn -DskipTests package # you can skip this one if you already built the package
mvn -DforkMode=never test
Diese Befehle kompilieren Java nur mit vorkompilierten Wheels von libvex und z3. Es funktioniert sofort.
Der Build von libvex und z3 ist plattformabhängig. Wir verwenden einen Fork von libvex von Angr.
Weitere ernsthafte Build-Skripte sowie Installationsprogramme für Windows/Linux finden Sie unter /kam1n0-builds/
* kam1n0: Der Quellcode des Servers.
* kam1n0-builds: Installationsquellcode und Skripte zum Erstellen der Distribution.
* kam1n0-clients: Der Quellcode der Clients.
## Binäre Veröffentlichungen
Wir haben einen Jenkin-Server für kontinuierliche Entwicklung und Auslieferung. Die neueste stabile Version wird hier veröffentlicht. Regelmäßig werden wir unseren internen experimentellen Zweig mit diesem Repository synchronisieren.
## Lizenzierung
Die Software wurde entwickelt von [Steven H. H. Ding](http://stevending.net/), [Miles Q. Li](http://milesqli.github.io/), und [Benjamin C. M. Fung](http://dmas.lab.mcgill.ca/fung/) im [McGill Data Mining and Security Lab](http://dmas.lab.mcgill.ca/) und [Queen's L1NNA Research Laboratory](https://l1nna.com/) in Kanada. Es wird unter der Apache License Version 2.0 vertrieben. Einzelheiten finden Sie in [LICENSE.txt](https://github.com/mcgill-dmas/kam1n0-community/blob/master2.x/LICENSE.txt).
Urheberrecht 2014-2021 McGill University und die Forscher. Alle Rechte vorbehalten.
## Danksagung
-orange.svg?style=for-the-badge)




