Como Oli já apontou em sua resposta, você não pode obter o código fonte muito original de um executável.
Durante a compilação de um código fonte (compilação pretendida como em sua aceitação mais ampla típica, portanto, como todo o processo que "transforma" um código fonte em um executável), muitas informações são perdidas.
O pré-processador C, por exemplo, fará o seguinte (entre outras coisas):
- Interpretar, executar e remover diretivas de pré-processador (
#
instruções)
- Remover comentários
- Remova espaços em branco desnecessários
Por outro lado, o que não é perdido durante a compilação do código fonte é tecnicamente reversível para um código fonte funcionalmente equivalente.
Isto é porque:
- As instruções binárias têm uma correlação 1: 1 com as instruções de montagem; a montagem de um código-fonte de montagem é apenas uma mera conversão das instruções de montagem em instruções binárias com base em uma tabela de correspondências; uma única instrução binária é sempre identificável e reversível a uma única instrução de montagem ;
- As instruções de montagem não têm uma correlação 1: 1 com as instruções C; a compilação de um código-fonte C geralmente não é apenas uma mera conversão das instruções C para as instruções de montagem com base em uma tabela de correspondências; na verdade, é muitas vezes o contrário; geralmente uma instrução C é convertida em várias instruções de montagem (geralmente diferentes com base no compilador); no entanto, padrões de várias instruções de montagem são geralmente identificáveis e reversíveis para uma única instrução C ;
Existem ferramentas chamadas descompiladores cujo objetivo é tentar reverter um executável para um código-fonte funcionalmente equivalente; no entanto, o resultado geralmente é algo muito distante do código fonte muito original (e geralmente também não compilável);
Considere este programa:
#include <stdio.h>
#define MESSAGE "Literal strings will be recovered" // This preprocessor directive won't be recovered
/*
This comment and the comment above won't be recovered
*/
int main(int argc, char* argv[]) {
printf(MESSAGE);
return 0;
}
Compilando-o em um executável e descompilando-o em um código-fonte novamente, é mais ou menos o que você costuma receber de volta (nesse caso específico, usei gcc
/ Boomerang ):
// address: 0x80483fb
int main(int argc, char **argv, char **envp) {
printf("Literal strings will be recovered");
return 0;
}
Como previsto:
- Diretivas de pré-processador estão ausentes
- Faltam comentários (além do
// address: 0x80483fb
que foi adicionado pelo decompilador)
- Falta espaço em branco desnecessário (além de novas linhas e tabulações, que foram adicionadas pelo decompilador)
Este também é um resultado muito bom; não é raro obter instruções de montagem embutidas no código:
asm("assembly_instruction");
__asm__("assembly_instruction");
A linha inferior é (como já indicado nas outras respostas): você não pode obter a fonte original de um executável *.
* No entanto, dependendo do executável e da sua sorte, você poderá obter algo usando um descompilador.
strings
programa de filtro pode ser muito útil para identificar o que um programa binário específico é ou faz, porque imprimirá todas as seqüências de texto incorporadas por mais de um comprimento especificado em um arquivo binário e observar as mensagens em um programa às vezes diz muito sobre o que é e faz.