Goal of Obfuscation
The goal of obfuscation is to create confusion. As confusion builds, the ability of the human mind to comprehend multi-faceted intellectual concepts deteriorates. Note that this precept says nothing about altering the forward (executable) logic – only representing it incomprehensibly. When a well-written obfuscator tool goes to work on readable program instructions, a likely side effect is that the output will not only confuse a human interpreter, it will break a decompiler. While the forward (executable) logic has been preserved, the reverse semantics have been rendered non-deterministic. As a result, any attempt to reverse-engineer the instructions to a “programming dialect” like C# or VB will likely fail because the translation is ambiguous. Deep obfuscation creates a myriad of decompilation possibilities, some of which might produce incorrect logic if recompiled. The decompiler, as a computing machine, has no way of knowing which of the possibilities could be recompiled with valid semantics. Humans write and employ decompilers to automate decompilation algorithms that are too challenging for the mind to follow. It is safe to say that any obfuscator that confuses a decompiler will pose even more of a deterrent to a less-capable human attempting the same undertaking.
Primitive obfuscators essentially rename identifiers found in the code to something that is unreadable. They may use hashing techniques or arithmetically offset the character set to unreadable or unprintable characters. While superficially effective, it is obvious that these are reversible techniques, and as such, are hardly protective. PreEmptive’s obfuscation tools go far beyond this primitive renaming approach with additional ingenious ways of “creating confusion” that make it nearly impossible (and certainly not worth the effort) to reverse-engineer someone else’s intellectual property.