Como descompilar um .NET EXE em código-fonte C # legível?

259

Eu escrevi um aplicativo C # para um cliente alguns anos atrás, mas não tenho mais o código fonte. Tudo o que tenho é o EXE que implantei no PC do cliente. Existe uma maneira de gerar código-fonte C # a partir do EXE?

MusiGenesis
fonte
2
Está bem. Olha aqui ... Teleriks JustDecompile realmente compilado do que a Red Gates, refletor completamente asneira ... houve numerosos problemas com refletor ... JustDecompile ... impecável até agora ... DLL
Marc Johnston
1
Estou usando o JustDecompile há bastante tempo e é realmente bom descompilar e empacotar os arquivos de origem como um pronto para compilar o csproject. Ele é realmente ativo no desenvolvimento e parece não haver problemas em aberto em seu repositório github.com/telerik/JustDecompileEngine
David Chelliah

Respostas:

194

Refletor e seu suplemento FileDisassembler .

Refletor permitirá ver o código fonte. O FileDisassembler permitirá convertê-lo em uma solução VS.

GEOCHET
fonte
4
Minha cópia do Reflector possui a opção "Exportar ..." e não tenho plug-ins instalados. Ele cria um projeto do VS com todo o código-fonte e recursos. Então, por que todo mundo está sugerindo o FileDisassembler? É melhor?
7278 Lucas
Lucas: Fora da caixa, eu não vi o refletor capaz de fazer isso. FileDisassembler sempre foi o único caminho. Isso pode ter mudado na história recente, embora eu acho. Vou dar uma olhada.
GEOCHET
SALVADOR DE VIDA! burro burro TFS excluiu meu projeto. Embora eu tenha dito ao TFS para se excluir, mas não esperava que ele removesse o projeto do sistema de arquivos local. agradece a todos a mesma. x
Christo 28/05
Onde está FileDisassembler? : /
Tom Stickel
Funciona apenas para a estrutura .Net. alguma ferramenta que funcione para .Net core 3.0 exe?
Somnath Kadam
144

Quando o Red Gate disse que não haveria mais uma versão gratuita do .Net Reflector, comecei a usar o ILSpy e o JustDecompile da Telerik . Eu encontrei o ILSpy para descompilar com mais precisão do que o JustDecompile (que ainda está na versão beta). O Red Gate mudou sua decisão e ainda tem uma versão gratuita do .Net Reflector, mas agora eu gosto do ILSpy.

