App Hardening includes obfuscation and application self-protection functionality. Only a layered approach can provide the protection you need. Review each section below to learn more.
RENAMING
Renaming obfuscation alters the names of methods, variables, etc., making source code more difficult to understand. Dotfuscator uses a deeper form of obfuscation, developed for Dotfuscator and patented by PreEmptive Solutions, called Overload Induction™. Instead of substituting one new name for each old name, Overload Induction renames as many methods as possible to the same name. After this deep obfuscation, the logic, while not destroyed, is beyond comprehension. The following simple example illustrates the power of the Overload Induction technique:
Original C# Code Before Obfuscation
private void CalcPayroll (SpecialList employeeGroup) {
while(employeeGroup.HasMore()) {
employee = employeeGroup.GetNext(true);
employee.UpdateSalary();
DistributeCheck(employee);
}
}
Reverse-Engineered C# Code After Overload Induction Obfuscation
private void a(a b) {
while (b.a()) {
a = b.a(true);
a.a();
a(a);
}
}
CONTROL FLOW
Traditional control flow obfuscation introduces false conditional statements and other misleading constructs in order to confuse and break decompilers. This process synthesizes branching, conditional, and iterative constructs that produce valid forward (executable) logic, but yield non-deterministic semantic results when decompilation is attempted. Control Flow obfuscation produces spaghetti logic that can be very difficult for a cracker to analyze.
Dotfuscator employs advanced control flow obfuscation. In addition to adding code constructs, Dotfuscator works by destroying the code patterns that decompilers use to recreate source code. The end result is code that is semantically equivalent to the original but contains no clues as to how the code was originally written. Even if highly advanced decompilers are developed, their output will be guesswork.
Original C# Before Obfuscation
public int CompareTo(Object o) {
int n = occurrences –
((WordOccurrence)o).occurrences;
if (n == 0) {
n = String.Compare(word,((WordOccurrence)o).word);
}
return(n);
}
Reverse-Engineered C# After Control Flow Obfuscation
public virtual int _a(Object A_0) {
int local0;
int local1;
local 10 = this.a – (c) A_0.a;
if (local0 != 0) goto i0;
while (true) {
return local1;
}
i1: local10 = System.String.Compare(this.b, (c) A_0.b);
goto i0;
}
