ReverseEngineering is about presenting a piece of software at a higher level of abstraction. It can be based on sources or on binaries:
Reverse Engineering Source Code
When reverse engineering source code, you try to analyze it in order to present it at higher levels of abstraction. TheSourceCodeIsTheDesign, and ReverseEngineeringTools can help you to actually see this design. This can be done in several ways:
Without the source, you may be able to recover a new source text from an executable. For example, the source recovery company http://www.source-recovery.com/ does some very clever tricks to recover CobolLanguage sources from mainframe loads -- using all possible knowledge about compilers used and all their weird flags.
An alternative is to distill a (possibly secret) API from a binary: this is what MattPietrek has done with the Windows API.
Product reverse engineering may involve describing the functionality and requirements for an existing product, which then can be rebuilt in a completely new way (similar to the way in which StarOffice mimics Office functionality).
Legal Issues
The legal issues of reverse engineering are discussed by Cristina Cifuentes and Anne Fitzgerald in IEEE IT Professional, Vol. 1, No. 2, March/April 1999, http://csdl.computer.org/comp/mags/it/1999/02/f2042abs.htm (Cristina also did some exciting work in the area of binary translation turning sparc code into pentium code and vice versa).
Reverse Engineering resources
ReverseEngineering is a subject of ongoing research: topics include design pattern extraction, clone detection for finding (almost) duplicate code, decompilation, and architecture extraction. The researchers even try to invent clever tricks for dealing with LegacyCode. For recent research results, follow the IEEE Working Conference on Reverse Engineering (WCRE), in 2001 in Stuttgart, Germany (see http://reengineer.org)
Last but not least, there is a separate wiki providing a roadmap to reverse and re-engineering research available at the ProgramTransformationWiki.
Reverse Engineering Illustrated
Clean Room Design (http://en.wikipedia.org/wiki/Clean_room_design) -- One person or group takes a device apart and describes what it does in as much detail as possible at a higher level of abstraction than the specific code. That description is then given to another group or person who has absolutely no knowledge of the specific device in question. This second party then builds a new device based on the description. The end result is a new device that works identically to the original but was created without any possibility of specifically copying the original.