gpt4 book ai didi

java 代理 - 检测选定的文件(排除所有内置的 java 类和方法)

转载 作者:行者123 更新时间:2023-12-02 13:37:25 25 4
gpt4 key购买 nike

我正在编写我的第一个 Java 代理。我正在尝试检测一个我从 git repo 中挑选的项目(不是我开发的)。

我已经使用 premain 方法编写了我的 Agent 类并实现了一些日志记录(记录使用 ASM 字节码操作框架执行的行数)

但是,我发现即使是内置的 java 函数调用/类也会被检测,这是不正确的。我只想对我的项目中的文件进行检测。为了实现这一点,我添加了一个过滤器,如下所示 -

  public static void premain(String agentArgs, Instrumentation inst) {

System.out.println("Premain called");

inst.addTransformer(new ClassFileTransformer() {
public byte[] transform(ClassLoader classLoader,
String className,
Class<?> classBeingRedefined,
ProtectionDomain protectionDomain,
byte[] bytes)throws IllegalClassFormatException {


// ASM Code
if(className.startsWith("org/mytestpackage/")){
ClassReader reader = new ClassReader(bytes);
ClassWriter writer = new ClassWriter(reader, 0);
ClassTransformVisitor visitor = new ClassTransformVisitor(writer);
reader.accept(visitor, 0);
return writer.toByteArray();
}

return null;

}
});

}

添加此过滤器后,正在调用 premain,但出现一些异常

initializationError(org.mytestpackage.TestAllPackages)  Time elapsed: 0.002 sec  <<< ERROR!
java.lang.VerifyError: (class: org/mytestpackage/TestAllPackages, method: main signature: ([Ljava/lang/String;)V) Stack size too large
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2701)
at java.lang.Class.privateGetMethodRecursive(Class.java:3048)
at java.lang.Class.getMethod0(Class.java:3018)
at java.lang.Class.getMethod(Class.java:1784)

在添加此过滤器(如果条件基于类名)之前,我能够看到内置 java 类和方法的逻辑工作。如果添加过滤器后失败。

感谢任何帮助,TIA。

最佳答案

您的ClassTransformVisitor似乎破坏了转换案例的代码。在您的特定情况下,它似乎不会调整类中方法的堆栈大小org.mytestpackage.TestAllPackages

validator 错误堆栈大小太大表示您向方法的操作数堆栈推送的值多于您为此堆栈指定的槽位的值。您可以要求 ASM 通过指定 new ClassWriter(reader, ClassWriter.COMPUTE_MAXS) 来解决此问题。

关于java 代理 - 检测选定的文件(排除所有内置的 java 类和方法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42915013/

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