I think it comes down to which problem you are trying to solve:
1) Recover enough to understand the program and make small changes (this is the cracking case).
2) Recover the original code of the program or something close to it, that can be 'stolen' and maintained without much more overhead than if you had the original code.
(1) is not easy, but is becoming easier. (2) is still a long way off, and isn't solvable without a good understanding of the ___domain the original code was written for.
There are legitimate cases for (2). I've worked in companies that have lost the source code to programs developed. If you're wondering how source code can be lost---think of no revision control, a poor backup policy, and a program that goes a long time between modifications.
(1) is not easy, but is becoming easier. (2) is still a long way off, and isn't solvable without a good understanding of the ___domain the original code was written for.