Skip to content

Commit 780e293

Browse files
committed
Naming modes
1 parent 0ac1858 commit 780e293

File tree

14 files changed

+362
-37
lines changed

14 files changed

+362
-37
lines changed

README.md

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ A powerful and flexible Java bytecode obfuscator built with ASM that provides co
1111
- **Local Variable Renaming** - Obfuscate local variable names for additional protection
1212
- **Reference Updating** - Automatically updates all references to renamed elements throughout the codebase
1313
- **Inheritance-Aware Renaming** - Properly handles interface implementations and method overrides
14+
- **Multiple Naming Modes** - Choose from sequential, alphabetic, random short/long, or single character naming schemes
1415

1516
### 🎯 Advanced Configuration
1617
- **Keep Rules System** - Sophisticated rules for preserving specific classes, methods, and fields
@@ -68,6 +69,14 @@ java -jar java-bytecode-obfuscator-1.0-SNAPSHOT.jar input.jar output.jar \
6869
java -jar java-bytecode-obfuscator-1.0-SNAPSHOT.jar input.jar output.jar \
6970
--mappings mappings.txt --verbose \
7071
--rename-classes --rename-methods --rename-fields --rename-local-variables
72+
73+
# Use different naming modes
74+
java -jar java-bytecode-obfuscator-1.0-SNAPSHOT.jar input.jar output.jar \
75+
--naming-mode RANDOM_SHORT --rename-classes --rename-methods --rename-fields
76+
77+
java -jar java-bytecode-obfuscator-1.0-SNAPSHOT.jar input.jar output.jar \
78+
--naming-mode SEQUENTIAL_ALPHA --verbose \
79+
--rename-classes --rename-methods --rename-fields --rename-local-variables
7180
```
7281

7382
### Configuration File
@@ -80,6 +89,7 @@ Create a JSON configuration file for complex scenarios:
8089
"renameClasses": true,
8190
"renameFields": true,
8291
"renameMethods": true,
92+
"namingMode": "RANDOM_SHORT",
8393
"verbose": true,
8494
"keepRules": {
8595
"keepMainClass": true,
@@ -107,6 +117,7 @@ ObfuscationConfig config = new ObfuscationConfig.Builder()
107117
.renameClasses(true)
108118
.renameFields(true)
109119
.renameMethods(true)
120+
.namingMode(NamingMode.RANDOM_SHORT)
110121
.verbose(true)
111122

112123
// Keep specific classes
@@ -132,6 +143,57 @@ Obfuscator obfuscator = new Obfuscator();
132143
obfuscator.obfuscate(inputJar, outputJar, config, mappingsFile);
133144
```
134145

146+
## Naming Modes
147+
148+
The obfuscator supports multiple naming modes to generate obfuscated names:
149+
150+
### Available Modes
151+
152+
| Mode | Description | Example Output |
153+
|------|-------------|----------------|
154+
| `SEQUENTIAL_PREFIX` | Sequential with prefix (default) | `a1`, `a2`, `a3`, `m1`, `m2`, `f1`, `f2` |
155+
| `SEQUENTIAL_ALPHA` | Sequential alphabetic | `a`, `b`, `c`, `aa`, `ab`, `ac` |
156+
| `RANDOM_SHORT` | Random short names (4 characters) | `abcd`, `xyzk`, `mnop`, `qrst` |
157+
| `RANDOM_LONG` | Random long names (8-16 characters) | `abcdefgh`, `xyzklmnopqrs` |
158+
| `SINGLE_CHAR` | Single character names | `a`, `b`, `c`, then falls back to `a1`, `a2` |
159+
160+
### Usage Examples
161+
162+
```bash
163+
# Use random short names for maximum obfuscation
164+
java -jar obfuscator.jar input.jar output.jar --naming-mode RANDOM_SHORT
165+
166+
# Use single character names for minimal size
167+
java -jar obfuscator.jar input.jar output.jar --naming-mode SINGLE_CHAR
168+
169+
# Use alphabetic sequence for readability in testing
170+
java -jar obfuscator.jar input.jar output.jar --naming-mode SEQUENTIAL_ALPHA
171+
```
172+
173+
### Configuration File
174+
175+
```json
176+
{
177+
"namingMode": "RANDOM_SHORT",
178+
"renameClasses": true,
179+
"renameFields": true,
180+
"renameMethods": true
181+
}
182+
```
183+
184+
### Programmatic Usage
185+
186+
```java
187+
import net.cvs0.config.NamingMode;
188+
189+
ObfuscationConfig config = new ObfuscationConfig.Builder()
190+
.namingMode(NamingMode.RANDOM_LONG)
191+
.renameClasses(true)
192+
.renameFields(true)
193+
.renameMethods(true)
194+
.build();
195+
```
196+
135197
## CLI Reference
136198

