
Plataforma de análisis de ensamblado escalable para indexación, búsqueda de clones y clasificación de ejecutables mediante técnicas estáticas, dinámicas y de aprendizaje automático en múltiples arquitecturas.
Kam1n0 v2.x es una plataforma escalable de gestión y análisis de ensamblador. Permite a un usuario indexar primero una colección (grande) de binarios en diferentes repositorios y proporcionar diferentes servicios analíticos como la búsqueda de clones y la clasificación. Soporta acceso multiinquilino y gestión de repositorios de ensamblador mediante el concepto de Aplicación. Una instancia de aplicación contiene su propio repositorio exclusivo y proporciona un servicio analítico especializado. Considerando la versatilidad de las tareas de ingeniería inversa, el servidor Kam1n0 v2.x actualmente proporciona tres tipos diferentes de aplicaciones de búsqueda de clones: Asm-Clone, Sym1n0 y Asm2Vec, y una clasificación de ejecutables basada en Asm2Vec. Se pueden añadir nuevos tipos de aplicación a la plataforma.
Un usuario puede crear múltiples instancias de aplicación. Una instancia de aplicación se puede compartir entre un grupo específico de usuarios. El acceso de lectura-escritura al repositorio de la aplicación y su estado de activación/desactivación pueden ser controlados por el propietario de la aplicación. El servidor Kam1n0 v2.x puede atender las aplicaciones concurrentemente utilizando varios grupos de recursos compartidos.
Kam1n0 fue desarrollado por Steven H. H. Ding y Miles Q. Li bajo la supervisión de Benjamin C. M. Fung del Data Mining and Security Lab de la Universidad McGill en Canadá. Ganó el segundo premio en el Hex-Rays Plug-In Contest 2015. Si encuentra Kam1n0 útil, por favor cite nuestro artículo:
S. H. H. Ding, B. C. M. Fung, y P. Charland. Kam1n0: MapReduce-based Assembly Clone Search for Reverse Engineering. En Proceedings of the 22nd ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (SIGKDD), páginas 461-470, San Francisco, CA: ACM Press, agosto 2016.
S. H. H. Ding, B. C. M. Fung, y P. Charland. Asm2Vec: boosting static representation robustness for binary clone search against code obfuscation and compiler optimization. En Proceedings of the 40th IEEE Symposium on Security and Privacy (S&P), 18 páginas, San Francisco, CA: IEEE Computer Society, mayo 2019.
Las aplicaciones Asm-Clone intentan resolver el problema de búsqueda eficiente de subgrafos (es decir, el problema de isomorfismo de grafos) para funciones de ensamblador (tiempo promedio de consulta <1.3 s y tiempo promedio de indexación <30 ms con 2.3M funciones). Dada una función objetivo (la de la izquierda como se muestra a continuación), puede identificar los subgrafos clonados entre otras funciones en el repositorio (el de la derecha como se muestra a continuación).
Búsqueda de clones semántica mediante pruebas de fuzzing diferenciadas y resolución de restricciones. Un enfoque híbrido dinámico-estático eficiente y escalable (tiempo promedio de consulta <1 s y tiempo promedio de indexación <100 ms con 1.5M funciones). Dada una función objetivo (la de la izquierda como se muestra a continuación), puede identificar los subgrafos clonados entre otras funciones en el repositorio (el de la derecha como se muestra a continuación). Soporta visualización del grafo de sintaxis abstracta.
Asm2Vec aprovecha el aprendizaje de representaciones. Comprende la relación semántica léxica del código ensamblador. Por ejemplo, los registros xmm* están semánticamente relacionados con operaciones vectoriales como addps. memcpy es similar a strcpy. El gráfico a continuación muestra diferentes funciones de ensamblador compiladas a partir del mismo código fuente de gmpz_tdiv_r_2exp en libgmp. De izquierda a derecha, las funciones de ensamblador se compilan con la opción GCC O0, la opción GCC O3, la opción de aplanamiento del grafo de flujo de control del ofuscador O-LLVM y la opción de grafo de flujo de control falso del ofuscador LLVM. Asm2Vec puede identificarlas estáticamente como clones.
En esta aplicación, el usuario define un conjunto de clases de software basadas en la relación funcional y proporciona binarios que pertenecen a cada clase. Luego, el sistema agrupa automáticamente las funciones en clústeres en los que las funciones están conectadas directa o indirectamente por una relación de clon. Los clústeres que son discriminativos para la clasificación se mantienen y sirven como firmas de sus clases. Dado un binario objetivo, el sistema muestra el grado en que pertenece a cada clase de software.
Utiliza Asm2Vec como modelo de cálculo de similitud de funciones.
La figura a continuación muestra los principales componentes de la interfaz de usuario y las funcionalidades de Kam1n0 v2.x. Adoptamos un diseño material. En general, cada usuario tiene una lista de aplicaciones, una lista de trabajos en ejecución y una lista de archivos de resultados.
La versión actual de Kam1n0 consta de dos instaladores: el servidor central y el complemento de IDA Pro.
El motor central de Kam1n0 está escrito puramente en Java. Necesita las siguientes dependencias:
Descargue el archivo Kam1n0-Server.msi desde nuestra página de versiones. Siga las instrucciones para instalar el servidor. Se le solicitará que seleccione una ruta de instalación. IDA Pro es opcional si el servidor no tiene que lidiar con ningún desensamblado. En otras palabras, el lado del cliente usa el complemento Kam1n0 para IDA Pro. Se recomienda firmemente tener instalado IDA Pro con el servidor Kam1n0. El servidor Kam1n0 detectará automáticamente su IDA Pro buscando la aplicación predeterminada que usó para abrir archivos .i64.
El complemento de Kam1n0 para IDA Pro está escrito en Python para la lógica y en HTML/JavaScript para el renderizado. Se requieren las siguientes dependencias para su instalación:
A continuación, descargue el instalador Kam1n0-IDA-Plugin.msi desde nuestra página de versiones. Siga las instrucciones para instalar el complemento y el tiempo de ejecución. Tenga en cuenta que el complemento debe instalarse en la carpeta de complementos de IDA Pro, ubicada en $IDA_PRO_PATH$/plugins. Por ejemplo, en Windows, la ruta podría ser C:/Program Files (x86)/IDA 6.95/plugins. El instalador detectará y validará la ruta.
Asegúrese de tener la versión Oracle de Java 11. (No default-jdk en apt).
sudo add-apt-repository ppa:webupd8team/java
~webupd8team not found), si está usando un proxy, asegúrese de establecer y exportar sus variables de entorno http_proxy y https_proxy, y luego intente nuevamente con la opción -E en sudo. Además, si recibe un error de 'add-apt repository command not found', intente: sudo apt install -y software-properties-common.sudo apt-get update, y sudo apt-get install oracle-java8-installer
java -version; es posible que deba establecer manualmente la variable de entorno JAVA_HOME (en /etc/environment), JAVA_HOME=/usr/lib/jvm/java-11-oracleLos repositorios de código ensamblador y los archivos de configuración utilizados en versiones anteriores (<2.0.0) ya no son compatibles con la última versión. Póngase en contacto con nosotros si necesita migrar sus repositorios antiguos.
Clone la última rama estable (¡no olvide --recursive!):```bash
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
## Importando el proyecto.
IntelliJ: Importa la raíz /kam1n0/kam1n0/ como un proyecto Maven. Todos los submódulos se cargarán en consecuencia.
EclipseEE: Agrega el repositorio clonado de git a la vista de git. Importa todos los proyectos Maven desde el repositorio de git.
Puede que necesites modificar el classpath para solucionar cualquier error.
Todas las rutas de recursos se modifican dinámicamente al ejecutarse dentro de un IDE
(a través del submódulo kam1n0-resources).
Para construir el proyecto:```
cd /kam1n0/kam1n0
mvn -DskipTests clean package
mvn -DskipTests package
Los binarios resultantes se pueden encontrar en /kam1n0/build-bins/
Para ejecutar el código de prueba, primero deberá descargar chromedriver.exe desde http://chromedriver.chromium.org/ y agregar su ruta absoluta a una variable de entorno llamada webdriver.chrome.driver. También se requiere que haya un navegador Chrome instalado en el sistema. El código de prueba lanzará una instancia del navegador para probar las interfaces de UI. El procedimiento completo de prueba tomará aproximadamente 3 horas.```
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
Estos comandos solo compilan java con ruedas precompiladas de libvex y z3. Funciona de fábrica.
La compilación de libvex y z3 depende de la plataforma. Usamos un fork de libvex de Angr.
Scripts de compilación más completos, así como instaladores para windows/linux, se pueden encontrar en /kam1n0-builds/
* kam1n0: El código fuente del servidor.
* kam1n0-builds: Código fuente del instalador y scripts para construir la distribución.
* kam1n0-clients: El código fuente de los clientes.
## Binary Releases
Tenemos un servidor Jenkin para desarrollo y entrega continuos. La última versión estable se publicará aquí. Periódicamente sincronizaremos nuestra rama experimental interna con este repositorio.
## Licensing
El software fue desarrollado por [Steven H. H. Ding](http://stevending.net/), [Miles Q. Li](http://milesqli.github.io/) y [Benjamin C. M. Fung](http://dmas.lab.mcgill.ca/fung/) en el [McGill Data Mining and Security Lab](http://dmas.lab.mcgill.ca/) y el [Queen's L1NNA Research Laboratory](https://l1nna.com/) en Canadá. Se distribuye bajo la Licencia Apache Versión 2.0. Consulte [LICENSE.txt](https://github.com/mcgill-dmas/kam1n0-community/blob/HEAD/LICENSE.txt) para obtener más detalles.
Copyright 2014-2021 Universidad McGill y los Investigadores. Todos los derechos reservados.
## Acknowledgement
-orange.svg?style=for-the-badge)





