Skip to content

Commit c8337e7

Browse files
author
im-frizzy
committed
Class/Method/Field Renaming
1 parent 1d32d00 commit c8337e7

File tree

13 files changed

+3404
-2947
lines changed

13 files changed

+3404
-2947
lines changed

src/the/bytecode/club/bytecodeviewer/BytecodeViewer.java

Lines changed: 878 additions & 861 deletions
Large diffs are not rendered by default.

src/the/bytecode/club/bytecodeviewer/gui/MainViewerGUI.java

Lines changed: 1908 additions & 1908 deletions
Large diffs are not rendered by default.
Lines changed: 57 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,57 @@
1-
package the.bytecode.club.bytecodeviewer.obfuscators;
2-
3-
import java.util.ArrayList;
4-
5-
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
6-
import the.bytecode.club.bytecodeviewer.MiscUtils;
7-
8-
/**
9-
* An unfinished obfuscator.
10-
*
11-
* @author Konloch
12-
*
13-
*/
14-
15-
public abstract class JavaObfuscator extends Thread {
16-
17-
@Override
18-
public void run() {
19-
System.out.println("mibbzz is gay");
20-
BytecodeViewer.viewer.setIcon(true);
21-
BytecodeViewer.runningObfuscation = true;
22-
obfuscate();
23-
BytecodeViewer.runningObfuscation = false;
24-
BytecodeViewer.viewer.setIcon(false);
25-
}
26-
27-
public int getStringLength() {
28-
if (BytecodeViewer.viewer.obfuscatorGroup
29-
.isSelected(BytecodeViewer.viewer.strongObf.getModel())) {
30-
return MAX_STRING_LENGTH;
31-
} else { // if(BytecodeViewer.viewer.obfuscatorGroup.isSelected(BytecodeViewer.viewer.lightObf.getModel()))
32-
// {
33-
return MIN_STRING_LENGTH;
34-
}
35-
}
36-
37-
public static int MAX_STRING_LENGTH = 250;
38-
public static int MIN_STRING_LENGTH = 20;
39-
private ArrayList<String> names = new ArrayList<String>();
40-
41-
protected String generateUniqueName(int length) {
42-
boolean found = false;
43-
String name = "";
44-
while (!found) {
45-
String nameTry = MiscUtils.randomString(1) + MiscUtils.randomStringNum(length - 1);
46-
if (!names.contains(nameTry)) {
47-
names.add(nameTry);
48-
name = nameTry;
49-
found = true;
50-
}
51-
}
52-
return name;
53-
}
54-
55-
public abstract void obfuscate();
56-
}
1+
package the.bytecode.club.bytecodeviewer.obfuscators;
2+
3+
import java.util.ArrayList;
4+
5+
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
6+
import the.bytecode.club.bytecodeviewer.MiscUtils;
7+
8+
/**
9+
* An unfinished obfuscator.
10+
*
11+
* @author Konloch
12+
*
13+
*/
14+
15+
public abstract class JavaObfuscator extends Thread {
16+
17+
@Override
18+
public void run() {
19+
System.out.println("mibbzz is gay");
20+
BytecodeViewer.viewer.setIcon(true);
21+
BytecodeViewer.runningObfuscation = true;
22+
obfuscate();
23+
BytecodeViewer.refactorer.run();
24+
BytecodeViewer.runningObfuscation = false;
25+
BytecodeViewer.viewer.setIcon(false);
26+
}
27+
28+
public int getStringLength() {
29+
if (BytecodeViewer.viewer.obfuscatorGroup
30+
.isSelected(BytecodeViewer.viewer.strongObf.getModel())) {
31+
return MAX_STRING_LENGTH;
32+
} else { // if(BytecodeViewer.viewer.obfuscatorGroup.isSelected(BytecodeViewer.viewer.lightObf.getModel()))
33+
// {
34+
return MIN_STRING_LENGTH;
35+
}
36+
}
37+
38+
public static int MAX_STRING_LENGTH = 25;
39+
public static int MIN_STRING_LENGTH = 5;
40+
private ArrayList<String> names = new ArrayList<String>();
41+
42+
protected String generateUniqueName(int length) {
43+
boolean found = false;
44+
String name = "";
45+
while (!found) {
46+
String nameTry = MiscUtils.randomString(1) + MiscUtils.randomStringNum(length - 1);
47+
if (!names.contains(nameTry)) {
48+
names.add(nameTry);
49+
name = nameTry;
50+
found = true;
51+
}
52+
}
53+
return name;
54+
}
55+
56+
public abstract void obfuscate();
57+
}

src/the/bytecode/club/bytecodeviewer/obfuscators/RenameClasses.java

