Original Article: Decompiler Design - Introduction
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.