Pretty often, software are not totally brought down to the source code level or simply cannot, but they are brought down till the assembly language level. Assembly language is a CPU understandable language which is different for different CPU architectures.
Assembly language has certain instructions known as assembly codes which define the flow of a program, the program structure, functions, etc. Everything that the software is capable of doing can be modified or deleted using these codes. Debugging is finding bugs in our software and correcting them, as and when necessary.
Debugging is most often done at development phase, which means when the software is being coded or developed. However, at times, some bugs and errors cannot be corrected at this phase.
Some of these bugs can be identified and corrected when the concerned program's source code is small but it becomes extremely difficult to correct bugs when the code is huge and complex. Reverse engineering can help programmers build better software by eliminating bugs by just understanding its techniques, procedures, and tools.
This process is not just about the bugs, but the entire aspect of developing software becomes absolutely crisp and perfect. Extensibility with the use of reverse engineering is also a major advantage, like we generally see patches being released by software companies for a security exploit or lack of required feature.
Today, many crackers are born on the information highway lanes who exploit and misuse technology. Crackers are people who reverse engineer software, not for the purpose of debugging but rather for breaking into it. They use its tools and techniques to hack authentication security mechanisms.
Crackers steal passwords and patch software illegally, which they can automate by creating cracks. Cracks are small utility programs which are distributed across the Internet and emails, which help other people break security mechanisms of software with just a click of button, and without any prior knowledge.
Although this process has caused and continues to cause certain problems, but it is here to stay, to help and to build better software. As the old saying goes, "What's good, is going to be broken!", the only way out of the misuse of reverse engineering is to "outwit the cracker."