137199
### Command Line Options
@@ -149,6 +211,9 @@ Options:
149211
--rename-classes Enable class renaming
150212
--rename-fields Enable field renaming
151213
--rename-methods Enable method renaming
214+
--rename-local-variables Enable local variable renaming
215+
-n, --naming-mode <mode> Name generation mode (SEQUENTIAL_PREFIX, SEQUENTIAL_ALPHA,
216+
RANDOM_SHORT, RANDOM_LONG, SINGLE_CHAR)
152217
--mappings <file> Output mappings file
153218
-v, --verbose Enable verbose output
154219
--keep-class <class> Keep specific class (repeatable)
@@ -184,9 +249,19 @@ java -jar obfuscator.jar input.jar output.jar \
184249
# Generate mappings
185250
java -jar obfuscator.jar input.jar output.jar --mappings mappings.txt
186251

252+
# Use different naming modes
253+
java -jar obfuscator.jar input.jar output.jar \
254+
--naming-mode RANDOM_LONG \
255+
--rename-classes --rename-methods --rename-fields
256+
257+
java -jar obfuscator.jar input.jar output.jar \
258+
--naming-mode SINGLE_CHAR \
259+
--verbose
260+
187261
# Override config file settings
188262
java -jar obfuscator.jar -c config.json input.jar output.jar \
189263
--rename-classes false \
264+
--naming-mode SEQUENTIAL_ALPHA \
190265
--verbose
191266
```
192267

@@ -199,6 +274,7 @@ java -jar obfuscator.jar -c config.json input.jar output.jar \
199274
"renameClasses": true,
200275
"renameFields": true,
201276
"renameMethods": true,
277+
"namingMode": "SEQUENTIAL_PREFIX",
202278
"verbose": true,
203279
"keepRules": {
204280
"keepMainClass": true,
@@ -214,6 +290,7 @@ java -jar obfuscator.jar -c config.json input.jar output.jar \
214290
"renameClasses": true,
215291
"renameFields": true,
216292
"renameMethods": true,
293+
"namingMode": "RANDOM_SHORT",
217294
"verbose": false,
218295
"keepRules": {
219296
"keepMainClass": true,
@@ -241,6 +318,7 @@ java -jar obfuscator.jar -c config.json input.jar output.jar \
241318
"renameClasses": false,
242319
"renameFields": true,
243320
"renameMethods": false,
321+
"namingMode": "SINGLE_CHAR",
244322
"verbose": false,
245323
"keepRules": {
246324
"keepStandardEntryPoints": true,
@@ -264,6 +342,7 @@ java -jar obfuscator.jar -c config.json input.jar output.jar \
264342
"renameClasses": true,
265343
"renameFields": true,
266344
"renameMethods": true,
345+
"namingMode": "RANDOM_LONG",
267346
"verbose": true,
268347
"keepRules": {
269348
"keepMainClass": true,
@@ -402,14 +481,42 @@ ObfuscationConfig config = new ObfuscationConfig.Builder()
402481
.renameClasses(false)
403482
.renameFields(true) // Only obfuscate fields
404483
.renameMethods(false)
484+
.namingMode(NamingMode.SINGLE_CHAR)
405485
.keepStandardEntryPoints()
406486
.build();
407487
```
408488

409489
### Aggressive Obfuscation
410490
```java
411-
ObfuscationConfig config = ConfigPresets.createAggressiveObfuscation()
412-
.build(); // Minimal keep rules for maximum obfuscation
491+
ObfuscationConfig config = new ObfuscationConfig.Builder()
492+
.renameClasses(true)
493+
.renameFields(true)
494+
.renameMethods(true)
495+
.renameLocalVariables(true)
496+
.namingMode(NamingMode.RANDOM_LONG)
497+
.keepStandardEntryPoints() // Minimal keep rules for maximum obfuscation
498+
.build();
499+
```
500+
501+
### Different Naming Modes
502+
```java
503+
// Sequential with prefix (default)
504+
ObfuscationConfig config1 = new ObfuscationConfig.Builder()
505+
.namingMode(NamingMode.SEQUENTIAL_PREFIX)
506+
.renameClasses(true)
507+
.build();
508+
509+
// Random short names for good obfuscation
510+
ObfuscationConfig config2 = new ObfuscationConfig.Builder()
511+
.namingMode(NamingMode.RANDOM_SHORT)
512+
.renameClasses(true)
513+
.build();
514+
515+
// Single character for minimal size
516+
ObfuscationConfig config3 = new ObfuscationConfig.Builder()
517+
.namingMode(NamingMode.SINGLE_CHAR)
518+
.renameClasses(true)
519+
.build();
413520
```
414521

