Existe alguma esperança de um decompiler que iria converter um programa executável em C / C + + código?
Este FAQ resposta é um trecho de Snippets por Bob Stout.
Não segure a respiração. Pense nisso ... Para um decompiler para funcionar correctamente, quer 1) cada compilador teria de gerar código substancialmente idênticos, mesmo com a plena otimização ligado, ou 2), teria de reconhecer a produção individual de cada compilador código do gerador.
Se o primeiro caso viesse a ser correto, não haveria mais necessidade de compilador de referência, uma vez que cada um teria o mesmo trabalho. Para o segundo caso a ser verdade implicaria em imensamente complexo programa que tinha de mudar com cada novo compilador libertação.
Então, o que cerca decompilers específicas para determinados compiladores - disse um decompiler concebido para funcionar apenas no código gerado por, digamos, BC + + 4.5? Isto fica-nos de volta para a otimização questão. Código escrito para a clareza e inteligibilidade é muitas vezes ineficiente. Código escrito para o máximo desempenho (velocidade ou tamanho), é muitas vezes críptica (na melhor das hipóteses!) Junte-se a isto o facto de todos os compiladores modernos têm uma multiplicidade de otimização de parâmetros de controlo que permitem a otimização técnicas e que a evitar. A questão de fundo é que, por um razoavelmente grande e complexo, fonte módulo, você pode obter o compilador para produzir um número de diferentes módulos objeto simplesmente alterando sua otimização interruptores, para que o seu decompiler terá também de ser um deoptimizer que podem automagicamente reconhecer que otimização estratégias foram ativados em compilar tempo.
Vamos simplificar mais e especificar que apenas pretende um apoio específico compilador e quiser descompilar o mais lógico para o código fonte sem tentar interpretar a otimização. E então? Um bom otimizador pode e será substancialmente internals de reescrever o seu código, assim que você sair do seu decompiler serão, não apenas críptica, mas em muitos casos, crivada de goto declarações e outros não, não é de boa prática codificação. Neste ponto, você tem decompiled fonte, mas o que é bom?
Também observe atentamente a minha referência à fonte módulos. Uma característica de C é que ela se torna em grande parte a não ser discriminado em ilegível facilmente sustentável fonte módulos (. C arquivos). Como será o decompiler lidar com isso? Ele poderia tentar descompilar o programa inteiro em alguns mamute função main (), perdendo todas as modularidade, ou pode tentar colocar cada um em sua própria função chamado arquivo. A primeira maneira seria inutilizável gerar o caos ea segunda seria executado em problemas quando a fonte original, inclinar-se arquivos com múltiplas funções utilizando dados estáticos e / ou uma ou mais funções chamar uma ou mais funções estáticas. Um decompiler poderia tornar os dados estáticos e / ou funções globais, mas apenas à custa ou legibilidade (o que já seria inaceitável).
Por último, lembre-se que as aplicações comerciais código muitas vezes o mais difícil ou tempo-críticos funções na montadora que pode revelar-se quase impossível para um descompilar em C equivalente.
Como eu disse, não segure a respiração. Como a tecnologia melhora a decompilers onde pode tornar-se mais viável, otimizadores e linguagens (C + +, por exemplo, seria uma língua muito mais dura do que a decompile C) também conspiram para torná-las menos prováveis.
Durante anos Unix pedidos foram distribuídos em forma envolta fonte (máquina humana, mas não lido - todos os comentários e branco removidas, variáveis todos os nomes na forma OOIIOIOI, etc), que tem sido um bem de meios adequados de protecção dos direitos do autor. É muito improvável que decompiler saída seria ainda como lidos como envolta fonte.
Atualização: Decompiler tecnologia ainda é muito difícil, mas avanços significativos foram feitos desde que este foi escrito.
Leia O que é um decompiler? Para obter informações actualizadas sobre decompiler projectos.
|
Bookmark Existe alguma esperança de um decompiler que iria converter um programa executável em C / C + + código?

