Are there any tools available to take an already compiled .dll or .exe file that you know was compiled from C# or Visual Basic and obtain the original source code from it?
ILSpy is a great open-source decompiler.
- Assembly browsing
- IL Disassembly
- Support C# 5.0 "async"
- Decompilation to C#
- Supports lambdas and 'yield return'
- Shows XML documentation
- Decompilation to VB
- Saving of resources
- Save decompiled assembly as .csproj
- Search for types/methods/properties (substring)
- Hyperlink-based type/method/property navigation
- Base/Derived types navigation
- Navigation history
- BAML to XAML decompiler
- Save Assembly as C# Project
- Find usage of field/method
- Extensible via plugins (MEF)
- Assembly Lists
I've used JetBrains dotPeek (free of charge) before with some success.
Any JetBrains software I've ever used has been very solid.
It is not quite the 'original source' but it is very readable C# - about the closest thing I would expect to get. Quote from their website:
What's Cool about dotPeek?
- Decompiling .NET 1.0-4.5 assemblies to C#
- Support for .
- Quick jump to a type, assembly, symbol, or type member
- Effortless navigation to symbol declarations, implementations, derived and base symbols, and more
- Accurate search for symbol usage with advanced presentation of search results
- Overview of inheritance chains
- Support for downloading code from source servers
- Syntax highlighting
- Complete keyboard support
- dotPeek is free!
The last point is free as in free beer, not as in free speech.
There is a free tool available called JustDecompile which does that.
- Creating a Visual Studio project from an assembly in order to export lost projects or obtain multiple classes without the need to copy and paste code. At present, JustDecompile is able to export decompiled code only to C#.
- Exporting code directly from the command prompt
- Quickly loading core .NET assemblies (.NET 2, .NET3.5, .NET 4, .NET 4.5, WinRT Metadata and Silverlight)
- Directly editing assemblies loaded into the program
Recently I've been using dnSpy [forked from ILSpy by the creator(s) of de4dot] as my main tool for the decompiling and live debugging of .NET code
Main difference from ILSpy :
- Uses dnLib to read assemblies (vs ILSpy's Mono.Cecil)
dnlib was created because de4dot needed a robust .NET assembly library that could handle all types of obfuscated assemblies. de4dot used to use Mono.Cecil but since Mono.Cecil can't handle obfuscated assemblies, doesn't fully support mixed mode assemblies, doesn't read .NET assemblies the same way the CLR does and many other missing features de4dot needed, dnlib was a necessity. The API is similar because it made porting de4dot to dnlib a lot easier.
I have used .NET Reflector (Note: Commercial, but trial available) several times and quite like it:
If you are interested into a decompiler on API level: https://code.google.com/p/facile-api/ (in Java though)
I would second the answer about ILSPY as being a really great.net decompiler. Also, checkout de4dot for deobfuscation. This is a cool writeup of it in action. http://blogs.cisco.com/security/talos/reversing-multilayer-net-malware
Compiled visual basic can be a different and painful animal. http://vrt-blog.snort.org/2014/08/discovering-dynamically-loaded-api-in.html?m=1