415522
### Framework-Specific Configurations
@@ -420,6 +527,7 @@ ObfuscationConfig config = new ObfuscationConfig.Builder()
420527
.renameClasses(true)
421528
.renameFields(true)
422529
.renameMethods(true)
530+
.namingMode(NamingMode.RANDOM_SHORT)
423531
.keepClassPattern(".*Configuration")
424532
.keepClassPattern(".*Controller")
425533
.keepClassMethodPattern(".*Component", ".*")
@@ -434,6 +542,7 @@ ObfuscationConfig config = new ObfuscationConfig.Builder()
434542
.renameClasses(true)
435543
.renameFields(true)
436544
.renameMethods(true)
545+
.namingMode(NamingMode.SEQUENTIAL_ALPHA)
437546
.keepClassPattern(".*Activity")
438547
.keepClassPattern(".*Service")
439548
.keepClassPattern(".*BroadcastReceiver")
@@ -550,6 +659,12 @@ This project is licensed under the MIT License - see the LICENSE file for detail
550659

551660
## Changelog
552661

662+
### Version 1.1.0
663+
- Added multiple naming modes (SEQUENTIAL_PREFIX, SEQUENTIAL_ALPHA, RANDOM_SHORT, RANDOM_LONG, SINGLE_CHAR)
664+
- Enhanced CLI with naming mode selection
665+
- Updated configuration file format to support naming modes
666+
- Improved local variable renaming with configurable naming modes
667+
553668
### Version 1.0.0
554669
- Initial release with class, method, and field renaming
555670
- Advanced keep rules system

