gpt4 book ai didi

java - 用于方法入口/导出的 ASM 字节码检测

转载 作者:行者123 更新时间:2023-11-30 05:16:02 25 4
gpt4 key购买 nike

我创建了一个 JVMTI 代理,它在较高级别上执行以下操作:

  • onClassLoadHook 将已加载类的字节码发送到单独的 Java 进程,该进程将使用 ASM 检测该类

  • 取回字节码并加载它们

在我的单独的 java 进程中检测加载的 Java 类,我执行以下操作:

....

    cr = new ClassReader(inBytes, offset, inLen);
cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES);

ClassAdapter ca = new ClassAdapter(cw) {
..
..

@Override
public MethodVisitor visitMethod(final int access,
final String name,
final String desc,
String signature,
String[] exceptions) {

return new MethodAdapter(mv) {

@Override
public void visitCode() {

mv.visitVarInsn(Opcodes.ALOAD, 0);
mv.visitMethodInsn(Opcodes.INVOKESTATIC, "com/amir/Tester", "callTestStatic3", "(Ljava/lang/Object;)V");
mv.visitCode();

}

}
}

当我尝试使用 Java Decompiler 反编译在此检测之后编写的类时 - 我看到以下反编译函数,我知道它是错误的:

  public void func1(int arg1, int arg2)
{
int b;
Tester.callTestStatic3(???);
System.out.println("arg = " + a + " b = " + b);

}

因为我的函数实际上是这样的:

public void func1(int a, int b) 
{

System.out.println("arg = " +a + " b = " +b);

}

谁能告诉我我是否做错了什么?我唯一的线索是,如果我不将 THIS 指针作为参数传递给函数,而是传递原始类型,那么一切都会顺利进行。我需要管理的 THIS 指针有什么特别之处吗?我比较了字节码,并使用 ASMIFIER 来了解需要使用哪些语句来生成正确的字节码。

最佳答案

看起来您的代码是正确的,mv.visitCode()。 javap 显示预期的字节码。我猜你原来的反编译器没有做正确的事情。

关于java - 用于方法入口/导出的 ASM 字节码检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1263378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com