About a year ago I blogged strategically on decoys but I promised a second post. Here it is. Quite simply almost out of the user-manual, there are many levels of how our tamper-proofing implementation makes use of decoys.
Some instructions are like red flags, they only occur in “suspicious” circumstances. Besides generating such instructions on the fly, our tool generates a few of these instruction in a whole bunch of places, adding just a small container of extra needles to the proverbial hay stack. Let the attacker guess which the right needle is.
Not just instructions maybe be recognized, the same is true for instruction patterns. In fact, looking for pattern is a common attack method. (While this is not topic relevant, rest assured there is quite some effort in the tool to avoid patterns). More relevant to the topic: when some vanilla extra code is needed somewhere, the tool can nicely generate known patterns it otherwise tries to avoid.
And of course, extra, never executed code can be added. Let the attacker spend the appropriate extra effort. Software engineers can easily forget how resourceful and clever attackers are. Attackers worth that name will use good statistics of instructions used or groups of instructions and find out that some code just doesn’t quite look right. The most clever solution to get code with a particular distribution for a specific application is also the most simple one: Just let the programmer specify some extra binary input files of his choice, the tool will simply use those instructions and not worry about any math, statistics, or being fancy. Using code found in the real application to be protected as decoys however would be a rather stupid idea.
Extra code might be more than a bundle of instructions to look at: We distinguish such simple extra instruction sequences from more clever instruction sequences which also get executed and have not much effect. But unlike the former, such code will really be executed in the running application.
Don’t forget: the tool only does the tool’s work; to really fool an attacker the programmer can help with extra decoys really looking attractive. This touches one of our standard mantras: an application doesn’t need to be changed at all to be protected, but when a real first class, high level protection is desired, efforts of the tool can be highly augmented by a programmer who knows what he is doing.