converter executável de volta ao código fonte C

14

Infelizmente perdi meu código fonte e só tenho o arquivo de saída criado com o gcc no linux e não tenho acesso ao meu pc agora. Existe alguma maneira de converter o arquivo de saída para o arquivo de origem (em c no linux)?

mahsa
fonte
O que você deseja é chamado de descompilador. Você pode encontrar alguma ajuda com esta resposta: stackoverflow.com/questions/193896/whats-a-good-c-decompiler
Eric Renouf
O IDA Pro com o módulo descompilador é a única solução prática que realmente funciona com grandes executáveis.
precisa saber é o seguinte
@ fpmurphy1 Você possui o Hopper, que é comparável em qualidade ao IDA Pro e cuja licença é uma fração do preço.
Rui F Ribeiro
@ fpmurphy1 Ainda não consegui ver a qualidade do código gerado pelo Avast ... quem usa mais as plataformas Intel de 32 bits? Além disso, não uso o Wintel há décadas. consulte unix.stackexchange.com/questions/418354/… A diferença de preço é bastante significativa, no entanto, o Hex-rays / IDA pro começa em 1500USD para uma licença pessoal a alguns valores exorbitantes para licenças comerciais como 5000USD ou AFAIK, Hopper é 100USD para um único usuário e 130 para um único computador.
Rui F Ribeiro
@RuiFRibeiro. Muitos malwares que eu examino ainda são de 32 bits.
precisa saber é

Respostas:

25

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

Desculpe, mas não funciona dessa maneira.

Simplesmente restaure o arquivo de origem dos seus backups.

Ah, você não tinha backups. Infelizmente, o universo não dá uma pausa para isso.

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

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

Gilles 'SO- parar de ser mau'
fonte
1
O Boomerang parece bem arrumado; pena que a documentação faça referência a gcc -O4, já que isso não faz absolutamente nada (além de -O3) se a memória me servir bem. Sua última frase, é claro, é extremamente válida, assim como as cinco primeiras. Isso não quer dizer que o resto não seja válido, pois você está enfatizando a importância de fazer backup regularmente. 1
Pryftan 28/01
6

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

  1. O comando "arquivo", 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. Desmontadores 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 desmontagem.
  3. Descompiladores como Boomerang, Hex-rays e Snowman podem fornecer uma legibilidade maior, mas eles não recuperam os nomes de variáveis ​​reais ou sintaxe do programa original e não são 100% confiáveis, especialmente nos casos em que os engenheiros que criaram o executável testaram 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 por cima de um analisador de texto da saída do assembly (que pode ser escrito em sed ou Perl) pode ser útil.
  5. Lápis e papel, acredite ou não, para anotar fluxos e idéias.

Na maioria dos casos que eu vi, o código precisava ser reescrito do zero, mantido como um programa em linguagem assembly ou reconstituído reaplicando as solicitações de alteração em uma versão mais antiga.

Douglas Daseeco
fonte
1
# 1: Verdadeiro, embora também tenha suas falhas. # 3: Eu acho que esses são comerciais? Estou apenas curioso academicamente (tenho backups redundantes, portanto não há necessidade desse tipo de coisa). # 4: cflow (apesar de usar a fonte, existem alguns que funcionam no binário - com algumas ressalvas, é claro). Existem outros por aí, dependendo do que você procura. Quanto à saída gráfica, não posso ajudar lá, pois não gosto ou preciso de saída gráfica para esse tipo de coisa (acho mais perturbador, na verdade). # 5: muito verdadeiro. Você também pode usar um arquivo de texto aqui, é claro.
Pryftan
3

O que você quer fazer é chamado "descompilar". Existem muitos descompiladores por aí e não é prático abordá-los aqui.

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

  • Comentários são irreversivelmente perdidos
  • Nomes de variáveis ​​desapareceram
  • Às vezes, os loops são desenrolados para desempenho
  • As funções podem ser reorganizadas

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

Bagalaw
fonte
Sobre o assunto dos comentários, algo que eu notei recentemente é - e não tenho idéia se isso permitiria que os comentários fossem lidos por um descompilador, nem espero que os descompiladores procurem esse tipo de coisa - isto: -C Não descarte comentários. Todos os comentários são passados ​​para o arquivo de saída, exceto os comentários nas diretivas processadas, que são excluídas junto com a diretiva. Ele destaca os efeitos colaterais, bem como o da opção -CC (isto é para o gcc, embora provavelmente o cpp). Não que eu espere que se aplique ao OP, mas talvez seja interessante para alguns.
Pryftan