Kam1n0 v2.x ist eine skalierbare Baugruppenverwaltungs- und Analyseplattform. Es ermöglicht einem Benutzer, zunächst eine (große) Sammlung von Binärdateien in verschiedenen Repositorys zu indizieren und verschiedene Analysedienste wie Klonsuche und -klassifizierung bereitzustellen. Es unterstützt den Mandantenzugriff und die Verwaltung von Assembly-Repositorys mithilfe des Anwendungskonzepts . Eine Anwendungsinstanz enthält ihr eigenes exklusives Repository und stellt einen speziellen Analysedienst bereit. Angesichts der Vielseitigkeit von Reverse-Engineering-Aufgaben bietet der Kam1n0 v2.x-Server derzeit drei verschiedene Arten von Klonsuchanwendungen: Asm-Clone , Sym1n0 und Asm2Vec sowie eine ausführbare Klassifizierung basierend auf Asm2Vec . Der Plattform können weitere Anwendungstypen hinzugefügt werden.
Ein Benutzer kann mehrere Anwendungsinstanzen erstellen. Eine Anwendungsinstanz kann von einer bestimmten Benutzergruppe gemeinsam genutzt werden. Der Lese-/Schreibzugriff und der Ein-/Aus-Status des Anwendungs-Repositorys können vom Anwendungseigentümer gesteuert werden. Der Kam1n0 v2.x-Server kann die Anwendungen gleichzeitig über mehrere gemeinsam genutzte Ressourcenpools bedienen.
Kam1n0 wurde von Steven HH Ding und Miles Q. Li unter der Aufsicht von Benjamin CM Fung vom Data Mining and Security Lab 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 unseren Artikel:
SHH Ding, BCM Fung und P. Charland. Kam1n0: MapReduce-basierte Baugruppenklonsuche für Reverse Engineering. In Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (SIGKDD) , Seiten 461-470, San Francisco, CA: ACM Press, August 2016.
SHH Ding, BCM Fung und P. Charland. Asm2Vec: Steigerung der Robustheit der statischen Darstellung für die Suche nach binären Klonen gegen Code-Verschleierung und Compiler-Optimierung. In Proceedings of the 40th IEEE Symposium on Security and Privacy (S&P) , 18 Seiten, San Francisco, CA: IEEE Computer Society, Mai 2019.
Asm-Clone-Anwendungen versuchen, das effiziente Subgraph-Suchproblem (d. h. das Graph-Isomorphismus-Problem) für Assembly-Funktionen zu lösen (<1,3 s durchschnittliche Abfragezeit und <30 ms durchschnittliche Indexzeit mit 2,3 Millionen Funktionen). Bei gegebener Zielfunktion (die linke, wie unten gezeigt) kann sie die geklonten Untergraphen neben anderen Funktionen im Repository identifizieren (die rechte, wie unten gezeigt).
Semantische Klonsuche durch differenziertes Fuzz-Testen und Lösen von Einschränkungen. Ein effizienter und skalierbarer dynamisch-statischer Hybridansatz (<1 s durchschnittliche Abfragezeit und <100 ms durchschnittliche Indexzeit mit 1,5 Millionen Funktionen). Bei gegebener Zielfunktion (die linke, wie unten gezeigt) kann sie die geklonten Untergraphen neben anderen Funktionen im Repository identifizieren (die rechte, wie unten gezeigt). Unterstützt die Visualisierung eines abstrakten Syntaxdiagramms.
Asm2Vec nutzt das Repräsentationslernen. Es versteht die lexikalisch-semantische Beziehung des Assemblercodes. Beispielsweise sind xmm*
-Register semantisch mit Vektoroperationen wie addps
verknüpft. memcpy
ähnelt strcpy
. Die folgende Grafik zeigt verschiedene Assembly-Funktionen, die aus demselben Quellcode von gmpz_tdiv_r_2exp
in libgmp kompiliert wurden. Von links nach rechts werden die Assembly-Funktionen mit der Option GCC O0, der Option GCC O3, der Option O-LLVM Obfuscator Control Flow Graph, der Flattening-Option und der Option LLVM Obfuscator Bogus Control Flow Graph 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 bereit, dass zu jeder Klasse Binärdateien gehören. Anschließend gruppiert das System Funktionen automatisch in Cluster, in denen Funktionen direkt oder indirekt durch Klonbeziehungen verbunden sind. Die für die Klassifizierung diskriminierenden Cluster werden beibehalten und dienen als Signaturen ihrer Klassen. Bei einer gegebenen Zielbinärdatei zeigt das System den Grad ihrer Zugehörigkeit zu jeder Softwareklasse an.
Verwenden Sie Asm2Vec als Funktionsähnlichkeitsberechnungsmodell
Die folgende Abbildung zeigt die wichtigsten UI-Komponenten und Funktionalitäten von Kam1n0 v2.x. Wir übernehmen ein Materialdesign. Im Allgemeinen verfügt jeder Benutzer über eine Anwendungsliste, eine Liste laufender Jobs und eine Liste der Ergebnisdateien.
Die aktuelle Version von Kam1n0 besteht aus zwei Installationsprogrammen: dem Kernserver und dem IDA Pro-Plug-in.
Installateur | Enthaltene Komponenten | Beschreibung |
---|---|---|
Kam1n0-Server.msi | Kernmotor | Hauptmaschine, die Dienste für die Indizierung und Suche bereitstellt. |
Werkbank | Eine Benutzeroberfläche zum Verwalten der Repositorys und des laufenden Dienstes. | |
Web-Benutzeroberfläche | Web-Benutzeroberfläche zum Suchen/Indizieren von Binärdateien und Assembly-Funktionen. | |
Visual C++ weitervertreibbar für VS 15 | Abhängigkeit für z3. | |
Kam1n0-IDA-Plugin.msi | Plug-in | Anschlüsse 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 und 6.9. |
Die Kam1n0-Kern-Engine ist ausschließlich in Java geschrieben. Sie benötigen folgende Abhängigkeiten:
Laden Sie die Datei Kam1n0-Server.msi
von unserer Release-Seite herunter. Befolgen Sie die Anweisungen zur Installation des Servers. Sie werden aufgefordert, einen Installationspfad auszuwählen. IDA Pro ist optional, wenn der Server nicht zerlegt werden muss. Mit anderen Worten: Die Clientseite verwendet das Kam1n0-Plugin für IDA Pro. Es wird dringend empfohlen, IDA Pro mit dem Kam1n0-Server zu installieren. Der Kam1n0-Server erkennt Ihr IDA Pro automatisch, indem er nach der Standardanwendung sucht, die Sie zum Öffnen .i64
Datei verwendet haben.
Das Kam1n0 IDA Pro-Plug-in ist für die Logik in Python und für das Rendering in HTML/JavaScript geschrieben. Für die Installation sind folgende Abhängigkeiten erforderlich:
Laden Sie als Nächstes das Kam1n0-IDA-Plugin.msi
-Installationsprogramm von unserer Release-Seite herunter. Befolgen Sie die Anweisungen, um das Plug-in und die Laufzeit zu installieren. Bitte beachten Sie, dass das Plug-in im IDA Pro-Plugin-Ordner installiert werden muss, der sich unter $IDA_PRO_PATH$/plugins
befindet. Unter Windows könnte der Pfad beispielsweise C:/Program Files (x86)/IDA 6.95/plugins
lauten. Das Installationsprogramm erkennt und validiert den Pfad.
Stellen Sie sicher, dass Sie über die Oracle- Version von Java 11 verfügen. (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
festlegen und exportieren, und versuchen Sie es dann erneut mit der Option -E
in sudo. Wenn Sie außerdem die Fehlermeldung „Add-apt-Repository-Befehl nicht gefunden“ erhalten, versuchen Sie Folgendes: sudo apt install -y software-properties-common
.sudo apt-get update
und sudo apt-get install oracle-java8-installer
java -version
; Möglicherweise müssen Sie die Umgebungsvariable JAVA_HOME manuell festlegen (in /etc/environment
), JAVA_HOME=/usr/lib/jvm/java-11-oracle
Laden Sie die neueste Version für Linux (Kam1n0-IDA-Plugin.tar.gz und Kam1n0-Server.tar.gz) von der Kam1n0-Community herunter.
Extrahieren Sie die beiden 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 Serververzeichnis.
Im server
sollten Sie eine Datei namens kam1n0.properties
sehen, in der Sie verschiedene Konfigurationen für kam1n0 festlegen. das ist sehr wichtig.
Legen Sie kam1n0.data.path
auf den Ort fest, an den Ihre kam1n0-bezogenen Daten geschrieben werden sollen. Wir entscheiden uns dafür, es an demselben Ort zu platzieren, an dem wir auch unseren server
aufbewahren. kam1n0.ida.home
bezieht sich auf den Speicherort Ihrer IDA-Installation. Kommentieren Sie diese Zeile (und kam1n0.ida.batch
, die folgende Zeile), wenn Sie nicht über IDA verfügen und nicht vorhaben, kam1n0 für die Demontage zu verwenden. 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
. Dadurch sollte ein Fenster erscheinen, 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 ohne Fenster von der Konsole aus 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 hübsche Web-Benutzeroberfläche von kam1n0 sehen. Folgen Sie von dort aus dem Tutorial im Kam1n0-Community-Repo, wenn Sie nicht wissen, wie man kam1n0 verwendet.
Die in früheren Versionen (<2.0.0) verwendeten Assemblercode-Repositorys und Konfigurationsdateien 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 Zweig (vergessen Sie nicht --recursive
!):
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
IntelliJ: Importieren Sie das Stammverzeichnis /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 Klassenpfad ändern, um etwaige Fehler zu beheben. Der gesamte Ressourcenpfad wird dynamisch geändert, wenn er in 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 finden Sie in /kam1n0/build-bins/
Um den Testcode auszuführen, müssen Sie zunächst chromedriver.exe
von http://chromedriver.chromium.org/ herunterladen und seinen absoluten Pfad in eine Umgebungsvariable namens webdriver.chrome.driver
einfügen. Es ist außerdem erforderlich, dass auf dem System ein Chrome-Browser installiert ist. Der Testcode startet eine Browserinstanz, um die UI-Schnittstellen zu testen. Der komplette Testvorgang dauert ca. 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 Rädern von libvex und z3. Es funktioniert sofort. Der Build von libvex und z3 ist plattformabhängig. Wir verwenden einen libvex-Fork von Angr. Seriösere Build-Skripte sowie Installer für Windows/Linux finden Sie unter /kam1n0-builds/
Wir verfügen über einen Jenkin-Server für die kontinuierliche Entwicklung und Bereitstellung. Die neueste stabile Version wird hier veröffentlicht. In regelmäßigen Abständen werden wir unseren internen experimentellen Zweig mit diesem Repository synchronisieren.
Die Software wurde von Steven HH Ding, Miles Q. Li und Benjamin CM Fung im McGill Data Mining and Security Lab und im Queen's L1NNA Research Laboratory in Kanada entwickelt. Es wird unter der Apache-Lizenz Version 2.0 vertrieben. Weitere Informationen finden Sie in LICENSE.txt.
Copyright 2014-2021 McGill University und die Forscher. Alle Rechte vorbehalten.