Skip to content

Commit 17fec68

Browse files
committed
Refactor ByteLoader to conform to intended ways of class loading.
Prevents infinite loop when class is not present.
1 parent 021bc13 commit 17fec68

File tree

3 files changed

+23
-25
lines changed

3 files changed

+23
-25
lines changed

src/java/com/javadeobfuscator/deobfuscator/ui/util/ByteLoader.java

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.javadeobfuscator.deobfuscator.ui.util;
22

3-
import java.util.HashSet;
43
import java.util.Map;
54
import java.util.Set;
65

@@ -13,10 +12,6 @@ public final class ByteLoader extends ClassLoader
1312
* Map of class names to their bytecode.
1413
*/
1514
private final Map<String, byte[]> classes;
16-
/**
17-
* Set of loaded names.
18-
*/
19-
private final Set<String> loaded = new HashSet<>();
2015

2116
/**
2217
* Create the loader with the map of classes to load from.
@@ -31,20 +26,23 @@ public ByteLoader(Map<String, byte[]> classes)
3126
}
3227

3328
@Override
34-
public final Class<?> findClass(String name) throws ClassNotFoundException
29+
protected final Class<?> findClass(String name) throws ClassNotFoundException
3530
{
36-
// Load from map of classes
37-
if (!loaded.contains(name) && classes.containsKey(name))
31+
Class<?> loadedClass = findLoadedClass(name);
32+
if (loadedClass != null)
33+
{
34+
return loadedClass;
35+
}
36+
37+
byte[] bytes = classes.get(name);
38+
if (bytes == null)
3839
{
39-
byte[] bytes = classes.get(name);
40-
loaded.add(name);
41-
return defineClass(name, bytes, 0, bytes.length, null);
40+
throw new ClassNotFoundException(name);
4241
}
43-
// Unknown class, defer to system ClassLoader
44-
return loadClass(name, false);
42+
return defineClass(name, bytes, 0, bytes.length);
4543
}
4644

47-
public Set<String> getClassNames()
45+
public final Set<String> getClassNames()
4846
{
4947
return classes.keySet();
5048
}

src/java/com/javadeobfuscator/deobfuscator/ui/wrap/Deobfuscator.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public Config getConfig() throws FallbackException
5858
{
5959
try
6060
{
61-
Class<?> conf = loader.findClass("com.javadeobfuscator.deobfuscator.config.Configuration");
61+
Class<?> conf = loader.loadClass("com.javadeobfuscator.deobfuscator.config.Configuration");
6262
config = new Config(conf.newInstance());
6363
} catch (Exception e)
6464
{
@@ -75,7 +75,7 @@ public Config getConfig() throws FallbackException
7575
*/
7676
public void run() throws Exception
7777
{
78-
Class<?> main = loader.findClass("com.javadeobfuscator.deobfuscator.Deobfuscator");
78+
Class<?> main = loader.loadClass("com.javadeobfuscator.deobfuscator.Deobfuscator");
7979
Config conf = getConfig();
8080
Constructor<?> con = main.getDeclaredConstructor(conf.get().getClass());
8181
Object deob = con.newInstance(conf.get());
@@ -95,7 +95,7 @@ public void clearClasses()
9595
{
9696
if (instance != null)
9797
{
98-
Class<?> main = loader.findClass("com.javadeobfuscator.deobfuscator.Deobfuscator");
98+
Class<?> main = loader.loadClass("com.javadeobfuscator.deobfuscator.Deobfuscator");
9999
Field cp = main.getDeclaredField("classpath");
100100
cp.setAccessible(true);
101101
((Map<?, ?>) cp.get(instance)).clear();
@@ -135,13 +135,13 @@ public void clearClasses()
135135
private void hookLogger(String ownerName, PrintStream hook) throws Exception
136136
{
137137
// unused, but required to load class, which sets up some important static fields
138-
getLogger(loader.findClass(ownerName));
139-
Class<?> simpleLogger = loader.findClass("org.slf4j.simple.SimpleLogger");
138+
getLogger(loader.loadClass(ownerName));
139+
Class<?> simpleLogger = loader.loadClass("org.slf4j.simple.SimpleLogger");
140140

141141
Object config = Reflect.getFieldS(simpleLogger, "CONFIG_PARAMS");
142142
Object outChoice = Reflect.getFieldO(config, "outputChoice");
143143

144-
Class<?> typeEnum = loader.findClass("org.slf4j.simple.OutputChoice$OutputChoiceType");
144+
Class<?> typeEnum = loader.loadClass("org.slf4j.simple.OutputChoice$OutputChoiceType");
145145
Object enumChoice = Reflect.getFieldS(typeEnum, "FILE");
146146

147147
// hook
@@ -152,7 +152,7 @@ private void hookLogger(String ownerName, PrintStream hook) throws Exception
152152
private Object getLogger(Class<?> loggerOwner) throws Exception
153153
{
154154
// LoggerFactory.getLogger(getClass())
155-
Class<?> factory = loader.findClass("org.slf4j.LoggerFactory");
155+
Class<?> factory = loader.loadClass("org.slf4j.LoggerFactory");
156156
Method m = factory.getDeclaredMethod("getLogger", Class.class);
157157
return m.invoke(null, loggerOwner);
158158
}

src/java/com/javadeobfuscator/deobfuscator/ui/wrap/Transformers.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ public List<Class<?>> getTransformers() throws FallbackException
3838
{
3939
try
4040
{
41-
Class<?> transformer = loader.findClass("com.javadeobfuscator.deobfuscator.transformers.Transformer");
42-
Class<?> transformerD = loader.findClass("com.javadeobfuscator.deobfuscator.transformers.DelegatingTransformer");
41+
Class<?> transformer = loader.loadClass("com.javadeobfuscator.deobfuscator.transformers.Transformer");
42+
Class<?> transformerD = loader.loadClass("com.javadeobfuscator.deobfuscator.transformers.DelegatingTransformer");
4343
List<String> names = new ArrayList<>(loader.getClassNames());
4444
Collections.sort(names);
4545
for (String name : names)
4646
{
4747
if (name.startsWith("com.javadeobfuscator.deobfuscator.transformers."))
4848
{
49-
Class<?> clazz = loader.findClass(name);
49+
Class<?> clazz = loader.loadClass(name);
5050
if (!clazz.equals(transformer) && !clazz.equals(transformerD) && transformer.isAssignableFrom(clazz)
5151
&& !Modifier.isAbstract(clazz.getModifiers()))
5252
{
@@ -69,7 +69,7 @@ public List<Class<?>> getTransformers() throws FallbackException
6969
*/
7070
public Object getConfigFor(Class<?> transClass) throws Exception
7171
{
72-
Class<?> confLoader = loader.findClass("com.javadeobfuscator.deobfuscator.config.TransformerConfig");
72+
Class<?> confLoader = loader.loadClass("com.javadeobfuscator.deobfuscator.config.TransformerConfig");
7373
Method configFor = confLoader.getDeclaredMethod("configFor", Class.class);
7474
return configFor.invoke(null, transClass);
7575
}

0 commit comments

Comments
 (0)