Identifier Renaming
Rename classes, fields and methods in Alphabet, Invisible or IlIl style.
Rename, encrypt and reshape Java bytecode with a headless CLI or a Gradle plugin, built on ASM 9.9.
No credit card required
Built for Minecraft clients first, works on any JVM bytecode.
Product Overview
Follow one run through the pipeline: every transformer has a phase and runs in a fixed order.
Rename classes, fields and methods in Alphabet, Invisible or IlIl style.
Turn method bodies into switch-driven state machines with opaque predicates.
Shard and encrypt string pools, and mask numeric constants.
Keep names and signatures readable with @KeepName and @KeepSignature.
Calls become invokedynamic sites backed by encrypted blobs.
Detects agents and debuggers at runtime.
magicCrypter encrypts every class with AES-128-CTR.
Apply the plugin, run plrObfuscate and get one jar per slot.
Benefits
From the first rename to the last invokedynamic rewrite, every pass is made to run unattended in CI.
Run it from a JSON config in CI, with no GUI in the way.
One plrObfuscate task builds up to 100 jar slots for your client.
Six phases keep every pass in a safe, fixed order.
maxOutputRatio stops heavy passes before the output outgrows your limit.
Annotations and exclude rules keep reflection and serialization safe.
Export a mapping file to decode obfuscated traces in your profiler.
45
Transformers
100
Jar slots per build
5
Preset profiles
Pricing
€19 per licence / month
For a single project
Licence checked once per run
€49 per licence / month
Licence checked once per run
€149 per licence / month
Licence checked once per run
Pipeline
Transformers run in phase order, from renaming to the final dynamic pass, so each protection builds on the last.
6
Ordered pipeline phases
45
Built-in transformers
Configuration
Our Team
Compatibility
HashGuard works on plain JVM bytecode. Minecraft 1.7.10 clients on Java 25 come first, and string encryption keeps a Java 8 compatible fallback.
Minecraft clients first
Primary target runtime
String encryption fallback
Testimonials
The Gradle plugin dropped into our build in minutes, and every release now ships protected.
Renaming plus string encryption took our decompiled output from readable to unusable.
Per-slot jars make it easy to rotate our client builds without touching the game code.
FAQ’s
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.
Get Started
Leave your email and Polar Studios will get back to you about access. The CLI checks your licence once, before any obfuscation work starts.
Transformers
Pipeline phases
Built-in profiles
Slot jars per build, max