I am starting to learn reverse engineering and wanted to know what tools people are using and what the pros and cons are to each. I have been using .Net Reflector to reverse engineer .Net apps but I also have to work with old COM dlls and it would be great to figure out what they are doing. Many of the developers who wrote them didn't check the code into source control and the binaries are out on the production servers. Any help would be appreciated.
If you have symbols for your COM dlls, you can set breakpoints on the interface implementations and set through the disassembly in NTSD.
Ollydbg is a great free tool for analyzing and debugging native apps and DLLs. Also the various tools from HeavenTools are really useful. Native code is not quite as easy as reversing .NET, you'll generally need a solid foundation in x86 assembly language to get very far.
If you are referring too reverse engineering in general you might also check out tools like Wireshark for network protocol sniffing
http://www.reversing.be/ was one of my favorite learning sources of reverse engineering. There are a good crackmes and solutions for begineers to explore techniques. I also recommend reading http://ourworld.compuserve.com/homepages/ernies_world/a.htm (comic sans, aarrghh my eyes...) that have information about COM in assembly.
Also, there's a fairly comprehensive freely available wikibook on Reverse Engineering.
IDA Pro is an interactive disassembler. Which work both with .NET and native executables. It has a decompiler plugin (HexRays). Also it has a debugger. It is very expensive but there's a free version.