Java字节码 - ASM-获取标签偏移



我试图在方法中获取所有标签的偏移。

我尝试使用以下代码:

private static ArrayList<Integer> GetLabelOffsets(MethodNode methodNode) {
    ArrayList<Integer> labelOffsets = new ArrayList<>();
    for (AbstractInsnNode instruction : methodNode.instructions.toArray()) {
        if (instruction instanceof JumpInsnNode) {
            JumpInsnNode jumpInsnNode = (JumpInsnNode) instruction;
            labelOffsets.add(jumpInsnNode.label.getLabel().getOffset());.
        }
    }
    return labelOffsets;
}

但是getOffset()方法抛出Exception

java.lang.IllegalStateException: Label offset position has not been resolved yet

如何解决这些偏移位置?或实现这一目标的正确方法是什么?

编辑

MethodNode是Java ASM库中的org.objectweb.asm.tree.MethodNode对象

按请求添加更多代码:

public static HashMap<String, ClassNode> ParseJar(JarFile jar) {
    HashMap<String, ClassNode> classes = new HashMap<>();
    try {
        Enumeration<?> enumeration = jar.entries();
        while (enumeration.hasMoreElements()) {
            JarEntry entry = (JarEntry) enumeration.nextElement();
            if (entry.getName().endsWith(".class")) {
                ClassReader classReader = new ClassReader(jar.getInputStream(entry));
                ClassNode classNode = new ClassNode();
                classReader.accept(classNode, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
                classes.put(classNode.name, classNode);
            }
        }
        jar.close();
        return classes;
    } catch (Exception ex) {
        return null;
    }
}
public static void main(String[] args) {
    JarFile jar = new JarFile(fileName);
    HashMap<String, ClassNode> classes = JarUtils.ParseJar(jar);
    for (ClassNode classNode : classes.values()) {
        for (MethodNode methodNode : classNode.methods) {
            ArrayList<Integer> offsets = GetLabelOffsets(methodNode);
            // do more stuff with offsets
        }
    }
}

来自 getOffset()的文档:

此方法用于属性子类,通常不需要类生成器或适配器。

由于此偏移是根据 bytes 定义的,因此在处理指令列表 的列表时,这不是很有帮助的,尤其是因为ASM摘要不同形式的指令形式在字节代码中可能具有不同的长度。

一般的想法是可以更改此指令列表,因此Label s表示逻辑位置,并且在编写方法的结果字节码和实际数字时将计算偏移。

在指令列表中,应该有一个相应的LabelNode引用与指令相同的Label

最新更新