Kam1n0 v2.x é uma plataforma escalonável de gerenciamento e análise de montagem. Ele permite que um usuário indexe primeiro uma (grande) coleção de binários em diferentes repositórios e forneça diferentes serviços analíticos, como pesquisa e classificação de clones. Ele oferece suporte ao acesso multilocatário e ao gerenciamento de repositórios de montagem usando o conceito de Application . 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 oferece três tipos diferentes de aplicativos de pesquisa de clones: Asm-Clone , Sym1n0 e Asm2Vec , e uma classificação executável baseada em Asm2Vec . Novo tipo de aplicativo pode ser adicionado à plataforma.
Um usuário pode criar diversas instâncias de aplicativos. Uma instância de aplicativo pode ser compartilhada entre um grupo específico de usuários. O acesso de leitura e gravação do repositório de aplicativos e o status ativado podem ser controlados pelo proprietário do aplicativo. O servidor Kam1n0 v2.x pode servir os aplicativos simultaneamente usando vários pools de recursos compartilhados.
Kam1n0 foi desenvolvido por Steven HH Ding e Miles Q. Li sob a supervisão de Benjamin CM Fung do Laboratório de Mineração e Segurança de Dados da Universidade McGill, no Canadá. Ele ganhou o segundo prêmio no Hex-Rays Plug-In Contest 2015. Se você achar o Kam1n0 útil, cite nosso artigo:
SHH Ding, BCM Fung e P. Charland. Kam1n0: Pesquisa de clone de montagem baseada em MapReduce para engenharia reversa. Em Anais da 22ª Conferência Internacional ACM SIGKDD sobre Descoberta de Conhecimento e Mineração de Dados (SIGKDD) , páginas 461-470, São Francisco, CA: ACM Press, agosto de 2016.
SHH Ding, BCM Fung e P. Charland. Asm2Vec: aumentando a robustez da representação estática para pesquisa de clones binários contra ofuscação de código e otimização do compilador. Em Anais do 40º Simpósio IEEE sobre Segurança e Privacidade (S&P) , 18 páginas, São Francisco, CA: IEEE Computer Society, maio de 2019.
As aplicações Asm-Clone tentam resolver o problema de busca eficiente de subgráficos (ou seja, problema de isomorfismo de grafos) para funções assembly (tempo médio de consulta <1,3s e tempo médio de índice <30ms com funções de 2,3M). Dada uma função alvo (a da esquerda conforme mostrado abaixo), ela pode identificar os subgráficos clonados entre outras funções no repositório (a da direita conforme mostrado abaixo).
Pesquisa semântica de clones por meio de testes fuzz diferenciados e resolução de restrições. Uma abordagem híbrida dinâmico-estática eficiente e escalonável (tempo médio de consulta <1s e tempo médio de índice <100ms com funções de 1,5M). Dada uma função alvo (a da esquerda conforme mostrado abaixo), ela pode identificar os subgráficos clonados entre outras funções no repositório (a da direita conforme mostrado abaixo). Suporta visualização de gráfico de sintaxe abstrata.
Asm2Vec aproveita o aprendizado de representação. Ele compreende a relação semântica lexical do código assembly. Por exemplo, os 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
em libgmp. Da esquerda para a direita, as funções de montagem são compiladas com a opção GCC O0, opção GCC O3, gráfico de fluxo de controle do ofuscador O-LLVM, opção Flattening e opção Bogus Control Flow Graph do ofuscador LLVM. Asm2Vec pode identificá-los estaticamente como clones.
Nesta aplicação, o usuário define um conjunto de classes de software que são baseadas no relacionamento funcional e fornece binários pertencentes a cada classe. Em seguida, o sistema agrupa automaticamente funções em clusters nos quais as funções são conectadas direta ou indiretamente por relação de clone. Os clusters 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.
Use Asm2Vec como seu modelo de cálculo de similaridade de função
A figura abaixo mostra os principais componentes de UI e funcionalidades do Kam1n0 v2.x. Adotamos um design de material. Em geral, cada usuário possui uma lista de aplicativos, uma lista de tarefas em execução e uma lista de arquivos de resultados.
A versão atual do Kam1n0 consiste em dois instaladores: o servidor principal e o plug-in IDA Pro.
Instalador | Componentes incluídos | Descrição |
---|---|---|
Kam1n0-Server.msi | Motor principal | Motor principal que fornece serviço de indexação e pesquisa. |
Bancada de trabalho | Uma interface de usuário para gerenciar os repositórios e executar o serviço. | |
Interface de usuário da Web | Interface de usuário da Web para pesquisa/indexação de arquivos binários e funções de montagem. | |
Visual C++ redistribuível para VS 15 | Dependência para z3. | |
Kam1n0-IDA-Plugin.msi | Plug-in | Conectores e interface do usuário. |
Rodas PyPI para Cefpython | Mecanismo de renderização para a interface do usuário. | |
PyPI e rodas dependentes | Gerenciamento de pacotes para Python. Incluído para IDA 6.8 e 6.9. |
O mecanismo central Kam1n0 é puramente escrito em Java. Você precisa das seguintes dependências:
Baixe o arquivo Kam1n0-Server.msi
em nossa página de lançamento. Siga as instruções para instalar o servidor. Você será solicitado a selecionar um caminho de instalação. IDA Pro é opcional se o servidor não precisar desmontar. Em outras palavras, o lado do cliente usa o plugin Kam1n0 para IDA Pro. É altamente recomendável ter o IDA Pro instalado com o servidor Kam1n0. O servidor Kam1n0 detectará automaticamente o seu IDA Pro procurando o aplicativo padrão que você usou para abrir o arquivo .i64
.
O plug-in Kam1n0 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
em nossa página de lançamento. Siga as instruções para instalar o plug-in e o tempo de execução. Observe que o plug-in deve ser instalado na pasta de plug-ins 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 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 'comando de repositório add-apt não encontrado, tente: sudo apt install -y software-properties-common
.sudo apt-get update
e sudo apt-get install oracle-java8-installer
java -version
; pode ser necessário definir manualmente a variável de ambiente JAVA_HOME (em /etc/environment
), JAVA_HOME=/usr/lib/jvm/java-11-oracle
Baixe a versão mais recente para Linux (Kam1n0-IDA-Plugin.tar.gz e Kam1n0-Server.tar.gz) em 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ê deverá ver um arquivo chamado kam1n0.properties
, onde você definirá várias configurações para kam1n0; isso é muito importante.
Defina kam1n0.data.path
para onde você gostaria que seus dados relacionados ao kam1n0 fossem gravados. Optamos por colocá-lo no mesmo local onde guardamos nosso server
. kam1n0.ida.home
refere-se ao local onde sua instalação do IDA está localizada. Comente esta linha (e kam1n0.ida.batch
, a linha a seguir) se você não possui IDA e não planeja usar kam1n0 para desmontagem. Para obter informações adicionais (precisas) sobre o arquivo kam1n0.properties
, consulte o arquivo kam1n0.properties.explained
.
Execute kam1n0-server-workbench: java -jar kam1n0-server-workbench.jar
. Isto deve fazer com que uma janela apareça, solicitando que você realmente inicie o kam1n0. Alternativamente, execute kam1n0-server: java -jar kam1n0-server.jar --start
. Isso inicia o servidor a partir do console sem janela.
Para conectar e usá-lo, vá para 127.0.0.1:8571
(a porta padrão que kam1n0 escuta deve ser 8571, mas pode ser alterada em kam1n0.properties) em seu navegador. Você deverá ver a bela UI da web kam1n0. A partir daí, siga o tutorial no repositório Kam1n0-Community se você não souber como usar o kam1n0.
Os repositórios de código assembly e os arquivos de configuração usados nas 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 branch estável mais recente (não se esqueça de --recursive
!):
git clone --recursive -b master2.x --single-branch https://github.com/McGill-DMaS/Kam1n0-Community
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. Pode ser necessário modificar o caminho de classe para resolver qualquer erro. Todos os caminhos dos recursos são modificados dinamicamente quando executados dentro de um 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
em http://chromedriver.chromium.org/ e adicionar seu caminho absoluto em 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 da UI. 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
Esses comandos compilam apenas java com rodas pré-compiladas de libvex e z3. Funciona imediatamente. A construção do libvex e do z3 depende da plataforma. Usamos um fork do libvex do Angr. Scripts de construção mais sérios, bem como instaladores para Windows/Linux, podem ser encontrados em /kam1n0-builds/
Temos um servidor Jenkin para desenvolvimento e entrega contínuos. A última versão estável será postada aqui. Periodicamente sincronizaremos nosso branch experimental interno com este repositório.
O software foi desenvolvido por Steven HH Ding, Miles Q. Li e Benjamin CM Fung no Laboratório de Mineração e Segurança de Dados McGill e no Laboratório de Pesquisa L1NNA da Queen no Canadá. É distribuído sob a licença Apache versão 2.0. Consulte LICENSE.txt para obter detalhes.
Copyright 2014-2021 Universidade McGill e os pesquisadores. Todos os direitos reservados.