Author: Backer Street Software
Decompiler Design - Introdução |
Introdução
A descompilação é uma forma de engenharia reversa de programas de computador. Seu objetivo é converter um arquivo binário compilado em um arquivo de origem. Pode ser necessário fazê-lo por vários motivos, como para entender como um programa funciona, ou para tentar modificar um programa para aprimorá-lo ou corrigir um erro.
A descompilação existe há muitos anos, provavelmente desde que as pessoas começaram a compilar programas de linguagens de alto nível para formatos de nível inferior, como a montagem e código de máquina.
Várias tentativas foram realizadas na escrita de descompiladores executáveis binários. Esta pagina tem alguns exemplos.
Há ainda mais descompiladores disponíveis para ambientes gerenciados que usam byte-code, como Java e C#. Uma lista extensa está disponível na transformação de programa wiki.
Nessas páginas, nos concentraremos na descompilação de executáveis binários, ou do código da máquina ao código-fonte, uma vez que isso é muito mais difícil do que decompilar código de byte Java ou C#.
Vários idiomas e compiladores podem produzir código de máquina, incluindo alguns compiladores Java, C # e Visual Basic. Portanto, o descompilador terá que saber qual idioma foi usado para compilar o programa e terá que ter suporte para gerar esse idioma. No entanto, a maioria dos problemas difíceis na descompilação aparecem quando se utilizam linguagens menos restritivas, nomeadamente C, Pascal ou C ++.
A maioria dos algoritmos pode ser usado para todos os idiomas, então usaremos principalmente exemplos escritos em C. Quando mostramos um algoritmo, usaremos C ou C++, pois estes são os idiomas mais disponíveis no Linux e no Windows.
Independentemente da língua alvo, um descompilador trata principalmente de 3 tipos de entidades:
- Objetos de Código (funções, afirmações)
- Objetos de Dados (variáveis locais e globais)
- Tipos (tipos de variáveis, função de protótipos)
O problema constante de um descompilador é tentar inferir uma ou mais das três entidades acima de uma seqüência de bytes encontrada no arquivo binário. Para fazer isso, é útil saber como as ferramentas de desenvolvimento (que chamamos de "ferramentas de engenharia direta") são usadas ao escrever um programa, pois esse é o processo que estamos tentando reverter.