Waitlist

Get early access

Be among the first to protect your Java bytecode with HashGuard. Leave your email and we will tell you when your spot opens.

No Spam, Only Genuine Updates

plrObfuscate

$ ./gradlew plrObfuscate

licence validated

RENAME done

PROTECT_EARLY done

STRING done

CONTROL_FLOW done

STRUCTURE done

DYNAMIC_LAST done

keys build/plr-obfuscated/keys-manifest.json

output build/plr-obfuscated/client_0.jar

Illustration of a build run, not a recording.

  • Headless CLI

    Run HashGuard from a JSON config in any build or CI job, no GUI needed.

  • Gradle plugin

    One plrObfuscate task writes a protected jar for every slot.

  • Output budget

    maxOutputRatio stops the heavy passes before the jar balloons.

  • Keep annotations

    Mark what must stay readable with @KeepName and @KeepSignature.

FAQ’s

Frequently Asked Questions

A Java bytecode obfuscator by Polar Studios, built on ASM 9.9. It runs as a headless CLI or through a Gradle plugin, and works on plain JVM bytecode with Minecraft 1.7.10 clients on Java 25 as the first target.

Minecraft 1.7.10 clients running on Java 25 are the primary target, and any JVM bytecode can be processed. String encryption has a Java 8 compatible invokedynamic fallback, and the engine itself is built with a Java 25 toolchain.

magicCrypter replaces the CAFEBABE header and encrypts every class with AES-128-CTR and zlib. It requires the PLR JVM (PLR-JAVA-25), a patched JVM that decrypts classes at load time with the slot keys. Without those keys the classes fail with a ClassFormatError.

Renaming changes names, so anything looked up by name must be kept. Annotate it with @KeepName or @KeepSignature, use @NoObfuscation or @ExcludeTransformers, or add an exclude rule. The access transformer already skips @SerializedName fields so Gson keeps working.

Apply the fr.polargames.plr-obfuscator plugin and set inputJar, configFile and slotCount in the plrObfuscator block. Then run ./gradlew plrObfuscate, which writes the obfuscated jars to build/plr-obfuscated.

slotCount (1 to 100) makes one run produce that many jars. Each slot gets its own random seed and derived AES and HMAC keys, written to keys-manifest.json. Seeds are never stored, so every build rotates the keys.

The CLI validates your customer licence once before any obfuscation work starts, including multislot runs. Provide the key with PLR_LICENCE_KEY or the OS keyring. The source repository itself is MIT licensed, as a heavily rewritten fork of Bozar.

45 transformers run in six phases, from renaming and string encryption to control-flow flattening, invokedynamic indirection, ghost members, anti-tamper and integrity checks. Profiles from Ghost to Extreme set the baseline, and explicit options override it.

Some transformers add runtime cost. maxOutputRatio caps the output at a multiple of the input instruction count (the sample config uses 2.0), and heavy passes such as flattening stop once the budget is spent. Flattening loops is a separate option because it costs more on hot loops.

Set mappingOutput and HashGuard writes an old-to-new name mapping as JSON. You can feed it to JProfiler or any other tooling to translate obfuscated names back.