
Масштабируемая платформа анализа ассемблерного кода для индексации, поиска клонов и классификации исполняемых файлов с использованием статических, динамических и методов машинного обучения для нескольких архитектур.
Kam1n0 v2.x — это масштабируемая платформа для управления и анализа ассемблерного кода. Она позволяет пользователю сначала проиндексировать (большую) коллекцию бинарных файлов в различные репозитории, а затем предоставляет различные аналитические сервисы, такие как поиск клонов и классификация. Платформа поддерживает многопользовательский доступ и управление репозиториями ассемблерного кода с помощью концепции Приложения (Application). Экземпляр приложения содержит собственный эксклюзивный репозиторий и предоставляет специализированный аналитический сервис. Учитывая разнообразие задач обратной разработки, сервер Kam1n0 v2.x в настоящее время предоставляет три различных типа приложений для поиска клонов: Asm-Clone, Sym1n0 и Asm2Vec, а также классификацию исполняемых файлов на основе Asm2Vec. К платформе могут быть добавлены новые типы приложений.
Пользователь может создавать несколько экземпляров приложений. Экземпляр приложения может быть предоставлен для совместного использования определённой группе пользователей. Доступ на чтение/запись к репозиторию приложения и его статус (включён/выключен) могут контролироваться владельцем приложения. Сервер Kam1n0 v2.x может обслуживать приложения одновременно, используя несколько общих пулов ресурсов.
Kam1n0 был разработан Steven H. H. Ding и Miles Q. Li под руководством Benjamin C. M. Fung из Лаборатории интеллектуального анализа данных и безопасности при Университете Макгилла, Канада. Он занял второе место в конкурсе плагинов Hex-Rays 2015. Если вы считаете Kam1n0 полезным, пожалуйста, процитируйте нашу работу:
S. H. H. Ding, B. C. M. Fung, and P. Charland. Kam1n0: MapReduce-based Assembly Clone Search for Reverse Engineering. В Трудах 22-й Международной конференции ACM SIGKDD по открытию знаний и интеллектуальному анализу данных (SIGKDD), стр. 461-470, Сан-Франциско, Калифорния: ACM Press, август 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. В Трудах 40-го симпозиума IEEE по безопасности и конфиденциальности (S&P), 18 стр., Сан-Франциско, Калифорния: IEEE Computer Society, май 2019.
Приложения Asm-Clone решают задачу эффективного поиска подграфов (т.е. проблему изоморфизма графов) для функций ассемблерного кода (среднее время запроса <1,3 с, среднее время индексации <30 мс для 2,3 млн функций). По заданной целевой функции (показана слева на рисунке ниже) определяется её клонированный подграф среди других функций в репозитории (показан справа).
Семантический поиск клонов с помощью дифференцированного фаззинга и решения ограничений. Эффективный и масштабируемый динамико-статический гибридный подход (среднее время запроса <1 с, среднее время индексации <100 мс для 1,5 млн функций). По заданной целевой функции (показана слева на рисунке ниже) определяется клонированный подграф среди других функций в репозитории (показан справа). Поддерживает визуализацию абстрактного синтаксического графа.
Asm2Vec использует обучение представлениям. Он понимает лексико-семантические связи ассемблерного кода. Например, регистры xmm* семантически связаны с векторными операциями, такими как addps. memcpy аналогичен strcpy. На графике ниже показаны различные ассемблерные функции, скомпилированные из одного и того же исходного кода gmpz_tdiv_r_2exp в libgmp. Слева направо: функции скомпилированы с опциями GCC O0, GCC O3, O-LLVM обфускатором (с уплощением графа управления) и LLVM обфускатором (с ложным графом управления). Asm2Vec может статически идентифицировать их как клоны.
В этом приложении пользователь определяет набор классов программного обеспечения на основе функциональной связанности и предоставляет бинарные файлы, принадлежащие каждому классу. Затем система автоматически группирует функции в кластеры, в которых функции связаны прямо или косвенно отношением клонирования. Кластеры, которые являются дискриминативными для классификации, сохраняются и служат сигнатурами своих классов. По заданному бинарному файлу система показывает степень его принадлежности к каждому классу программного обеспечения.
Использует Asm2Vec в качестве модели вычисления подобия функций
На рисунке ниже показаны основные компоненты и функции пользовательского интерфейса Kam1n0 v2.x. Мы используем материальный дизайн. В общем случае каждый пользователь имеет список приложений, список выполняемых заданий и список файлов результатов.
Более подробную информацию о дизайне пользовательского интерфейса можно найти в нашем подробном учебном пособии.
Текущий релиз Kam1n0 состоит из двух установщиков: основной сервер и плагин для IDA Pro.
Основной движок Kam1n0 полностью написан на Java. Вам понадобятся следующие зависимости:
Скачайте файл Kam1n0-Server.msi со страницы релизов. Следуйте инструкциям для установки сервера. Вас попросят выбрать путь установки. IDA Pro является опциональной, если серверу не нужно выполнять дизассемблирование. Другими словами, клиентская сторона использует плагин Kam1n0 для IDA Pro. Настоятельно рекомендуется установить IDA Pro вместе с сервером Kam1n0. Сервер Kam1n0 автоматически обнаружит IDA Pro, найдя приложение по умолчанию, используемое для открытия файлов .i64.
Плагин Kam1n0 для IDA Pro написан на Python (логика) и HTML/JavaScript (отрисовка). Для его установки необходимы следующие зависимости:
Затем скачайте установщик Kam1n0-IDA-Plugin.msi со страницы релизов. Следуйте инструкциям для установки плагина и среды выполнения. Обратите внимание, что плагин должен быть установлен в папку плагинов IDA Pro, расположенную по адресу $IDA_PRO_PATH$/plugins. Например, в Windows путь может быть C:/Program Files (x86)/IDA 6.95/plugins. Установщик обнаружит и проверит путь.
Убедитесь, что у вас установлена версия Java 11 от Oracle (не default-jdk из apt).
sudo add-apt-repository ppa:webupd8team/java
~webupd8team not found) и вы используете прокси, убедитесь, что установлены и экспортированы переменные окружения http_proxy и https_proxy, затем повторите попытку с опцией -E для sudo. Кроме того, если возникает ошибка «add-apt repository command not found», попробуйте: sudo apt install -y software-properties-common.sudo apt-get update и sudo apt-get install oracle-java8-installer
java -version; возможно, потребуется вручную задать переменную окружения JAVA_HOME (в /etc/environment): JAVA_HOME=/usr/lib/jvm/java-11-oracle.Репозитории ассемблерного кода и файлы конфигурации, использовавшиеся в предыдущих версиях (<2.0.0), больше не поддерживаются последней версией. Пожалуйста, свяжитесь с нами, если вам потребуется перенести старые репозитории.
Клонируйте последнюю стабильную ветку (не забудьте --recursive!):```bash
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
## Импорт проекта.
IntelliJ: Импортируйте корневой каталог /kam1n0/kam1n0/ как проект Maven. Все подмодули будут загружены соответствующим образом.
EclipseEE: Добавьте клонированный репозиторий Git в представление Git. Импортируйте все проекты Maven из репозитория Git.
Возможно, потребуется изменить classpath, чтобы устранить ошибки.
Все пути к ресурсам динамически изменяются при запуске внутри IDE (через подмодуль kam1n0-resources).
Для сборки проекта:```
cd /kam1n0/kam1n0
mvn -DskipTests clean package
mvn -DskipTests package
The resulting binaries can be found in /kam1n0/build-bins/
Для запуска тестового кода необходимо сначала загрузить chromedriver.exe с http://chromedriver.chromium.org/ и добавить его абсолютный путь в переменную среды с именем webdriver.chrome.driver. Также требуется, чтобы в системе был установлен браузер Chrome. Тестовый код запустит экземпляр браузера для тестирования интерфейсов пользователя. Полный процесс тестирования займет примерно 3 часа.```
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
Эти команды только компилируют Java с предварительно скомпилированными wheels libvex и z3. Это работает из коробки.
Сборка libvex и z3 зависит от платформы. Мы используем форк libvex от Angr.
Более серьёзные скрипты сборки, а также установщики для Windows/Linux можно найти в /kam1n0-builds/
* kam1n0: Исходный код сервера.
* kam1n0-builds: Исходный код установщика и скрипты для сборки дистрибутива.
* kam1n0-clients: Исходный код клиентов.
## Бинарные релизы
У нас есть сервер Jenkin для непрерывной разработки и доставки. Последний стабильный релиз будет опубликован здесь. Периодически мы будем синхронизировать нашу внутреннюю экспериментальную ветку с этим репозиторием.
## Лицензирование
Программное обеспечение разработано [Steven H. H. Ding](http://stevending.net/), [Miles Q. Li](http://milesqli.github.io/), и [Benjamin C. M. Fung](http://dmas.lab.mcgill.ca/fung/) в [McGill Data Mining and Security Lab](http://dmas.lab.mcgill.ca/) и [Queen's L1NNA Research Laboratory](https://l1nna.com/) в Канаде. Оно распространяется под лицензией Apache License Version 2.0. Подробности см. в [LICENSE.txt](https://github.com/mcgill-dmas/kam1n0-community/blob/HEAD/LICENSE.txt).
Copyright 2014-2021 McGill University и исследователи. Все права защищены.
## Благодарности
-orange.svg?style=for-the-badge)





