Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Decompilador 
Um decompilador é um programa de computador que executa a operação reversa de um 
compilador. Ou seja, traduzir código ou informação com um baixo nível de abstração 
(apenas projetado para ser lido por um computador, por exemplo, código de máquina ) 
em uma linguagem ou meio com um nível mais alto de abstração (geralmente projetado 
para ser lido por um humano, por exemplo, qualquer linguagem de programação de alto 
nível ). 
 
O termo "descompilar" é comumente aplicado a programas cuja função é traduzir um 
código executável para a fonte, onde: 
o programa executável está em código de máquina, que é uma linguagem de baixo nível 
(na verdade, o menor nível de abstração que existe), a partir da saída de um compilador), 
o código-fonte está em uma linguagem de alto nível, mais inteligível e fácil de modificar, 
com a vantagem de poder ser portado para outra máquina (embora possa precisar de 
algumas alterações). Após este processo, o código-fonte pode ser recompilado para 
produzir novamente um executável que se comportará como o original. 
Por comparação, um desmontador traduz um executável exclusivamente em linguagem 
assembly que, por outro lado, ainda depende do suporte de hardware e ainda tem um nível 
mínimo de abstração (apenas superior ao código de máquina), mas é legível por humanos 
(e este código pode reverter para ser montado em um programa executável). 
Descompilar é o ato de usar um descompilador, embora, se usado como um nome, pode 
se referir à saída de um descompilador. Pode ser usado para recuperar código-fonte e é 
muito útil em casos de segurança de computador, interoperabilidade e correção de erros. 
O sucesso da descompilação depende da quantidade de informações presentes no código 
que está sendo descompilado e da sofisticação da análise realizada nele. Os formatos de 
bytecode usados por muitas máquinas virtuais (como a Java Virtual Machine ou a 
linguagem .NET (.NET Framework Common Language Runtime)) às vezes incluem 
metadados no nível superior que torna a descompilação mais flexível. Linguagens de 
máquina normalmente têm muito menos metadados e, portanto, são muito mais difíceis 
de compilar. 
Alguns compiladores e ferramentas de pós-compilação produzem código ofuscado (isso 
significa que eles tentam produzir uma saída que é muito difícil de descompilar). Isso 
torna mais difícil reverter o código executável. 
Um bom descompilador deve implementar a análise de tipo. Aqui, a maneira como os 
registros ou regiões de memória é usada e resulta em restrições no tipo de locais. Por 
exemplo, uma instrução AND implica que o operando é um inteiro; programas não usam 
tais operações em valores de ponto flutuante (exceto em código de biblioteca especial) ou 
em ponteiros. Uma instrução AND resulta em restrições; ambos os operandos podem ser 
inteiros, ou um inteiro e o outro um ponteiro (neste caso, a terceira restrição surge na 
ordem dos dois operandos quando os tipos são diferentes). 
Várias expressões de alto nível podem ser reconhecidas pelo conhecimento de estruturas 
ou arranjos. No entanto, é difícil distinguir muitas das possibilidades por causa da 
liberdade do código de máquina ou também porque algumas linguagens de alto nível 
como C permitem conversão e aritmética de ponteiro.

Mais conteúdos dessa disciplina