Simple Science

Ciência de ponta explicada de forma simples

# Informática# Engenharia de software

Recuperando Nomes de Variáveis de Arquivos Binários

Um método pra restaurar nomes de variáveis que fazem sentido na análise de software.

― 10 min ler


Recuperação de Nomes deRecuperação de Nomes deArquivos Bináriosvariáveis que façam sentido.Transforme código binário em nomes de
Índice

No mundo do software, entender como os programas funcionam é fundamental, especialmente quando se trata de arquivos binários. Esses arquivos são criados quando o código é compilado em linguagem de máquina, que os computadores conseguem ler, mas os humanos não entendem facilmente. Isso dificulta a vida dos programadores e especialistas em segurança na hora de analisar o comportamento do software, principalmente quando estão tentando encontrar vulnerabilidades ou código malicioso. Um ponto chave nessa análise é recuperar nomes significativos para variáveis que muitas vezes são removidos no formato binário.

A Importância dos Nomes das Variáveis

Os nomes das variáveis na programação servem como rótulos para os dados que os programas usam. Eles ajudam os desenvolvedores a entender o que cada pedaço de dado representa. Por exemplo, uma variável chamada userAge é muito mais clara do que uma chamada a1. Quando o software é compilado, muitos desses nomes são retirados para economizar espaço ou proteger a propriedade intelectual. Essa remoção torna muito complicado para qualquer um que tente entender o código depois. Sem nomes significativos, analisar o programa se torna um jogo de adivinhação.

Desafios no Código Decompilado

Quando decompilamos o código (convertemos de binário para uma forma legível por humanos), frequentemente acabamos com um código que tem Nomes de Variáveis genéricos como a1, v2, ou simplesmente marcadores. Isso dificulta a compreensão da intenção do código.

Recuperar esses nomes com precisão pode aumentar muito a legibilidade do código decompilado. Isso permite que analistas de segurança tomem decisões mais informadas ao avaliar o software em busca de vulnerabilidades ou comportamentos maliciosos. O desafio está em prever esses nomes significativos a partir dos binários despojados.

Técnicas Atuais e Suas Limitações

Existem muitos métodos atualmente para recuperar nomes de variáveis de binários decompilados. A maioria dessas técnicas usa modelos de aprendizado de máquina treinados em grandes quantidades de código. Eles geralmente tratam a recuperação de nomes como um problema de classificação, onde o modelo tenta escolher o nome mais provável para cada variável de uma lista de nomes conhecidos. No entanto, essa abordagem tem várias desvantagens:

  1. Dados Desbalanceados: Os nomes das variáveis não estão distribuídos de forma uniforme. Alguns nomes aparecem com muita frequência, enquanto muitos outros aparecem raramente. Isso faz com que os Modelos de Classificação tendam a prever nomes mais comuns, resultando em resultados ruins para nomes raros.

  2. Vocabulário Limitado: Como esses modelos só podem escolher entre nomes que já viram durante o treinamento, eles não conseguem gerar novos nomes. Essa limitação pode ser um grande obstáculo ao lidar com nomes de variáveis únicos ou incomuns.

  3. Incapacidade de Capturar Contexto: Analisar uma função isoladamente significa que o modelo não pode aproveitar informações úteis de funções relacionadas, variáveis adjacentes ou contextos de chamada, resultando em previsões menos precisas.

Esses desafios destacam a necessidade de métodos melhores na recuperação de nomes de variáveis.

Uma Nova Abordagem para Recuperação de Nomes

Para abordar essas questões, foi desenvolvida uma nova metodologia que combina as forças de diferentes tipos de modelos de aprendizado de máquina para recuperar nomes de variáveis. Essa abordagem foca em gerar nomes significativos em vez de apenas classificá-los.

O Papel dos Modelos Generativos

Modelos generativos podem criar novos nomes com base no contexto fornecido. Isso é diferente dos modelos de classificação, que só podem escolher entre um conjunto fixo de nomes pré-existentes. Usando modelos generativos, podemos criar nomes únicos que podem não ter sido vistos durante o treinamento. Essa flexibilidade é crucial para recuperar nomes de variáveis que raramente aparecem em conjuntos de dados existentes.

