2 pontos por GN⁺ 2024-03-18 | 1 comentários | Compartilhar no WhatsApp
  • Engenharia reversa com uso de modelos de linguagem de grande porte

1. Introdução ao LLM4Decompile e ao Decompile-Eval

  • Nosso objetivo é criar e lançar o primeiro LLM open source dedicado à descompilação e construir o primeiro benchmark de descompilação focado em recompilabilidade e reexecutabilidade para avaliar suas capacidades.
  • Um milhão de amostras de código C coletadas do AnghaBench foram compiladas em código assembly usando GCC, formando assim um conjunto de dados de 4 bilhões de tokens de pares assembly-código-fonte.
  • Com esse conjunto de dados, foi feito o fine-tuning do modelo DeepSeek-Coder, um dos principais code LLMs, e foi construído o benchmark de avaliação Decompile-Eval com base em questões do HumanEval e amostras de teste.
  • A avaliação é realizada sob duas perspectivas: se o código descompilado pode ser recompilado com sucesso e se consegue passar por todas as asserções dos casos de teste.

2. Resultados da avaliação

Métricas

  • Recompilabilidade e reexecutabilidade são indicadores importantes para verificar a eficácia do processo de descompilação.
  • Se o código descompilado puder ser recompilado, isso fornece uma forte evidência de integridade sintática.
  • Como a sintaxe por si só não garante equivalência semântica com o programa original, a reexecutabilidade é uma medida importante para avaliar a precisão semântica.
  • Recompilabilidade e reexecutabilidade representam recuperação de sintaxe e preservação semântica, que são essenciais para uma descompilação utilizável e robusta.

3. Como usar o modelo

  • O LLM4Decompile inclui modelos com 1,3 bilhão a 33 bilhões de parâmetros, disponíveis no Hugging Face.
  • Exemplos de modelos: llm4decompile-1.3b, llm4decompile-6.7b, llm4decompile-33b, llm4decompile-6.7b-nsp, llm4decompile-6.7b-uo
  • O modelo NSP foi treinado com código assembly e tem reexecutabilidade média de cerca de 0,17.
  • O modelo UO foi treinado sem conhecimento prévio do nível de otimização (O0~O3) e tem reexecutabilidade média de cerca de 0,21.
  • Exemplo de uso do modelo: compilar código C em binário, desmontar o binário em instruções assembly e usar o LLM4Decompile para traduzir as instruções assembly para C.

4. Como usar o Decompile-Eval

  • Os dados são armazenados em formato de lista JSON em llm4decompile/decompile-eval/decompile-eval.json.
  • São fornecidos métodos para executar a avaliação em uma única GPU e um único processo, bem como usando TGI (10 vezes mais rápido, com suporte a múltiplas GPUs e múltiplos processos).

5. Em andamento

  • LLM4Binary: há planos para incluir um conjunto de dados maior para pré-treinar o modelo com código assembly e código C.
  • Decompiler-ALL: há planos para oferecer suporte a mais linguagens/plataformas e configurações (ex.: descompilação de múltiplas funções).

6. Licença

  • Licença MIT

Opinião do GN⁺

  • O LLM4Decompile apresenta uma abordagem inovadora em comparação com os métodos tradicionais de descompilação de binários, especialmente ao usar modelos de linguagem de grande porte para permitir uma descompilação mais precisa e eficiente.
  • Essa tecnologia pode ser muito útil na área de segurança de software, ajudando em análise de malware e manutenção de sistemas legados.
  • O fato de a reexecutabilidade do código descompilado não ser perfeita sugere que essa tecnologia ainda tem espaço para melhorias. São necessárias pesquisas adicionais para aumentar a precisão e a eficiência em ambientes reais.
  • Entre as ferramentas existentes com funcionalidades semelhantes estão descompiladores comerciais e open source como Ghidra e IDA Pro, mas o LLM4Decompile oferece uma nova abordagem baseada em machine learning.
  • Ao adotar essa tecnologia, é preciso considerar a qualidade e o alcance dos dados de treinamento, a precisão do modelo e a velocidade de execução. As vantagens potenciais incluem alta precisão e flexibilidade, enquanto a complexidade dos modelos de grande porte e a demanda por recursos computacionais podem ser desvantagens.

