Simplificando, a descompilação é o inverso da compilação: a tradução de um arquivo executável para um idioma de nível superior.
Suponha que você perca a fonte do seu projeto Delphi e tenha apenas o arquivo executável: a engenharia reversa (descompilação) é útil se as fontes originais não estiverem disponíveis.
Hum, "fontes não disponíveis", isso significa que podemos descompilar os projetos Delphi de outras pessoas? Bem, sim e não ...
É possível a verdadeira descompilação?
Não, claro que não. A descompilação totalmente automatizada não é possível - nenhum descompilador pode reproduzir exatamente o código-fonte original.
Quando um projeto Delphi é compilado e vinculado para produzir um arquivo executável independente, a maioria dos nomes usados no programa é convertida em endereços. Essa perda de nomes significa que um descompilador precisaria criar nomes exclusivos para todas as constantes, variáveis, funções e procedimentos. Mesmo que um certo grau de sucesso seja alcançado, o "código-fonte" gerado não possui nomes significativos de variáveis e funções.
Obviamente, a sintaxe do idioma de origem não existe mais no executável. Seria muito difícil para um decompilador interpretar a série de instruções de linguagem de máquina (ASM) que existem em um arquivo executável e decidir qual era a instrução original de origem.
Por que e quando usar a descompilação
A engenharia reversa pode ser usada por vários motivos, alguns dos quais são:
- Recuperação do código fonte perdido
- Migração de aplicativos para uma nova plataforma de hardware
- Determinação da existência de vírus ou código malicioso no programa
- Correção de erros quando o proprietário do aplicativo não está disponível para fazer a correção.
- Recuperação do código fonte de outra pessoa (para determinar um algoritmo, por exemplo).
Isso é legal?
A engenharia reversa NÃO está quebrando, embora às vezes seja difícil traçar a linha tênue entre esses dois. Os programas de computador são protegidos por leis de direitos autorais e marcas comerciais. Diferentes países têm diferentes exceções aos direitos do proprietário dos direitos autorais. Os mais comuns afirmam que é aceitável descompilar: para fins de interpretabilidade, onde a especificação da interface não foi disponibilizada, para o fins de correção de erros quando o proprietário dos direitos autorais não estiver disponível para fazer a correção, para determinar partes do programa que não são protegidas por direito autoral. Claro que você deve ter muito cuidado / entre em contato com seu advogado se tiver dúvidas se tem permissão para desmontar o arquivo exe de algum programa.
Nota: se você está procurando rachaduras no Delphi, geradores de chaves ou apenas números de série: você está no site errado. Lembre-se de que tudo o que você encontra aqui é escrito / apresentado apenas para fins educacionais / de exploração.
No momento, a Borland não oferece nenhum produto capaz de descompilar um arquivo executável (.exe) ou a "unidade compilada Delphi" (.dcu) de volta ao código-fonte original (.pas).
Unidade compilada Delphi (DCU)
Quando um projeto Delphi é compilado ou executado, um arquivo de unidade compilada (.pas) é criado. Por padrão, a versão compilada de cada unidade é armazenada em um arquivo de formato binário separado com o mesmo nome que o arquivo da unidade, mas com a extensão .DCU. Por exemplo, unit1.dcu contém o código e os dados declarados no arquivo unit1.pas.
Isso significa que, se você tem alguém, por exemplo, a fonte compilada do componente, tudo o que você precisa fazer é revertê-lo e obter o código. Errado. O formato do arquivo DCU não está documentado (formato proprietário) e pode mudar de versão para versão.
Após o compilador: Delphi Reverse Engineering
Se você gostaria de tentar descompilar um arquivo executável Delphi, estas são algumas das coisas que você deve saber:
Os arquivos de origem dos programas Delphi geralmente são armazenados em dois tipos de arquivos: arquivos de código ASCII (.pas, .dpr) e arquivos de recursos (.res, .rc, .dfm, .dcr). Os arquivos DFM contêm os detalhes (propriedades) dos objetos contidos em um formulário. Ao criar um exe, O Delphi copia as informações dos arquivos .dfm para o arquivo de código .exe finalizado. Os arquivos de formulário descrevem cada componente em seu formulário, incluindo os valores de todas as propriedades persistentes. Toda vez que alteramos a posição de um formulário, a legenda de um botão ou atribuímos um procedimento de evento a um componente, o Delphi grava essas modificações em um arquivo DFM (não o código do procedimento de evento - ele é armazenado no arquivo pas / dcu Arquivo). Para obter o "dfm" do arquivo executável, precisamos entender que tipo de recursos são armazenados dentro de um executável do Win32.
Todos os programas compilados pelo Delphi possuem as seguintes seções: CODE, DATA, BSS, .idata, tls, .rdata, .rsrc. O mais importante do ponto de vista de descompilação são as seções CODE e .rsrc. No "Adicionando funcionalidade a um programa Delphi"são mostrados alguns fatos interessantes sobre o formato dos executáveis do Delphi, informações da classe e recursos do DFM: como reatribuir eventos a serem manipulados por outros manipuladores de eventos definidos da mesma forma. Ainda mais: como adicionar seu próprio manipulador de eventos, adicionando o código ao executável, que mudará a legenda de um botão.
Entre muitos tipos de recursos armazenados em um arquivo exe, o RT_RCDATA ou o recurso definido pelo aplicativo (dados brutos) mantém as informações que estavam no arquivo DFM antes da compilação. Para extrair os dados do DFM de um arquivo exe, podemos chamar o EnumResourceNames Função API... Para obter mais informações sobre como extrair o DFM de um executável, consulte: Codificando um Delphi DFM Explorer artigo.
A arte da engenharia reversa tem sido tradicionalmente a terra dos assistentes técnicos, familiarizados com a linguagem assembly e depuradores. Apareceram vários decompiladores Delphi que permitem que qualquer pessoa, mesmo com conhecimento técnico limitado, faça engenharia reversa da maioria dos arquivos executáveis Delphi.
Se você está interessado em programas Delphi de engenharia reversa, sugiro que você dê uma olhada nos seguintes "decompiladores":
Um descompilador de arquivos executáveis (EXE) e bibliotecas dinâmicas (DLL), escrito em Delphi e executado no ambiente Windows32. O objetivo final do projeto é o desenvolvimento do programa capaz de restaurar a maior parte do Delphi inicial códigos fonte do arquivo compilado, mas o IDR, assim como outros descompiladores Delphi, ainda não podem fazê-lo. No entanto, o IDR está em um status considerável para facilitar esse processo. Em comparação com outros descompiladores Delphi conhecidos, o resultado da análise IDR tem a maior integridade e confiabilidade.
O Revendepro encontra quase todas as estruturas (classes, tipos, procedimentos, etc.) no programa e, gera a representação pascal, os procedimentos serão escritos no assembler. Devido a algumas limitações no assembler, a saída gerada não pode ser recompilada. A fonte desse descompilador está disponível gratuitamente. Infelizmente, este é o único descompilador que não pude usar - ele solicita uma exceção quando você tenta descompilar algum arquivo executável do Delphi.
O EMS Source Rescuer é um aplicativo de assistente fácil de usar que pode ajudá-lo a restaurar seu código-fonte perdido. Se você perder as fontes do projeto Delphi ou C ++ Builder, mas tiver um arquivo executável, essa ferramenta poderá recuperar parte das fontes perdidas. O Rescuer produz todos os formulários de projeto e módulos de dados com todas as propriedades e eventos atribuídos. Os procedimentos de eventos produzidos não têm um corpo (não é um decompilador), mas têm um endereço de código no arquivo executável. Na maioria dos casos, o Rescuer economiza de 50 a 90% do seu tempo para projetar a restauração.
O DeDe é um programa muito rápido que pode analisar executáveis compilados com o Delphi. Após a descompilação, o DeDe fornece o seguinte:
- Todos os arquivos dfm do destino. Você poderá abrir e editá-los com o Delphi.
- Todos os métodos publicados no código ASM bem comentado, com referências a strings, chamadas de função importadas, chamadas de métodos de classes, componentes na unidade, blocos Try-Except e Try-Finalmente. Por padrão, o DeDe recupera apenas as fontes de métodos publicadas, mas você também pode processar outro procedimento em um executável se souber o deslocamento do RVA usando o Tools | Desmonte o menu Proc.
- Muita informação adicional.
- Você pode criar uma pasta de projeto Delphi com todos os arquivos dfm, pas, dpr. Nota: os arquivos pas contêm o código ASM bem comentado acima mencionado. Eles não podem ser recompilados!