No entanto, os modelos generativos enfrentam seus próprios desafios. Eles podem produzir nomes que são sem sentido ou incorretos, um fenômeno conhecido como “alucinação.” Por exemplo, se um modelo generativo é solicitado a nomear uma variável que representa uma chave compartilhada em uma função de criptografia, ele pode sugerir erroneamente um nome que implica um tipo diferente de criptografia totalmente.

Voltando-se para Informações Contextuais

Uma estratégia eficaz para melhorar a precisão da recuperação de nomes é incorporar informações do contexto de chamada. Quando uma função chama outras funções, ela frequentemente passa informações que podem ajudar a esclarecer o que as variáveis significam. Ao olhar para os nomes usados em funções relacionadas, podemos fornecer aos modelos generativos entradas mais ricas, melhorando suas previsões.

Por exemplo, se uma função loadKey usa uma variável de entrada chamada filePath, e é comumente chamada por outra função openFile, podemos inferir que uma variável em loadKey também pode estar relacionada a operações de arquivo. Esse contexto adicional melhora a probabilidade de que os nomes gerados sejam apropriados e significativos.

A Abordagem de Modelo Duplo

Para combinar as forças de modelos generativos e de classificação, é usada uma abordagem de modelo duplo. Nesse método, um modelo gera nomes criativos enquanto o outro oferece estabilidade classificando nomes conhecidos. Juntos, esses modelos trabalham para prever e validar nomes de variáveis.

  1. Modelo Generativo: Este modelo cria possíveis nomes para variáveis com base no código decompilado e nas informações contextuais. Ele aproveita as forças da compreensão de linguagem aprendidas a partir de grandes conjuntos de dados de código de programação.

  2. Modelo de Classificação: Este modelo avalia nomes conhecidos para fornecer uma base estável. Ele é particularmente útil para nomes que são comuns e bem compreendidos.

Usando ambos os modelos, conseguimos promover melhores previsões enquanto reduzimos a incidência de alucinações.

Implementação da Técnica de Recuperação de Nomes

A técnica de recuperação de nomes proposta envolve várias etapas, desde a pré-processamento de dados até a geração final de nomes. Abaixo, vamos detalhar esses processos.

Pré-processamento de Dados

Antes de treinar nossos modelos, precisamos reunir e preparar os dados necessários. Isso envolve:

  1. Coleta de Programas Binários: Reunimos um conjunto diversificado de arquivos binários, garantindo que contenham exemplos suficientes de variáveis que queremos identificar.

  2. Decompilação: Os binários são decompilados para obter uma representação textual do código. Esse processo gera as representações de baixo nível do código, com nomes de variáveis muitas vezes sem significado.

  3. Mapeamento de Nomes de Variáveis Verdadeiras: Para cada programa decompilado, os nomes de variáveis verdadeiras devem ser vinculados às suas localizações no código decompilado. Isso significa identificar os nomes originais antes de serem removidos e associá-los com suas posições na memória.

  4. Aumento de Dados: Enriquecemos nosso conjunto de dados usando informações de funções relacionadas, garantindo que capturemos nomes e contextos relevantes que possam ajudar nas previsões.

Treinamento dos Modelos

Com o conjunto de dados limpo e aumentado, podemos treinar nossos modelos.

  1. Ajuste Fino de Modelos Generativos: O modelo generativo é ajustado para entender as especificidades da estrutura do código decompilado, permitindo que ele gere nomes coerentes alinhados com as práticas de programação.

  2. Treinamento de Modelos de Classificação: O modelo de classificação é treinado para reconhecer e classificar nomes conhecidos com base em sua frequência estatística nos dados de treinamento.

  3. Treinamento Duplo: Ambos os modelos são treinados juntos de maneira que possam compartilhar insights e melhorar as previsões um do outro.

Processo de Inferência

