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.