Zelix KlassMaster - Java Obfuscator

Java Name Obfuscation

A first generation Java obfuscator relies primarily on name obfuscation. It changes meaningful class, field and method names to meaningless strings. Name obfuscation makes the decompiled source harder to understand but the overall flow of the code is not obscured.

Although Zelix KlassMaster™ is a second generation Java obfuscator, it also performs excellent name obfuscation. Unlike some other obfuscators, it has been engineered to handle extremely complicated inheritance and interface implementation relationships. Also, Zelix KlassMaster's name obfuscation is absolutely irreversible. Some other obfuscators embed old to new name look up tables in your bytecode. That opens the door to their name obfuscation being reversible.

The new names that Zelix KlassMaster™ generates are extremely short so it reduces the size of your bytecode. See the examples below. Note that in the name obfuscated bytecode, the package, class, field and method names have been renamed and the original local variable names have been removed. Unfortunately, the control flow is still clearly visible. That is why you need Zelix KlassMaster's Flow Obfuscation.

Original Source Next Section

package test;

import java.util.*;

class Demo {

   private Vector buffer = new Vector();

   /**
   * Return the position of the specified String in the 
   * buffer. Remove the String once if it has been found.
   * Return -1 if the String isn't found. */
   int getStringPos(String string) {
      for(int counter=0; counter < buffer.size(); counter++) {
         String curString = (String)buffer.elementAt(counter);
         if (curString.equals(string)) {
            buffer.remove(counter);
            return counter;
         }
      }
      return -1;
   }
}

Name obfuscated (1st Generation Obfuscation) then decompiled First Section

package a;

import java.util.Vector;

class a {

    private Vector a new Vector();

    int a(String s) {
        for(int i = 0; i < a.size(); i++) {
            String s1 = (String)a.elementAt(i);
            if(s1.equals(s)) {
                a.remove(i);
                return i;
            }
        }
        return -1;
    }
}