327
There are many cases where it is beneficial to create software that is immune to
reversing. This chapter presents the most powerful and common reversing
approaches from the perspectives of both a software developer interested in
developing a software program and from the perspective of an attacker
attempting to overcome the antireversing measures and reverse the program.
Before I begin an in-depth discussion on the various antireversing tech-
niques and try to measure their performance, let’s get one thing out of the way:
It is never possible to entirely prevent reversing. What is possible is to hinder
and obstruct reversers by wearing them out and making the process so slow
and painful that they just give up. Whether some reversers will eventually suc-
ceed depends on several factors such as how capable they are and how moti-
vated they are. Finally, the effectiveness of antireversing techniques will also
depend on what price are you willing to pay for them. Every antireversing
approach has some cost associated with it. Sometimes it’s CPU usage, some-
times it’s in code size, and sometimes it’s reliability and robustness that’s
affected.
Why Antireversing?
If you ignore the costs just described, antireversing almost always makes
sense. Regardless of which application is being developed, as long as the end