Skip to content

Commit

Permalink
Rewrite Final stripper in ASM
Browse files Browse the repository at this point in the history
  • Loading branch information
kappa-maintainer committed Feb 28, 2025
1 parent bceb3a1 commit 1bc6563
Showing 1 changed file with 22 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@
import javassist.ClassPool;
import javassist.CtClass;
import javassist.Modifier;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.*;
import top.outlands.foundation.IExplicitTransformer;

import java.io.ByteArrayInputStream;
import java.util.Arrays;
import java.util.Map;
import java.lang.reflect.AccessFlag;
import java.util.*;

public class FinalStripperTransformer implements IExplicitTransformer {
private final Map<String, String> targets;
Expand All @@ -17,23 +21,23 @@ public FinalStripperTransformer(Map<String, String> targets) {
}
@Override
public byte[] transform(byte[] bytes) {
try {
CtClass cc = ClassPool.getDefault().makeClass(new ByteArrayInputStream(bytes));
String[] fields = targets.get(cc.getName()).split("\\|");
Arrays.stream(cc.getFields()).filter(ctField ->
Arrays.stream(fields).anyMatch(f ->
ctField.getName().equals(f)
)
).forEach(ctField2 ->
ClassNode classNode = new ClassNode();
ClassReader classReader = new ClassReader(bytes);
classReader.accept(classNode, 0);
Set<String> fields = Set.of(targets.get(classNode.name.replace('/', '.')).split("\\|"));
if (classNode.methods != null)
{
for (FieldNode fieldNode : classNode.fields)
{
ctField2.setModifiers(ctField2.getModifiers() & ~Modifier.FINAL);
Fugue.LOGGER.debug("Stripping final modifier of {} from {}", ctField2.getName(), ctField2.getDeclaringClass().getName());
});
bytes = cc.toBytecode();
cc.defrost();
} catch (Throwable t) {
Fugue.LOGGER.error("Exception {} on {}", t, this.getClass().getSimpleName());
if (fields.contains(fieldNode.name)) {
fieldNode.access &= ~Opcodes.ACC_FINAL;
Fugue.LOGGER.debug("Stripping final modifier of {} from {}", fieldNode.name, classNode.name.replace('/', '.'));
}
}
}
return bytes;
ClassWriter classWriter = new ClassWriter(0);

classNode.accept(classWriter);
return classWriter.toByteArray();
}
}

0 comments on commit 1bc6563

Please sign in to comment.