No site do ILSpy ( https://github.com/icsharpcode/ILSpy/ ):

O ILSpy é o navegador e descompilador de montagem .NET de código aberto.

Recursos do ILSpy

  • Navegação na montagem
  • Desmontagem IL
  • Descompilação para C #
  • Suporta lambdas e 'yield return'
  • Mostra documentação XML
  • Economia de recursos
  • Procure tipos / métodos / propriedades (substring)
  • Navegação por tipo / método / propriedade baseada em hiperlink
  • Navegação por tipos base / derivados
  • Histórico de navegação
  • Descompilador BAML para XAML
  • Salvar montagem como projeto C #
  • Encontre o uso do campo / método
  • Extensível via plugins (MEF)

Atualizar:

15 de abril de 2012, o ILSpy 2.0 foi lançado. Novos recursos em comparação com a versão 1.0:

  • Listas de montagem
  • Suporte para descompilar árvores de expressão
  • Suporte para operadores operados em anuláveis
  • Descompilar para Visual Basic
  • Procure várias seqüências de caracteres separadas por espaço (procurar "Gerenciador de montagem" no ILSpy.exe encontraria o AssemblyListManager)
  • Clicar em uma variável local destacará todas as outras ocorrências dessa variável
  • Ctrl + F pode ser usado para pesquisar na visualização de código descompilada

Atualizar:

  • O ILSpy 2.1 suporta descompilação assíncrona / à espera
Daniel
fonte
1
Estou usando o 2.2 e ele suporta a descompilação para IL, VB.NET e C #. Achei isso muito útil.
VoteCoffee
1
Parece que a Telerik está interessada em coletar informações questionáveis ​​do computador em execução e o ILSpy não pode ser compilado a partir de fontes. O binário ILSpy também mistura nomes de variáveis ​​e coloca alguns caracteres estranhos no código-fonte.
AaA 27/04
1
Observe que o ILSpy inclui um suplemento do Visual Studio. Para o ILSpy 2.4, adicionei a capacidade de navegar do código-fonte do Visual Studio diretamente para a saída descompilada. Infelizmente, houve algumas correções mais recentes que agora são mescladas à linha principal do ILSpy, mas não foram lançadas na versão 2.4.
yoyo
Brilhante! Há uma empresa de software que cobra às pessoas £ 100 por tempo para que usem uma ferramenta "especial" em seu servidor para corrigir problemas. Conseguiu obter uma cópia da ferramenta que eles usavam enquanto conectado e, em seguida, conseguiu usar o ILSpy com muita facilidade para obter a senha de desbloqueio da ferramenta. Chega de roubar clientes!
precisa saber é o seguinte
O ILSpy é o melhor #
Pritam
65

O Reflector não é mais gratuito em geral, mas eles oferecem gratuitamente para desenvolvedores de código aberto: http://reflectorblog.red-gate.com/2013/07/open-source/

Mas algumas empresas como DevExtras e JetBrains criaram alternativas gratuitas:

DevExtras CodeReflect

JetBrains DotPeek

arco
fonte
5
Refletor é como 35 $. Quebrando o banco, eu sei, mas vale 10 vezes isso.
StingyJack 5/10
7
Vale a pena adicionar o Telerik JustDecompile à lista de descompiladores de montagem .NET gratuitos também. telerik.com/justdecompile
Todd
3
@StingyJack: Ótimo, parece que eles ouviram você! Agora, na verdade, é 10 o preço, a US $ 368, se você quiser o desmontador VS2012. : /
DeepSpace101
1
Eu não os oponho por ganhar dinheiro, mas o ILSpy (mencionado) na resposta de @ Daniel é o que estou usando agora.
StingyJack #
1
Agora custa US $ 100 para a versão padrão e US $ 200 para a versão que se integra ao Visual Studios. Isso é um pedaço de uma taxa de inflação. Embora eles ofereçam coisas de graça para desenvolvedores de código aberto: reflectorblog.red-gate.com/2013/07/open-source
VoteCoffee
35

Reflector e o suplemento File Disassembler de Denis Bauer. Na verdade, ele produz projetos de origem a partir de montagens, onde o Reflector por si só exibe a fonte desmontada.

ADICIONADO: O meu favorito mais recente é o dotPeek do JetBrains .

ProfK
fonte
Eu gosto que o dotPeek permita trabalhar com uma pasta inteira facilmente, mas a partir de hoje eles só são descompilados em c #. A maioria dos outros decompiladores também faz vb e IL. Ele também suporta apenas Net 4.5, enquanto o Telerik suporta 4.5.1.
VoteCoffee
então o dotPeek é totalmente gratuito ou eles têm restrições para a versão paga ?. Eu não conseguia ver nenhuma informação no site jetbrains sobre isso.
batmaci
29

O Telerik JustDecompile é gratuito e possui um recurso para criar projetos a partir de assemblies .NET.

kodefuguru
fonte
A Telerik oferece a capacidade de descompilar para VB.NET, IL ou C # .NET que eu achei útil. Ele também seleciona automaticamente a estrutura e possui um plug-in disponível para desofuscação. Além disso, ele suporta o .NET 4.5.1. Parece muito bom.
VoteCoffee
1
Tentei todas as soluções aqui neste post e o JustDecompile foi o único que funciona perfeitamente para mim.
Alvaro Pereira
24

Estou surpreso que ninguém tenha mencionado o ildasm da Microsoft . Pode não ser tão bonito quanto o ILSpy ou o Reflector, mas vem com o Visual Studio que muitos desenvolvedores já o possuem.

Para executá-lo (assumindo o VS 2013, deve ser semelhante para outras versões):

  1. Selecione Iniciar> Todos os Programas> Visual Studio 2013> Ferramentas do Visual Studio.
  2. Clique duas vezes no prompt de comando do desenvolvedor para VS2013.
  3. Execute "ildasm" no prompt de comando resultante.
  4. Na ferramenta, selecione Arquivo> Abrir e abra seu executável ou DLL.

Agora você pode navegar na estrutura da DLL. Clique duas vezes nos alunos para ver a IL. Use Arquivo> Dump para exportar a IL para um arquivo.

yoyo
fonte
Acho o IL DASM um pouco bárbaro. Ele mostra a árvore, mas quando o botão direito do mouse não faz nada, acho isso insano. Além disso, o despejo da exportação para o arquivo é basicamente lixo. Veja como isso é remotamente útil?
Tom Stickel #
4
Eu nunca afirmei que o ildasm era a melhor opção, apenas que ele está disponível e funciona. # ¯_ (ツ) _ / ¯
yoyo
Não, não é frágil.
yoyo
Fiquei realmente surpreso que o dotPeek não me permitisse procurar em toda a Assembléia uma string que eu sabia que estava lá. ildasm pode não ser bonito, mas pelo menos tem uma opção de despejo que me ajudou a localizar a classe que continha a string que eu estava procurando.
Gabe Halsmer