public InvokeDynamic getInvokeDynamic() { if (invokeDynamicCheckBox.isSelected()) { switch (invokeDynamicComboBox.getSelectedIndex()) { case 0: { return new LightInvokeDynamic(); } case 1: { return new NormalInvokeDynamic(); } case 2: { return new HeavyInvokeDynamic(); } default: { throw new IllegalStateException(String.format("Bad invokedynamic type %d.", invokeDynamicComboBox.getSelectedIndex())); } } } else { return null; } }
@Override public void transform() { AtomicInteger counter = new AtomicInteger(); String className = StringUtils.randomClassName(getClasses().keySet()); String bsmName = randomString(4); Handle bsmHandle = new Handle(Opcodes.H_INVOKESTATIC, className, bsmName, "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" + "Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", false); this.getClassWrappers().stream().filter(classWrapper -> !classWrapper.classNode.superName.equals("java/lang/Enum") && !excluded(classWrapper) && classWrapper.classNode.version >= V1_7).forEach(classWrapper -> classWrapper.methods.stream().filter(methodWrapper -> !excluded(methodWrapper) && hasInstructions(methodWrapper.methodNode)).forEach(methodWrapper -> { MethodNode methodNode = methodWrapper.methodNode; bsmHandle, opcode, encrypt(methodInsnNode.owner.replace("/", "."), 1029), encrypt(methodInsnNode.name, 2038), encrypt(methodInsnNode.desc, 1928)); methodNode.instructions.set(insn, indy); if (returnType.getSort() == Type.ARRAY) { bsmHost.name = className; bsmHost.version = V1_7; bsmHost.methods.add(createBootstrap(bsmName, bsmHost.name)); bsmHost.superName = "java/lang/Object"; bsmHost.access = ACC_PUBLIC | ACC_SUPER; getClasses().put(className, new ClassWrapper(bsmHost, false)); LoggerUtils.stdOut(String.format("Replaced %d method invocations with invokedynamics.", counter.get()));
public static InvokeDynamic getTransformerFromString(String s) { switch (s.toLowerCase()) { case "light": { return new LightInvokeDynamic(); } case "normal": { return new NormalInvokeDynamic(); } case "heavy": { return new HeavyInvokeDynamic(); } default: { throw new IllegalConfigurationValueException("Did not expect " + s + " as a invokedynamic obfuscation mode"); } } } }