ItzSomebody / radon

[Abandoned] Scuffed java bytecode obfuscator
GNU General Public License v3.0
361 stars 74 forks source link

Utf8 string too large fix #73

Closed vovanre closed 4 years ago

vovanre commented 5 years ago

Fix for #45 issue.

ItzSomebody commented 5 years ago

Can't you just do

if (str.getBytes(StandardCharsets.UTF_8).length > 65535) {/* stuff */}

?

vovanre commented 5 years ago

Can. But is it worth wasting memory to copy an array?

ItzSomebody commented 5 years ago

I don't really know. Less boilerplate is all I can say.

vovanre commented 5 years ago
 private static InsnList getSafeStringInsnList(String string) {
        InsnList insnList = new InsnList();
        if (string.getBytes(StandardCharsets.UTF_8).length < StringUtils.MAX_SAFE_BYTE_COUNT) {
            insnList.add(new LdcInsnNode(string));
            return insnList;
        }

        insnList.add(new TypeInsnNode(NEW, "java/lang/StringBuilder"));
        insnList.add(new InsnNode(DUP));
        insnList.add(new MethodInsnNode(INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "()V", false));

        String[] chunks = StringUtils.splitUtf8ToChunks(string, StringUtils.MAX_SAFE_BYTE_COUNT);
        for (String chunk : chunks) {
            insnList.add(new LdcInsnNode(chunk));
            insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;", false));
        }
        insnList.add(new MethodInsnNode(INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;", false));

        return insnList;
    }

Like that?