➢ Evaluating Software Quality and Robustness: Ensure the quality of software
before purchasing it by performing heuristic analysis of the binaries to check for
certain instruction sequences that appear in poor quality code.
➢ Legacy Software Maintenance, Re-engineering, and Evolution: Recover the
design of legacy software modules when source is not available to make possible
the maintenance, evolution, and reuse of the modules.
3 Reverse Engineering in Software Security
From the perspective of a software company, it is highly desirable that the
company’s products are difficult to pirate and reverse engineer. Making software difficult
to reverse engineer seems to be in conflict with the idea of being able to recover the
software’s design later on for maintenance and evolution. Therefore, software
manufacturers usually don’t apply anti-reverse engineering transformations to software
binaries until it is packaged for shipment to customers. Software manufacturers will
typically only invest time in making software difficult to reverse engineer if there are
particularly interesting algorithms that make the product stand out from the competition.
Making software difficult to pirate or reverse engineer is often a moving target
and requires special skills and understanding on the part of the developer. Software
developers who are given the opportunity to practice anti-reversing techniques might be
in a better position to help their employer, or themselves, protect their intellectual
property. As  states, “to defeat a crook you have to think like one.” By reverse
engineering viruses or other malicious software, programmers can learn their inner