| Установщик | Включённые компоненты | Описание |
|---|---|---|
| Kam1n0-Server.msi | Основной движок | Основной движок, предоставляющий сервис для индексации и поиска. |
| Workbench | Пользовательский интерфейс для управления репозиториями и запущенным сервисом. | |
| Веб-интерфейс пользователя | Веб-интерфейс для поиска/индексации бинарных файлов и функций ассемблерного кода. | |
| Распространяемый компонент Visual C++ для VS 15 | Зависимость для z3. | |
| Kam1n0-IDA-Plugin.msi | Плагин | Коннекторы и пользовательский интерфейс. |
| Колёса PyPI для Cefpython | Рендеринг движка пользовательского интерфейса. | |
| Колёса PyPI и зависимые колёса | Управление пакетами Python. Включено для IDA 6.8 и 6.9. |
Скачайте последнюю версию для Linux (Kam1n0-IDA-Plugin.tar.gz и Kam1n0-Server.tar.gz) со страницы Kam1n0-Community.
Распакуйте два архива (например, tar –xvzf Kam1n0-IDA-Plugin.tar.gz и tar –xvzf Kam1n0-Server.tar.gz).
Файл Kam1n0-Server.tar.gz создаст директорию сервера.
Внутри каталога server вы увидите файл kam1n0.properties, в котором задаются различные настройки; это очень важно.
Установите kam1n0.data.path в место, куда вы хотите записывать данные, связанные с Kam1n0. Мы советуем разместить его там же, где и server. kam1n0.ida.home указывает на расположение вашей установки IDA. Закомментируйте эту строку (а также следующую kam1n0.ida.batch), если у вас нет IDA и вы не планируете использовать Kam1n0 для дизассемблирования. Дополнительную (точную) информацию о файле kam1n0.properties см. в файле kam1n0.properties.explained.
Запустите workbench сервера Kam1n0: java -jar kam1n0-server-workbench.jar. Это должно открыть окно с предложением запустить Kam1n0. Альтернативно, запустите сервер: java -jar kam1n0-server.jar --start. Это запускает сервер из консоли без графического окна.
Для подключения и использования перейдите в браузере по адресу 127.0.0.1:8571 (порт по умолчанию, который слушает Kam1n0, обычно 8571, но его можно изменить в kam1n0.properties). Вы увидите веб-интерфейс Kam1n0. Затем следуйте учебному пособию из репозитория Kam1n0-Community, если вы не знаете, как пользоваться Kam1n0.