Skip to content

Commit efa6d95

Browse files
committed
July Update
1 parent 6716e1d commit efa6d95

18 files changed

+4405
-188
lines changed

src/main/java/com/javadeobfuscator/deobfuscator/executor/MethodExecutor.java

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,6 +1007,18 @@ private static <T> T execute(ClassNode classNode, MethodNode method, AbstractIns
10071007
Type type = Type.getType(cast.desc);
10081008
Class<?> clazz = PrimitiveUtils.getPrimitiveByName(type.getClassName());
10091009
Object provided = context.provider.getField(cast.owner, cast.name, cast.desc, null, context);
1010+
if(provided == null && type.getSort() != Type.OBJECT && type.getSort() != Type.ARRAY)
1011+
{
1012+
ClassNode fieldClass = null;
1013+
for(ClassNode cn : context.dictionary.values())
1014+
if(cn.name.equals(cast.owner))
1015+
{
1016+
fieldClass = cn;
1017+
break;
1018+
}
1019+
provided = fieldClass.fields.stream().filter(f -> f.name.equals(cast.name) && f.desc.equals(cast.desc)).findFirst().orElse(null).value;
1020+
context.provider.setField(cast.owner, cast.name, cast.desc, null, provided, context);
1021+
}
10101022

10111023
switch (type.getSort()) {
10121024
case Type.BOOLEAN:
@@ -1075,6 +1087,19 @@ else if(obj instanceof JavaObject)
10751087
Type type = Type.getType(cast.desc);
10761088
Class<?> clazz = PrimitiveUtils.getPrimitiveByName(type.getClassName());
10771089
Object provided = context.provider.getField(cast.owner, cast.name, cast.desc, obj, context);
1090+
if(provided == null && type.getSort() != Type.OBJECT && type.getSort() != Type.ARRAY)
1091+
{
1092+
ClassNode fieldClass = null;
1093+
for(ClassNode cn : context.dictionary.values())
1094+
if(cn.name.equals(cast.owner))
1095+
{
1096+
fieldClass = cn;
1097+
break;
1098+
}
1099+
provided = fieldClass.fields.stream().filter(f -> f.name.equals(cast.name) && f.desc.equals(cast.desc)).findFirst().orElse(null).value;
1100+
context.provider.setField(cast.owner, cast.name, cast.desc, obj, provided, context);
1101+
}
1102+
10781103
switch (type.getSort()) {
10791104
case Type.BOOLEAN:
10801105
stack.add(0, new JavaBoolean((Boolean) provided));
@@ -1216,10 +1241,13 @@ else if(obj instanceof JavaObject)
12161241
break;
12171242
}
12181243
} else {
1219-
throw new NoSuchMethodHandlerException("Could not find invoker for " + args.get(args.size() - 1).type() + " " + cast.name + cast.desc);
1244+
throw new NoSuchMethodHandlerException("Could not find invoker for " + args.get(args.size() - 1).type() + " " + cast.name + cast.desc).setThrownFromInvoke(true);
12201245
}
12211246
break;
12221247
} catch (NoSuchMethodHandlerException | IllegalArgumentException t) {
1248+
if(t instanceof NoSuchMethodHandlerException
1249+
&& !((NoSuchMethodHandlerException)t).isThrownFromInvoke())
1250+
throw t;
12231251
ClassNode ownerClass = context.dictionary.get(owner);
12241252
if (ownerClass != null) {
12251253
if (ownerClass.superName != null) {
@@ -1311,10 +1339,13 @@ else if(obj instanceof JavaObject)
13111339
break;
13121340
}
13131341
} else {
1314-
throw new NoSuchMethodHandlerException("Could not find invoker for " + cast.owner + " " + cast.name + cast.desc);
1342+
throw new NoSuchMethodHandlerException("Could not find invoker for " + cast.owner + " " + cast.name + cast.desc).setThrownFromInvoke(true);
13151343
}
13161344
break;
13171345
} catch (NoSuchMethodHandlerException | IllegalArgumentException t) {
1346+
if(t instanceof NoSuchMethodHandlerException
1347+
&& !((NoSuchMethodHandlerException)t).isThrownFromInvoke())
1348+
throw t;
13181349
ClassNode ownerClass = context.dictionary.get(owner);
13191350
if (ownerClass != null) {
13201351
if (ownerClass.superName != null) {
@@ -1404,7 +1435,7 @@ else if(obj instanceof JavaObject)
14041435
break;
14051436
}
14061437
} else {
1407-
throw new NoSuchMethodHandlerException("Could not find invoker for " + cast.owner + " " + cast.name + cast.desc);
1438+
throw new NoSuchMethodHandlerException("Could not find invoker for " + cast.owner + " " + cast.name + cast.desc).setThrownFromInvoke(true);
14081439
}
14091440
break;
14101441
}
@@ -1534,7 +1565,7 @@ else if(obj instanceof JavaObject)
15341565
break;
15351566
}
15361567
}else {
1537-
throw new NoSuchMethodHandlerException("Could not find invoker for " + args.get(args.size() - 1).type() + " " + cast.name + cast.desc);
1568+
throw new NoSuchMethodHandlerException("Could not find invoker for " + args.get(args.size() - 1).type() + " " + cast.name + cast.desc).setThrownFromInvoke(true);
15381569
}
15391570
break;
15401571
}
@@ -1796,6 +1827,8 @@ else if(argumentTypes[i + 3].getSort() == Type.DOUBLE)
17961827
e.clazz = classNode.name;
17971828
e.method = method.name + method.desc;
17981829
}
1830+
if(e instanceof NoSuchMethodHandlerException)
1831+
((NoSuchMethodHandlerException)e).setThrownFromInvoke(false);
17991832
throw e;
18001833
} catch (Throwable t) {
18011834
if (DEBUG_PRINT_EXCEPTIONS) {

src/main/java/com/javadeobfuscator/deobfuscator/executor/defined/JVMMethodProvider.java

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import java.math.BigInteger;
2525
import java.net.URI;
2626
import java.net.URL;
27+
import java.nio.ByteBuffer;
2728
import java.nio.charset.Charset;
2829
import java.security.CodeSource;
2930
import java.security.Key;
@@ -109,6 +110,10 @@ public class JVMMethodProvider extends MethodProvider {
109110
put("java/nio/charset/Charset", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
110111
put("availableCharsets()Ljava/util/SortedMap;", (targetObject, args, context) -> Charset.availableCharsets());
111112
}});
113+
put("java/nio/ByteBuffer", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
114+
put("wrap([B)Ljava/nio/ByteBuffer;", (targetObject, args, context) -> ByteBuffer.wrap(args.get(0).as(byte[].class)));
115+
put("getDouble()D", (targetObject, args, context) -> targetObject.as(ByteBuffer.class).getDouble());
116+
}});
112117
put("java/util/SortedMap", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
113118
put("keySet()Ljava/util/Set;", (targetObject, args, context) -> targetObject.as(SortedMap.class).keySet());
114119
}});
@@ -241,6 +246,11 @@ public class JVMMethodProvider extends MethodProvider {
241246
targetObject.initialize(new String(args.get(0).as(byte[].class), args.get(1).intValue()));
242247
return null;
243248
});
249+
put("<init>([BII)V", (targetObject, args, context) -> {
250+
expect(targetObject, "java/lang/String");
251+
targetObject.initialize(new String(args.get(0).as(byte[].class), args.get(1).intValue(), args.get(2).intValue()));
252+
return null;
253+
});
244254
put("<init>([BLjava/lang/String;)V", (targetObject, args, context) -> {
245255
expect(targetObject, "java/lang/String");
246256
targetObject.initialize(new String(args.get(0).as(byte[].class), args.get(1).as(String.class)));
@@ -636,6 +646,14 @@ public class JVMMethodProvider extends MethodProvider {
636646
put("getMethodName()Ljava/lang/String;", (targetObject, args, context) -> targetObject.as(StackTraceElement.class).getMethodName());
637647
put("getFileName()Ljava/lang/String;", (targetObject, args, context) -> targetObject.as(StackTraceElement.class).getFileName());
638648
}});
649+
put("java/lang/Float", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
650+
put("intBitsToFloat(I)F", (targetObject, args, context) -> Float.intBitsToFloat(args.get(0).intValue()));
651+
put("valueOf(F)Ljava/lang/Float;", (targetObject, args, context) -> Float.valueOf(args.get(0).floatValue()));
652+
}});
653+
put("java/lang/Double", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
654+
put("longBitsToDouble(J)D", (targetObject, args, context) -> Double.longBitsToDouble(args.get(0).longValue()));
655+
put("valueOf(D)Ljava/lang/Double;", (targetObject, args, context) -> Double.valueOf(args.get(0).doubleValue()));
656+
}});
639657
put("java/lang/Long", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
640658
put("<init>(J)V", (targetObject, args, context) -> {
641659
expect(targetObject, "java/lang/Long");
@@ -672,6 +690,14 @@ public class JVMMethodProvider extends MethodProvider {
672690
put("java/util/regex/Pattern", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
673691
put("compile(Ljava/lang/String;)Ljava/util/regex/Pattern;", (targetObject, args, context) -> Pattern.compile(args.get(0).as(String.class)));
674692
}});
693+
put("java/util/Random", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
694+
put("<init>(J)V", (targetObject, args, context) -> {
695+
expect(targetObject, "java/util/Random");
696+
targetObject.initialize(new Random(args.get(0).longValue()));
697+
return null;
698+
});
699+
put("nextDouble()D", (targetObject, args, context) -> targetObject.as(Random.class).nextDouble());
700+
}});
675701
put("java/lang/BootstrapMethodError", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
676702
put("<init>()V", (targetObject, args, context) -> {
677703
expect(targetObject, "java/lang/BootstrapMethodError");
@@ -697,7 +723,7 @@ public class JVMMethodProvider extends MethodProvider {
697723
targetObject.initialize(new HashMap<>(args.get(0).intValue()));
698724
return null;
699725
});
700-
put("put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", (targetObject, args, context) -> targetObject.as(HashMap.class).put(args.get(0), args.get(1)));
726+
put("put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", (targetObject, args, context) -> targetObject.as(HashMap.class).put(args.get(0).value(), args.get(1).value()));
701727
put("get(Ljava/lang/Object;)Ljava/lang/Object;", (targetObject, args, context) -> targetObject.as(HashMap.class).get(args.get(0).value()));
702728
put("containsKey(Ljava/lang/Object;)Z", (targetObject, args, context) -> targetObject.as(HashMap.class).containsKey(args.get(0).value()));
703729
put("isEmpty()Z", (targetObject, args, context) -> targetObject.as(HashMap.class).isEmpty());
@@ -746,6 +772,7 @@ public class JVMMethodProvider extends MethodProvider {
746772
}});
747773
put("java/lang/Math", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
748774
put("abs(J)J", (targetObject, args, context) -> Math.abs(args.get(0).longValue()));
775+
put("round(D)J", (targetObject, args, context) -> Math.round(args.get(0).doubleValue()));
749776
}});
750777
put("java/math/BigInteger", new HashMap<String, Function3<JavaValue, List<JavaValue>, Context, Object>>() {{
751778
put("<init>(Ljava/lang/String;I)V", (targetObject, args, context) -> {

src/main/java/com/javadeobfuscator/deobfuscator/executor/exceptions/NoSuchMethodHandlerException.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,18 @@
1717
package com.javadeobfuscator.deobfuscator.executor.exceptions;
1818

1919
public class NoSuchMethodHandlerException extends NoSuchHandlerException {
20+
private boolean isThrownFromInvoke;
21+
2022
public NoSuchMethodHandlerException(String msg) {
2123
super(msg);
2224
}
25+
26+
public NoSuchMethodHandlerException setThrownFromInvoke(boolean isThrownFromExe) {
27+
this.isThrownFromInvoke = isThrownFromExe;
28+
return this;
29+
}
30+
31+
public boolean isThrownFromInvoke() {
32+
return isThrownFromInvoke;
33+
}
2334
}

src/main/java/com/javadeobfuscator/deobfuscator/executor/values/JavaValue.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
import com.javadeobfuscator.deobfuscator.executor.exceptions.ExecutionException;
2525

2626
public abstract class JavaValue {
27-
28-
public boolean booleanValue() {
29-
throw new ExecutionException(new UnsupportedOperationException());
27+
28+
public boolean booleanValue() {
29+
throw new ExecutionException(new UnsupportedOperationException());
3030
}
3131

3232
public int intValue() {

0 commit comments

Comments
 (0)