config-examples/advanced.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"renameClasses": true,
44
"renameFields": true,
55
"renameMethods": true,
6+
"namingMode": "RANDOM_LONG",
67
"verbose": true,
78
"keepRules": {
89
"keepMainClass": true,

config-examples/basic.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"renameClasses": true,
44
"renameFields": true,
55
"renameMethods": true,
6+
"namingMode": "SEQUENTIAL_PREFIX",
67
"verbose": true,
78
"keepRules": {
89
"keepMainClass": true,

config-examples/library.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"renameClasses": false,
33
"renameFields": true,
44
"renameMethods": false,
5+
"namingMode": "SINGLE_CHAR",
56
"verbose": false,
67
"keepRules": {
78
"keepStandardEntryPoints": true,

config-examples/spring-boot.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"renameClasses": true,
44
"renameFields": true,
55
"renameMethods": true,
6+
"namingMode": "RANDOM_SHORT",
67
"verbose": false,
78
"keepRules": {
89
"keepMainClass": true,

src/main/java/net/cvs0/Main.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import picocli.CommandLine.Parameters;
77
import net.cvs0.config.ObfuscationConfig;
88
import net.cvs0.config.ConfigLoader;
9+
import net.cvs0.config.NamingMode;
910
import net.cvs0.utils.Logger;
1011

1112
import java.io.File;
@@ -58,6 +59,15 @@ public class Main implements Callable<Integer>
5859
@Option(names = {"--keep-entry-points"}, description = "Keep standard entry points (main methods, constructors)")
5960
private boolean keepStandardEntryPoints;
6061

62+
@Option(names = {"--naming-mode", "-n"},
63+
description = "Name generation mode (default: SEQUENTIAL_PREFIX):%n" +
64+
" SEQUENTIAL_PREFIX - Sequential with prefix (a1, a2, a3...)%n" +
65+
" SEQUENTIAL_ALPHA - Sequential alphabetic (a, b, c... aa, ab, ac...)%n" +
66+
" RANDOM_SHORT - Random short names (abcd, xyzk, mnop...)%n" +
67+
" RANDOM_LONG - Random long names (highly obfuscated)%n" +
68+
" SINGLE_CHAR - Single character names (a, b, c...)")
69+
private NamingMode namingMode;
70+
6171
public static void main(String[] args)
6272
{
6373
int exitCode = new CommandLine(new Main()).execute(args);
@@ -82,6 +92,7 @@ public Integer call() throws Exception
8292
if (mappingsFile != null) {
8393
System.out.println("Mappings file: " + mappingsFile.getAbsolutePath());
8494
}
95+
System.out.println("Naming mode: " + config.getNamingMode().name() + " - " + config.getNamingMode().getDescription());
8596
System.out.println();
8697
}
8798

@@ -169,6 +180,10 @@ private ObfuscationConfig buildConfiguration() throws Exception
169180
builder.keepStandardEntryPoints();
170181
}
171182

183+
if (namingMode != null) {
184+
builder.namingMode(namingMode);
185+
}
186+
172187
if (configFile == null && renameClasses == null && renameFields == null && renameMethods == null && renameLocalVariables == null) {
173188
builder.renameClasses(true)
174189
.renameFields(true)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.cvs0.config;
2+
3+
public enum NamingMode
4+
{
5+
SEQUENTIAL_PREFIX("Sequential with prefix (a1, a2, a3...)"),
6+
SEQUENTIAL_ALPHA("Sequential alphabetic (a, b, c... aa, ab, ac...)"),
7+
RANDOM_SHORT("Random short names (abcd, xyzk, mnop...)"),
8+
RANDOM_LONG("Random long names (highly obfuscated)"),
9+
SINGLE_CHAR("Single character names (a, b, c...)");
10+
11+
private final String description;
12+
13+
NamingMode(String description)
14+
{
15+
this.description = description;
16+
}
17+
18+
public String getDescription()
19+
{
20+
return description;
21+
}
22+
}

src/main/java/net/cvs0/config/ObfuscationConfig.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class ObfuscationConfig
1313
private final boolean verbose;
1414
private final KeepRules keepRules;
1515
private final String packageScope;
16+
private final NamingMode namingMode;
1617

1718
public ObfuscationConfig(
1819
String mainClass,
@@ -22,7 +23,8 @@ public ObfuscationConfig(
2223
boolean renameLocalVariables,
2324
boolean verbose,
2425
KeepRules keepRules,
25-
String packageScope)
26+
String packageScope,
27+
NamingMode namingMode)
2628
{
2729
this.mainClass = mainClass;
2830
this.renameClasses = renameClasses;
@@ -32,6 +34,7 @@ public ObfuscationConfig(
3234
this.verbose = verbose;
3335
this.keepRules = keepRules != null ? keepRules : new KeepRules();
3436
this.packageScope = packageScope;
37+
this.namingMode = namingMode != null ? namingMode : NamingMode.SEQUENTIAL_PREFIX;
3538
}
3639

3740
public String getMainClass()
@@ -69,6 +72,11 @@ public String getPackageScope()
6972
return packageScope;
7073
}
7174

75+
public NamingMode getNamingMode()
76+
{
77+
return namingMode;
78+
}
79+
7280
public KeepRules getKeepRules()
7381
{
7482
return keepRules;
@@ -221,6 +229,7 @@ public static class Builder
221229
private boolean verbose = false;
222230
private final KeepRules keepRules = new KeepRules();
223231
private String packageScope;
232+
private NamingMode namingMode = NamingMode.SEQUENTIAL_PREFIX;
224233

225234
public Builder mainClass(String mainClass)
226235
{
@@ -268,6 +277,12 @@ public Builder verbose(boolean verbose)
268277
return this;
269278
}
270279

280+
public Builder namingMode(NamingMode namingMode)
281+
{
282+
this.namingMode = namingMode;
283+
return this;
284+
}
285+
271286
public Builder keepClass(String className)
272287
{
273288
keepRules.keepClasses.add(className);
@@ -340,7 +355,7 @@ public Builder keepStandardEntryPoints()
340355

341356
public ObfuscationConfig build()
342357
{
343-
return new ObfuscationConfig(mainClass, renameClasses, renameFields, renameMethods, renameLocalVariables, verbose, keepRules, packageScope);
358+
return new ObfuscationConfig(mainClass, renameClasses, renameFields, renameMethods, renameLocalVariables, verbose, keepRules, packageScope, namingMode);
344359
}
345360
}
346361
}

0 commit comments

Comments
 (0)