| Instalador | Componentes incluidos | Descripción |
|---|---|---|
| Kam1n0-Server.msi | Motor central | Motor principal que proporciona servicio de indexación y búsqueda. |
| Workbench | Una interfaz de usuario para gestionar los repositorios y el servicio en ejecución. | |
| Interfaz de usuario web | Interfaz de usuario web para buscar/indexar archivos binarios y funciones de ensamblador. | |
| Redistribuible de Visual C++ para VS 15 | Dependencia para z3. | |
| Kam1n0-IDA-Plugin.msi | Complemento | Conectores e interfaz de usuario. |
| Wheels PyPI para Cefpython | Motor de renderizado para la interfaz de usuario. | |
| PyPI y wheels dependientes | Gestión de paquetes para Python. Incluido para IDA 6.8 y 6.9. |
Descargue la última versión para Linux (Kam1n0-IDA-Plugin.tar.gz y Kam1n0-Server.tar.gz) desde Kam1n0-Community.
Extraiga los dos tarballs (es decir, tar –xvzf Kam1n0-IDA-Plugin.tar.gz y tar –xvzf Kam1n0-Server.tar.gz)
El archivo Kam1n0-Server.tar.gz creará el directorio del servidor.
Dentro del directorio server, debería ver un archivo llamado kam1n0.properties, donde establecerá varias configuraciones para kam1n0; esto es muy importante.
Establezca kam1n0.data.path en el lugar donde desea que se escriban los datos relacionados con kam1n0. Elegimos colocarlo en el mismo lugar donde guardamos nuestro server. kam1n0.ida.home se refiere a la ubicación de su instalación de IDA. Comente esta línea (y kam1n0.ida.batch, la línea siguiente) si no tiene IDA y no planea usar kam1n0 para desensamblado. Para obtener más información (precisa) sobre el archivo kam1n0.properties, consulte el archivo kam1n0.properties.explained.
Ejecute kam1n0-server-workbench: java -jar kam1n0-server-workbench.jar. Esto debería abrir una ventana que le solicita iniciar kam1n0. Alternativamente, ejecute kam1n0-server: java -jar kam1n0-server.jar --start. Esto inicia el servidor desde la consola sin ventana.
Para conectarse y usarlo, vaya a 127.0.0.1:8571 (el puerto predeterminado en el que kam1n0 escucha debe ser 8571, pero se puede cambiar en kam1n0.properties) en su navegador. Debería ver la bonita interfaz web de kam1n0. Desde allí, siga el tutorial en el repositorio Kam1n0-Community si no sabe cómo usar kam1n0.