Original Article: Decompiler Design - Introduction
Author: Backer Street Software

  Decompiler Design - Introdução

Introdução

Decompilation é uma forma de engenharia reversa de programas de computador. Seu objetivo é converter um arquivo binário compilado em um arquivo de origem. Pode-se querer fazer isso por várias razões, como para entender como um programa funciona, ou para tentar modificar um programa para aprimorá-lo ou corrigir um bug.

Decompilação tem sido em torno de muitos anos, provavelmente desde que as pessoas começaram a compilar programas de linguagens de alto nível para os formatos de nível inferior, como montagem e código de máquina.

Várias tentativas foram conduzidas na escrita de descompiladores executáveis binários. esta pagina tem alguns exemplos.

Existem ainda mais descompiladores disponíveis para ambientes gerenciados que usam byte-code, como Java e C #. Uma extensa lista está disponível no Transformação de programas wiki.

Nestas páginas vamos nos concentrar na descompilação de executáveis binários, ou de código de máquina para código-fonte, uma vez que isso é muito mais difícil do que descompilar Java byte-code ou C #.

Vários idiomas e compiladores podem produzir código de máquina, incluindo alguns compiladores Java, C # e Visual Basic. Portanto, o decompiler 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 ao usar linguagens menos restritivas, a saber, C, Pascal ou C ++.

A maioria dos algoritmos pode ser usada para todos os idiomas, por isso vamos usar principalmente exemplos escritos em C. Quando mostramos um algoritmo, vamos usar C ou C ++, uma vez que estes são os idiomas mais disponíveis no Linux e Windows.

Independentemente da linguagem de destino, um descompilador trata principalmente de 3 tipos de entidades:

  • Objetos de código (funções, instruções)
  • Objetos de dados (variáveis globais e locais)
  • Tipos (tipos de variáveis, protótipos de funções)

O problema constante de um decompiler é tentar inferir uma ou mais das três entidades acima de uma seqüência de bytes encontrada no arquivo binário. Para isso, é útil saber como as ferramentas de desenvolvimento (que chamamos de "ferramentas de engenharia diretas") são usadas ao escrever um programa, já que esse é o processo que estamos tentando reverter.