Lines changed: 0 additions & 31 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package the.bytecode.club.bytecodeviewer.obfuscators.mapping;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.FieldMappingData;
7+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MappingData;
8+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MethodMappingData;
9+
10+
public class HookMap {
11+
12+
protected List<MappingData> classes;
13+
protected List<FieldMappingData> fields;
14+
protected List<MethodMappingData> methods;
15+
16+
public HookMap() {
17+
classes = new ArrayList<MappingData>();
18+
fields = new ArrayList<FieldMappingData>();
19+
methods = new ArrayList<MethodMappingData>();
20+
}
21+
22+
public void addClass(MappingData clazz) {
23+
classes.add(clazz);
24+
}
25+
26+
public void addField(FieldMappingData field) {
27+
fields.add(field);
28+
}
29+
30+
public void addMethod(MethodMappingData method) {
31+
methods.add(method);
32+
}
33+
34+
public List<MappingData> getClasses() {
35+
return classes;
36+
}
37+
38+
public List<FieldMappingData> getFields() {
39+
return fields;
40+
}
41+
42+
public List<MethodMappingData> getMethods() {
43+
return methods;
44+
}
45+
46+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package the.bytecode.club.bytecodeviewer.obfuscators.mapping;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import org.objectweb.asm.commons.Remapper;
7+
8+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.FieldMappingData;
9+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MappingData;
10+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MethodMappingData;
11+
12+
/**
13+
* @author sc4re
14+
*/
15+
public class RefactorMapper extends Remapper {
16+
17+
protected final Map<String, MappingData> sortedClasses;
18+
protected final Map<String, MethodMappingData> sortedMethods;
19+
protected final Map<String, FieldMappingData> sortedFields;
20+
21+
public RefactorMapper(HookMap hookMap) {
22+
sortedClasses = new HashMap<>();
23+
sortedMethods = new HashMap<>();
24+
sortedFields = new HashMap<>();
25+
for(MappingData hook : hookMap.getClasses()){
26+
if(hook.getObfuscatedName().contains("$"))
27+
continue;
28+
String obfuscatedName = hook.getObfuscatedName();
29+
String refactoredName = hook.getRefactoredName();
30+
sortedClasses.put(obfuscatedName, hook);
31+
sortedClasses.put(refactoredName, hook);
32+
}
33+
for (MethodMappingData hook : hookMap.getMethods()) {
34+
String obfuscatedName = hook.getMethodName().getObfuscatedName();
35+
String obfuscatedDesc = hook.getMethodDesc();
36+
String obfuscatedCname = hook.getMethodOwner();
37+
sortedMethods.put(obfuscatedCname + "$$$$" + obfuscatedName + "$$$$" + obfuscatedDesc, hook);
38+
}
39+
for (FieldMappingData hook : hookMap.getFields()) {
40+
String obfuscatedName = hook.getName().getObfuscatedName();
41+
String obfuscatedDesc = hook.getDesc();
42+
String obfuscatedCname = hook.getFieldOwner();
43+
sortedFields.put(obfuscatedCname + "$$$$" + obfuscatedName + "$$$$" + obfuscatedDesc, hook);
44+
}
45+
}
46+
47+
@Override
48+
public String map(String type) {
49+
if (sortedClasses.containsKey(type))
50+
return sortedClasses.get(type).getRefactoredName();
51+
return type;
52+
}
53+
54+
@Override
55+
public String mapFieldName(String owner, String name, String desc) {
56+
String obfKey = owner + "$$$$" + name + "$$$$" + desc;
57+
if (sortedFields.containsKey(obfKey))
58+
name = sortedFields.get(obfKey).getName().getRefactoredName();
59+
return name;
60+
}
61+
62+
@Override
63+
public String mapMethodName(String owner, String name, String desc) {
64+
String obfKey = owner + "$$$$" + name + "$$$$" + desc;
65+
if (sortedMethods.containsKey(obfKey))
66+
name = sortedMethods.get(obfKey).getMethodName().getRefactoredName();
67+
return name;
68+
}
69+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package the.bytecode.club.bytecodeviewer.obfuscators.mapping;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
6+
import org.objectweb.asm.ClassReader;
7+
import org.objectweb.asm.ClassWriter;
8+
import org.objectweb.asm.commons.RemappingClassAdapter;
9+
import org.objectweb.asm.tree.ClassNode;
10+
11+
import the.bytecode.club.bytecodeviewer.BytecodeViewer;
12+
13+
/**
14+
* @author sc4re
15+
*/
16+
public class Refactorer {
17+
18+
protected HookMap hooks;
19+
20+
public Refactorer() {
21+
hooks = new HookMap();
22+
}
23+
24+
public HookMap getHooks() {
25+
return hooks;
26+
}
27+
28+
public void run() {
29+
if (getHooks() == null)
30+
return;
31+
32+
RefactorMapper mapper = new RefactorMapper(getHooks());
33+
Map<String, ClassNode> refactored = new HashMap<>();
34+
for (ClassNode cn : BytecodeViewer.getLoadedClasses()) {
35+
String oldName = cn.name;
36+
ClassReader cr = new ClassReader(getClassNodeBytes(cn));
37+
ClassWriter cw = new ClassWriter(cr, 0);
38+
RemappingClassAdapter rca = new RemappingClassAdapter(cw, mapper);
39+
cr.accept(rca, ClassReader.EXPAND_FRAMES);
40+
cr = new ClassReader(cw.toByteArray());
41+
cn = new ClassNode();
42+
cr.accept(cn, 0);
43+
refactored.put(oldName, cn);
44+
}
45+
for (Map.Entry<String, ClassNode> factor : refactored.entrySet()) {
46+
BytecodeViewer.relocate(factor.getKey(), factor.getValue());
47+
}
48+
}
49+
50+
private byte[] getClassNodeBytes(ClassNode cn) {
51+
ClassWriter cw = new ClassWriter(0);
52+
cn.accept(cw);
53+
byte[] b = cw.toByteArray();
54+
return b;
55+
}
56+
}

0 commit comments

Comments
 (0)