
Plataforma escalável de análise de assembly para indexação, busca de clones e classificação de executáveis usando técnicas estáticas, dinâmicas e de aprendizado de máquina em múltiplas arquiteturas.
Kam1n0 v2.x é uma plataforma escalável de gerenciamento e análise de assembly. Ela permite que um usuário primeiro indexe uma coleção (grande) de binários em diferentes repositórios e forneça diferentes serviços analíticos, como pesquisa de clones e classificação. Ela suporta acesso multi-inquilino e gerenciamento de repositórios de assembly usando o conceito de Aplicativo. Uma instância de aplicativo contém seu próprio repositório exclusivo e fornece um serviço analítico especializado. Considerando a versatilidade das tarefas de engenharia reversa, o servidor Kam1n0 v2.x atualmente fornece três tipos diferentes de aplicativos de pesquisa de clones: Asm-Clone, Sym1n0 e Asm2Vec, e uma classificação executável baseada em Asm2Vec. Novos tipos de aplicativo podem ser adicionados à plataforma.
Um usuário pode criar várias instâncias de aplicativo. Uma instância de aplicativo pode ser compartilhada entre um grupo específico de usuários. O acesso de leitura-escrita ao repositório do aplicativo e o status ativo/inativo podem ser controlados pelo proprietário do aplicativo. O servidor Kam1n0 v2.x pode atender aos aplicativos concorrentemente usando vários pools de recursos compartilhados.
Kam1n0 foi desenvolvido por Steven H. H. Ding e Miles Q. Li sob a supervisão de Benjamin C. M. Fung do Data Mining and Security Lab na McGill University, no Canadá. Ele ganhou o segundo prêmio no Hex-Rays Plug-In Contest 2015. Se você achar Kam1n0 útil, por favor cite nosso artigo:
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.
Os aplicativos Asm-Clone tentam resolver o problema eficiente de busca de subgrafos (ou seja, problema de isomorfismo de grafos) para funções de assembly (<1,3s de tempo médio de consulta e <30ms de tempo médio de indexação com 2,3M funções). Dada uma função alvo (a da esquerda, como mostrado abaixo), ele pode identificar os subgrafos clonados entre outras funções no repositório (o da direita, como mostrado abaixo).
Pesquisa de clones semânticos por teste de fuzz diferenciado e resolução de restrições. Uma abordagem híbrida dinâmica-estática eficiente e escalável (<1s de tempo médio de consulta e <100ms de tempo médio de indexação com 1,5M funções). Dada uma função alvo (a da esquerda, como mostrado abaixo), ele pode identificar os subgrafos clonados entre outras funções no repositório (o da direita, como mostrado abaixo). Suporta visualização de grafo sintático abstrato.
Asm2Vec aproveita o aprendizado de representação. Ele entende a relação semântica lexical do código assembly. Por exemplo, registradores xmm* estão semanticamente relacionados a operações vetoriais como addps. memcpy é semelhante a strcpy. O gráfico abaixo mostra diferentes funções assembly compiladas a partir do mesmo código fonte de gmpz_tdiv_r_2exp no libgmp. Da esquerda para a direita, as funções assembly são compiladas com a opção GCC O0, opção GCC O3, Graph do Fluxo de Controle do ofuscador O-LLVM, opção Flattening e opção Bogus Control Flow Graph do ofuscador LLVM. Asm2Vec pode identificá-las estaticamente como clones.
Neste aplicativo, o usuário define um conjunto de classes de software que são baseadas em parentesco funcional e fornece binários pertencentes a cada classe. Então o sistema automaticamente agrupa funções em clusters nos quais as funções estão conectadas direta ou indiretamente por relação de clone. Os clusters que são discriminativos para a classificação são mantidos e servem como assinaturas de suas classes. Dado um binário alvo, o sistema mostra o grau em que ele pertence a cada classe de software.
A figura abaixo mostra os principais componentes de UI e funcionalidades do Kam1n0 v2.x. Adotamos um design material. Em geral, cada usuário tem uma lista de aplicativos, uma lista de trabalhos em execução e uma lista de arquivos de resultado.
A versão atual do Kam1n0 consiste em dois instaladores: o servidor core e o plug-in do IDA Pro.
| Instalador | Componentes incluídos | Descrição |
|---|---|---|
| Kam1n0-Server.msi | Mecanismo principal | Mecanismo principal fornecendo serviço de indexação e pesquisa. |
| Workbench | Uma interface de usuário para gerenciar os repositórios e o serviço em execução. | |
| Interface web do usuário | Interface web do usuário para pesquisar/indexar arquivos binários e funções assembly. | |
| Visual C++ redistributable para VS 15 | Dependência para z3. | |
| Kam1n0-IDA-Plugin.msi | Plug-in | Conectores e interface do usuário. |
| Wheels PyPI para Cefpython | Mecanismo de renderização para a interface do usuário. | |
| PyPI e wheels dependentes | Gerenciamento de pacotes para Python. Incluído para IDA 6.8 e 6.9. |
O mecanismo principal do Kam1n0 é puramente escrito em Java. Você precisa das seguintes dependências:
Baixe o arquivo Kam1n0-Server.msi da nossa página de releases. Siga as instruções para instalar o servidor. Será solicitado que você selecione um caminho de instalação. O IDA Pro é opcional se o servidor não tiver que lidar com nenhuma desmontagem. Em outras palavras, o lado do cliente usa o plugin Kam1n0 para IDA Pro. É fortemente sugerido ter o IDA Pro instalado com o servidor Kam1n0. O servidor Kam1n0 detectará automaticamente seu IDA Pro procurando pelo aplicativo padrão que você usa para abrir arquivos .i64.
O plug-in do Kam1n0 para IDA Pro é escrito em Python para a lógica e em HTML/JavaScript para a renderização. As seguintes dependências são necessárias para sua instalação:
Em seguida, baixe o instalador Kam1n0-IDA-Plugin.msi da nossa página de releases. Siga as instruções para instalar o plug-in e o runtime. Observe que o plug-in deve ser instalado na pasta de plugins do IDA Pro, localizada em $IDA_PRO_PATH$/plugins. Por exemplo, no Windows, o caminho pode ser C:/Program Files (x86)/IDA 6.95/plugins. O instalador detectará e validará o caminho.
Certifique-se de ter a versão Oracle do Java 11. (Não o default-jdk no apt.)
sudo add-apt-repository ppa:webupd8team/java
~webupd8team not found), se estiver em um proxy, certifique-se de definir e exportar suas variáveis de ambiente http_proxy e https_proxy, e tente novamente com a opção -E no sudo. Além disso, se você estiver recebendo um erro de 'add-apt repository command not found', tente: sudo apt install -y software-properties-common.sudo apt-get update, e sudo apt-get install oracle-java8-installer
java -version; você pode precisar definir manualmente a variável de ambiente JAVA_HOME (em /etc/environment), JAVA_HOME=/usr/lib/jvm/java-11-oracleBaixe a última versão para Linux (Kam1n0-IDA-Plugin.tar.gz e Kam1n0-Server.tar.gz) do Kam1n0-Community.
Extraia os dois tarballs (ou seja, tar –xvzf Kam1n0-IDA-Plugin.tar.gz e tar –xvzf Kam1n0-Server.tar.gz)
O arquivo Kam1n0-Server.tar.gz criará o diretório do servidor.
Dentro do diretório server, você deve ver um arquivo chamado kam1n0.properties, onde você definirá várias configurações para o kam1n0; isso é muito importante.
Defina kam1n0.data.path para onde você gostaria que seus dados relacionados ao kam1n0 fossem gravados. Escolhemos colocá-lo no mesmo local onde mantemos nosso server. kam1n0.ida.home se refere aonde sua instalação do IDA está localizada. Comente esta linha (e kam1n0.ida.batch, a linha seguinte) se você não tem IDA e não planeja usar kam1n0 para desmontagem. Para mais informações (precisas) sobre o arquivo kam1n0.properties, veja o arquivo kam1n0.properties.explained.
Execute o workbench do servidor kam1n0: java -jar kam1n0-server-workbench.jar. Isso deve fazer com que uma janela apareça, que solicita que você realmente inicie o kam1n0. Alternativamente, execute o servidor kam1n0: java -jar kam1n0-server.jar --start. Isso inicia o servidor a partir do console sem uma janela.
Para conectar e usar, vá para 127.0.0.1:8571 (a porta padrão que o kam1n0 escuta deve ser 8571, mas pode ser alterada no kam1n0.properties) no seu navegador. Você deve ver a bela interface web do kam1n0. A partir daí, siga o tutorial no repositório Kam1n0-Community se você não sabe como usar o kam1n0.
Os repositórios de código assembly e arquivos de configuração usados em versões anteriores (<2.0.0) não são mais suportados pela versão mais recente. Entre em contato conosco se precisar migrar seus repositórios antigos.
Clone o último branch estável (não se esqueça do --recursive!):```bash
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
## Importando o projeto.
IntelliJ: Importe a raiz /kam1n0/kam1n0/ como um projeto maven. Todos os submódulos serão carregados de acordo.
EclipseEE: Adicione o repositório git clonado à visualização git. Importe todos os projetos maven do repositório git.
Talvez seja necessário modificar o classpath para resolver qualquer erro.
Todos os caminhos de recursos são modificados dinamicamente quando executados dentro de uma IDE (através do submódulo kam1n0-resources).
Para construir o projeto:```
cd /kam1n0/kam1n0
mvn -DskipTests clean package
mvn -DskipTests package
Os binários resultantes podem ser encontrados em /kam1n0/build-bins/
Para executar o código de teste, você precisará primeiro baixar chromedriver.exe de http://chromedriver.chromium.org/ e adicionar seu caminho absoluto a uma variável de ambiente chamada webdriver.chrome.driver. Também é necessário que haja um navegador chrome instalado no sistema. O código de teste iniciará uma instância do navegador para testar as interfaces de IU. O procedimento de teste completo levará 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
Estes comandos apenas compilam Java com wheels pré-compilados de libvex e z3. Funciona imediatamente.
A compilação de libvex e z3 depende da plataforma. Usamos um fork do libvex do Angr.
Scripts de compilação mais completos, bem como instaladores para Windows/Linux, podem ser encontrados em /kam1n0-builds/
* kam1n0: O código-fonte do servidor.
* kam1n0-builds: Código-fonte do instalador e scripts para compilar a distribuição.
* kam1n0-clients: O código-fonte dos clientes.
## Lançamentos Binários
Temos um servidor Jenkins para desenvolvimento e entrega contínuos. O lançamento estável mais recente será postado aqui. Periodicamente, sincronizaremos nosso branch experimental interno com este repositório.
## Licenciamento
O software foi desenvolvido por [Steven H. H. Ding](http://stevending.net/), [Miles Q. Li](http://milesqli.github.io/) e [Benjamin C. M. Fung](http://dmas.lab.mcgill.ca/fung/) no [McGill Data Mining and Security Lab](http://dmas.lab.mcgill.ca/) e no [Queen's L1NNA Research Laboratory](https://l1nna.com/) no Canadá. É distribuído sob a Licença Apache Versão 2.0. Consulte [LICENSE.txt](https://github.com/mcgill-dmas/kam1n0-community/blob/master2.x/LICENSE.txt) para obter detalhes.
Direitos autorais 2014-2021 McGill University e os Pesquisadores. Todos os direitos reservados.
## Agradecimentos
-orange.svg?style=for-the-badge)




