converte o executável de volta para o código-fonte C

7
Infelizmente eu perdi meu código-fonte e só tenho o arquivo de saída que fez com o gcc no linux e não tenho acesso ao meu pc agora.há alguma maneira de converter o arquivo de saída para o arquivo de origem (em c sob linux)?

    
por mahsa 15.09.2015 / 14:11

3 respostas

14

Então você tinha uma vaca, mas inadvertidamente a converteu em hambúrguer e agora quer sua vaca de volta.

Desculpe, simplesmente não funciona assim.

Simplesmente restaure o arquivo de origem dos seus backups.

Ah, você não tem backups. Infelizmente, o universo não te dá uma chance para isso.

Você pode decompilar o binário. Isso não lhe dará seu código-fonte, mas ele fornecerá algum código-fonte com o mesmo comportamento. Você não obterá os nomes das variáveis, a menos que seja um binário de depuração. Você não obterá exatamente a mesma lógica, a menos que tenha compilado sem otimizações. Obviamente, você não receberá comentários.

Eu usei Boomerang para descompilar alguns programas, e o resultado foi mais legível do que o código da máquina. Eu não sei se é a melhor ferramenta lá fora. De qualquer forma, não espere milagres.

    
por 16.09.2015 / 04:07
4

Várias ferramentas são comuns na engenharia reversa de um executável.

  1. O comando "file", que leva o caminho do arquivo como o primeiro parâmetro, para que você possa determinar (na maioria dos casos) que tipo de executável você possui.
  2. Desassembladores que mostram EXATAMENTE o que o executável faz, mas é difícil de ler para aqueles que não escrevem código de montagem nessa arquitetura específica ou têm experiência com a desmontagem.
  3. Descompiladores como Boomerang, Hex-rays e Snowman podem fornecer maior legibilidade, mas não recuperam os nomes ou a sintaxe reais das variáveis do programa original e não são 100% confiáveis, especialmente nos casos em que os engenheiros que criaram o executável testado com esses pacotes e tentou ofuscar ainda mais a segurança.
  4. Diagramas ou tabelas de fluxo de dados. Não conheço nenhuma ferramenta gratuita para fazer isso automaticamente, mas um script Python ou Bash na parte superior de um analisador de texto da saída da montagem (que pode ser escrito em sed ou Perl) pode ser útil.
  5. Lápis e papel, acredite ou não, por anotar fluxos e ideias.

Na maioria dos casos, o código precisava ser reescrito do zero, mantido como um programa de linguagem assembly ou reconstituído ao reaplicar solicitações de alteração a uma versão mais antiga.

    
por 21.02.2017 / 22:17
3

O que você quer fazer é chamado de "descompilar". Há muitos descompiladores por aí e não é prático cobrir todos eles aqui.

No entanto, como observação geral: A conversão de código-fonte C para código de máquina executável é com perdas. Por exemplo:

  • Os comentários são perdidos irreversivelmente
  • Os nomes das variáveis desapareceram
  • Às vezes, os loops são desenrolados para desempenho
  • As funções podem ser reorganizadas

É raro que o código seja compilado como escrito. A maioria dos compiladores atualmente mudará drasticamente seu código para otimizá-lo. Então, quando você descompila, o compilador pode apenas adivinhar como o código-fonte deve ter sido, ele não tem como saber qual era o código, porque acabou. Se o descompilador for bom, o código que você obtém será, pelo menos, compilável de volta para um executável equivalente e, em seguida, você poderá começar a refatorá-lo lentamente para ficar legível. Mas o mais provável é que o descompilador produza um código de espaguete absolutamente ilegível, e será uma dor de cabeça enorme decifrá-lo. Às vezes, pode acabar sendo menos trabalho para apenas reescrever o programa a partir do zero.

    
por 20.01.2018 / 00:30