This commit is contained in:
novice.li
2024-02-25 13:38:59 +08:00
parent 439a127799
commit 92b5ae69d1
6 changed files with 229 additions and 45 deletions

View File

@@ -1,10 +1,11 @@
package com.novitechie;
import com.janetfilter.core.plugin.MyTransformer;
import jdk.internal.org.objectweb.asm.*;
import jdk.internal.org.objectweb.asm.commons.AdviceAdapter;
import jdk.internal.org.objectweb.asm.ClassReader;
import jdk.internal.org.objectweb.asm.ClassWriter;
import jdk.internal.org.objectweb.asm.tree.*;
import static jdk.internal.org.objectweb.asm.Opcodes.ASM5;
import static jdk.internal.org.objectweb.asm.Opcodes.*;
public class PluginClassLoaderTransformer implements MyTransformer {
@Override
@@ -14,24 +15,19 @@ public class PluginClassLoaderTransformer implements MyTransformer {
@Override
public byte[] transform(String className, byte[] classBytes, int order) throws Exception {
ClassReader cr = new ClassReader(classBytes);
ClassWriter cw = new ClassWriter(cr, ClassWriter.COMPUTE_FRAMES);
cr.accept(new ClassVisitor(ASM5, cw) {
@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
if (name.equals("loadClass")) {
MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
return new AdviceAdapter(api, mv, access, name, desc) {
@Override
protected void onMethodEnter() {
mv.visitVarInsn(ALOAD, 1);
mv.visitMethodInsn(INVOKESTATIC, "com/novitechie/LoadClassRule", "check", "(Ljava/lang/String;)V", false);
}
};
}
return super.visitMethod(access, name, desc, signature, exceptions);
ClassReader reader = new ClassReader(classBytes);
ClassNode node = new ClassNode(ASM5);
reader.accept(node, 0);
for (MethodNode m : node.methods) {
if ("loadClass".equals(m.name)) {
InsnList list = new InsnList();
list.add(new VarInsnNode(ALOAD, 1));
list.add(new MethodInsnNode(INVOKESTATIC, "com/novitechie/LoadClassRule", "check", "(Ljava/lang/String;)V", false));
m.instructions.insert(list);
}
}, 6);
return cw.toByteArray();
}
ClassWriter writer = new SafeClassWriter(null,null,ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
node.accept(writer);
return writer.toByteArray();
}
}
}