Skip to content

Commit 1799890

Browse files
committed
Merge pull request Konloch#23 from im-frizzy/master
Obfuscation - Renaming
2 parents 1d32d00 + a00d48e commit 1799890

File tree

13 files changed

+3449
-2947
lines changed

13 files changed

+3449
-2947
lines changed

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

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

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

Lines changed: 1915 additions & 1908 deletions
Large diffs are not rendered by default.
Lines changed: 59 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,59 @@
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+
BytecodeViewer.viewer.setIcon(true);
20+
BytecodeViewer.runningObfuscation = true;
21+
obfuscate();
22+
BytecodeViewer.refactorer.run();
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 = 25;
38+
public static int MIN_STRING_LENGTH = 5;
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 (!Character.isJavaIdentifierStart(nameTry.toCharArray()[0]))
47+
continue;
48+
49+
if (!names.contains(nameTry)) {
50+
names.add(nameTry);
51+
name = nameTry;
52+
found = true;
53+
}
54+
}
55+
return name;
56+
}
57+
58+
public abstract void obfuscate();
59+
}

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: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package the.bytecode.club.bytecodeviewer.obfuscators.mapping;
2+
3+
import java.util.ArrayList;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
8+
import org.objectweb.asm.commons.Remapper;
9+
10+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.FieldMappingData;
11+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MappingData;
12+
import the.bytecode.club.bytecodeviewer.obfuscators.mapping.data.MethodMappingData;
13+
14+
/**
15+
* @author sc4re
16+
*/
17+
public class RefactorMapper extends Remapper {
18+
19+
protected final Map<String, MappingData> sortedClasses;
20+
protected final Map<String, MethodMappingData> sortedMethods;
21+
protected final Map<String, FieldMappingData> sortedFields;
22+
protected final List<String> mappingList;
23+
24+
private StringBuilder builder;
25+
26+
public RefactorMapper(HookMap hookMap) {
27+
sortedClasses = new HashMap<>();
28+
sortedMethods = new HashMap<>();
29+
sortedFields = new HashMap<>();
30+
mappingList = new ArrayList<>();
31+
builder = new StringBuilder();
32+
for(MappingData hook : hookMap.getClasses()){
33+
if(hook.getObfuscatedName().contains("$"))
34+
continue;
35+
String obfuscatedName = hook.getObfuscatedName();
36+
String refactoredName = hook.getRefactoredName();
37+
sortedClasses.put(obfuscatedName, hook);
38+
sortedClasses.put(refactoredName, hook);
39+
}
40+
for (MethodMappingData hook : hookMap.getMethods()) {
41+
String obfuscatedName = hook.getMethodName().getObfuscatedName();
42+
String obfuscatedDesc = hook.getMethodDesc();
43+
String obfuscatedCname = hook.getMethodOwner();
44+
sortedMethods.put(obfuscatedCname + "$$$$" + obfuscatedName + "$$$$" + obfuscatedDesc, hook);
45+
}
46+
for (FieldMappingData hook : hookMap.getFields()) {
47+
String obfuscatedName = hook.getName().getObfuscatedName();
48+
String obfuscatedDesc = hook.getDesc();
49+
String obfuscatedCname = hook.getFieldOwner();
50+
sortedFields.put(obfuscatedCname + "$$$$" + obfuscatedName + "$$$$" + obfuscatedDesc, hook);
51+
}
52+
}
53+
54+
@Override
55+
public String map(String type) {
56+
if (sortedClasses.containsKey(type)) {
57+
String map = new String(type + " --> " + sortedClasses.get(type).getRefactoredName() + "\n");
58+
if (!mappingList.contains(map))
59+
mappingList.add(map);
60+
61+
return sortedClasses.get(type).getRefactoredName();
62+
}
63+
return type;
64+
}
65+
66+
@Override
67+
public String mapFieldName(String owner, String name, String desc) {
68+
String obfKey = owner + "$$$$" + name + "$$$$" + desc;
69+
if (sortedFields.containsKey(obfKey)) {
70+
String map = new String(owner + "." + name + " --> " + owner + sortedFields.get(obfKey).getName().getRefactoredName() + "\n");
71+
if (!mappingList.contains(map))
72+
mappingList.add(map);
73+
name = sortedFields.get(obfKey).getName().getRefactoredName();
74+
}
75+
return name;
76+
}
77+
78+
@Override
79+
public String mapMethodName(String owner, String name, String desc) {
80+
String obfKey = owner + "$$$$" + name + "$$$$" + desc;
81+
if (sortedMethods.containsKey(obfKey)) {
82+
String map = new String(owner + "." + name + " --> " + owner + sortedMethods.get(obfKey).getMethodName().getRefactoredName() + "\n");
83+
if (!mappingList.contains(map))
84+
mappingList.add(map);
85+
name = sortedMethods.get(obfKey).getMethodName().getRefactoredName();
86+
}
87+
return name;
88+
}
89+
90+
public void printMap() {
91+
for (String map : mappingList) {
92+
builder.append(map);
93+
}
94+
System.out.println(builder.toString());
95+
}
96+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
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+
mapper.printMap();
49+
}
50+
51+
private byte[] getClassNodeBytes(ClassNode cn) {
52+
ClassWriter cw = new ClassWriter(0);
53+
cn.accept(cw);
54+
byte[] b = cw.toByteArray();
55+
return b;
56+
}
57+
}

0 commit comments

Comments
 (0)