1 comentários

 
GN⁺ 2024-03-18
Comentários no Hacker News
  • Opinião sobre os resultados de "re-executabilidade":

    • A re-executabilidade é uma forma importante de medir a correção semântica. Recompila-se o resultado descompilado e executam-se casos de teste para avaliar se a lógica e o comportamento do programa foram preservados. Recompilabilidade e re-executabilidade indicam recuperação sintática e preservação semântica, o que é essencial para uma descompilação utilizável e robusta.
  • Pergunta sobre a confiabilidade do resultado descompilado:

    • É uma pergunta séria se o resultado descompilado pode ser considerado confiável. A recompilação pode gerar código de máquina diferente, e pode ser difícil identificar novas estruturas, especialmente quando elas podem estar em partes centrais do código. Fico curioso se existe alguma forma de o LLM reportar sua confiança em seções específicas durante a geração. Parece que verificação humana será necessária.
  • Excelente caso de uso para fine-tuning de LLM:

    • É um ótimo caso de uso para fine-tuning de LLM, porque é fácil gerar grandes conjuntos de dados de pares de entrada/saída a partir de código C público.
  • Interesse em treinar módulos de descompilação baseados em desenvolvedores:

    • É interessante saber se seria possível treinar um módulo de descompilação com base em aplicações feitas por desenvolvedores específicos. Por exemplo, Super Mario 64 e Zelda 64 foram totalmente descompilados, e outros jogos de N64 também estão em andamento. Fico curioso se isso poderia facilitar a descompilação de outros jogos feitos pelos mesmos desenvolvedores.
  • Interesse no caso de uso ideal para descompiladores e na geração de datasets:

    • Um descompilador ideal eliminaria a necessidade de código-fonte proprietário. Como há abundância de código C disponível publicamente, seria fácil criar datasets formados por pares de ASM e código-fonte.
  • Apresentação de um projeto pessoal de descompilador baseado em LLM em andamento:

    • Estou desenvolvendo um descompilador baseado em LLM para bytecode Python. Não há tantas pessoas trabalhando nessa linha de pesquisa, mas acho que ela pode se tornar interessante com a possibilidade de contextos de atenção longos. Se alguém conhecer uma equipe para colaborar, tenho interesse em parceria.
  • Preocupação com benchmarks sem comparação com abordagens baseadas em IA:

    • É legal ver abordagens diferentes, mas sem comparação com abordagens não baseadas em IA, como IDA Pro, os benchmarks podem não significar muito. Seria interessante ver como esse modelo se sai nas métricas de artigos de segurança.
  • Interesse na grande diferença entre as pontuações de recompilabilidade e re-executabilidade:

    • O GPT4 alcançou 8x% em recompilabilidade (sintaticamente correto), mas registrou um péssimo 1x% em re-executabilidade (conceitualmente correto), mostrando mais uma vez sua capacidade excessiva de imitação.
  • Curiosidade sobre comparação com outros descompiladores que não usam LLM:

    • Fico curioso sobre como seria a comparação com descompiladores não baseados em LLM, como IDA, Binja etc. Só vejo comparação com outros LLMs.
  • Curiosidade sobre o modelo 6b ter apresentado desempenho superior ao modelo 33b:

    • É interessante que o modelo 6b tenha mostrado desempenho melhor que o modelo 33b. Fico pensando se o modelo 33b precisa de mais dados de treinamento. O modelo 33b foi pré-treinado com cerca de 1 milhão de programas em C, enquanto o DeepSeek-Coder foi treinado com 2 trilhões de tokens, o que representa várias ordens de grandeza a mais de dados.