Uma vez que os modelos estão treinados, eles podem ser usados em cenários reais para recuperar nomes de variáveis de novos binários.

  1. Gerando Nomes Iniciais: Para cada variável, o modelo generativo tenta sugerir nomes com base no código decompilado e nos contextos.

  2. Validando Nomes: O modelo de classificação então revisa esses nomes, avaliando sua validade em relação aos nomes conhecidos e sugerindo correções se necessário.

  3. Processamento Iterativo: Os modelos podem refinar suas previsões iterativamente usando feedback de rodadas anteriores, aumentando a precisão ao longo do tempo.

Resultados e Eficácia

A eficácia dessa nova abordagem pode ser medida comparando seu desempenho com as técnicas existentes. Ela não apenas supera métodos tradicionais de classificação, mas também lida muito melhor com nomes raros de variáveis.

Métricas de Desempenho

Para avaliar o desempenho, usamos tanto correspondência exata quanto correspondência semântica. A correspondência exata verifica se o nome previsto é idêntico ao nome original, enquanto a correspondência semântica permite algumas variações, desde que o nome previsto transmita um significado similar.

Comparação com Técnicas Existentes

Quando medido em relação às técnicas de ponta atuais, nossa abordagem de modelo duplo mostra melhorias consideráveis. Ela aumenta significativamente a precisão da recuperação de nomes, especialmente para casos desafiadores onde o nome de uma variável é raro ou complexo.

Por exemplo, métodos existentes podem alcançar uma precisão de aproximadamente 31,2%, enquanto nossa técnica eleva isso para mais de 57,9%. Isso não apenas destaca a eficácia de gerar novos nomes, mas também mostra a importância de aproveitar contextos adicionais.

Aplicações no Mundo Real

As implicações da melhoria na recuperação de nomes de variáveis vão além do interesse acadêmico. Analistas de segurança, por exemplo, se beneficiam diretamente ao analisar malware. Com nomes mais significativos, eles podem identificar mais facilmente comportamentos suspeitos em código decompilado.

Além disso, entender software binário melhora a postura de segurança geral de sistemas e aplicações, permitindo que os desenvolvedores mantenham e fortaleçam seu software contra ameaças potenciais.

Conclusão

Em resumo, a recuperação de nomes de variáveis significativos de binários despojados é uma tarefa crucial na análise de software, especialmente nas áreas de segurança e engenharia reversa. Os desafios associados às técnicas atuais podem ser efetivamente abordados utilizando uma abordagem de modelo duplo que combina modelos generativos e de classificação. Ao aproveitar informações contextuais de funções de chamada, podemos recuperar nomes que não só são precisos, mas também informativos.

Essa inovação abre novas possibilidades para entender sistemas de software complexos e aumenta a capacidade dos analistas de identificar vulnerabilidades ou intenções maliciosas. À medida que o cenário de software continua a evoluir, técnicas como essas se tornarão cada vez mais valiosas para garantir a confidencialidade, integridade e disponibilidade de aplicações de software críticas.

Fonte original

Título: Symbol Preference Aware Generative Models for Recovering Variable Names from Stripped Binary

Resumo: Decompilation aims to recover the source code form of a binary executable. It has many security applications, such as malware analysis, vulnerability detection, and code hardening. A prominent challenge in decompilation is to recover variable names. We propose a novel technique that leverages the strengths of generative models while mitigating model biases. We build a prototype, GenNm, from pre-trained generative models CodeGemma-2B, CodeLlama-7B, and CodeLlama-34B. We finetune GenNm on decompiled functions and teach models to leverage contextual information. GenNm includes names from callers and callees while querying a function, providing rich contextual information within the model's input token limitation. We mitigate model biases by aligning the output distribution of models with symbol preferences of developers. Our results show that GenNm improves the state-of-the-art name recovery precision by 5.6-11.4 percentage points on two commonly used datasets and improves the state-of-the-art by 32% (from 17.3% to 22.8%) in the most challenging setup where ground-truth variable names are not seen in the training dataset.

Autores: Xiangzhe Xu, Zhuo Zhang, Zian Su, Ziyang Huang, Shiwei Feng, Yapeng Ye, Nan Jiang, Danning Xie, Siyuan Cheng, Lin Tan, Xiangyu Zhang

Última atualização: 2024-12-09 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2306.02546

Fonte PDF: https://arxiv.org/pdf/2306.02546

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes