Protect Your Java, Kotlin and Android Applications
Obfuscation is much more than just renaming! Only a layered obfuscation approach can provide the protection you need. Review each section below to learn more.
RENAMING
Renaming alters the names of methods, variables, etc., making source code more difficult to understand. DashO uses a deeper form of obfuscation, 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 Source Code Before Obfuscation
private void CalcPayroll (SpecialList employeeGroup) {
while(employeeGroup.HasMore()) {
employee = employeeGroup.GetNext(true);
employee.UpdateSalary();
DistributeCheck(employee);
}
}
Reverse-Engineered Source 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.
DashO employs advanced control flow obfuscation. In addition to adding code constructs, DashO 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 Source Code 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 Source Code 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;
i0: local1 = local10;
}
i1: local10 = System.String.Compare(this.b, (c) A_0.b);
goto i0;
}
