问题标签 [java-bytecode-asm]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
2723 浏览

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

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

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

  • 取回字节码并加载它们

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

......

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

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

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

0 投票
1 回答
816 浏览

java - 字节码检测生成 java 验证程序错误

我正在使用 ASM 来为 Java 程序进行字节码检测。我所做的很简单 - 在检测方法时,如果指令是 PUTFIELD,只需在指令之前执行 DUP_X1,然后访问 PUTFIELD 并使用包含 DUP 的堆栈条目的参数注入函数调用。

代码在检测之前和之后分别如下所示:

但是当我运行检测代码时,我得到:

java.lang.VerifyError:期望在堆栈上找到对象/数组

你能提供任何帮助吗?

0 投票
2 回答
3064 浏览

java - 使用 ASM Java 库拆箱

我正在使用 ASM Java 库来替换一些反射。我生成这个方法的主体:

使用这个生成的方法,我可以在运行时在对象上设置字段,而无需使用反射。它工作得很好。但是,我发现原始字段失败了。这是我的 set 方法的相关部分:

此代码正在为选择生成案例标签。它适用于对象,但对于原语我得到这个错误:

期望在堆栈上找到浮点数

好的,这是有道理的,我需要自己拆箱。我实现了以下内容:

我已经追踪过了,它肯定会进入适当字段的“case Type.FLOAT”,但是,我收到了这个错误:

期望在堆栈上找到对象/数组

这就是我卡住的地方。对于我的生活,我无法弄清楚为什么拆箱不起作用。“ALOAD, 3”是将set方法的第三个参数放入堆栈,应该是一个Float。有任何想法吗?

我发现 asm-commons 库有一个具有 unbox 方法的 GeneratorAdapter 类。但是,我真的不想再为应该如此简单的东西包含另一个 JAR。我查看了 GeneratorAdapter 源代码,它正在做一些非常相似的事情。我试图修改我的代码以使用 GeneratorAdapter,只是想看看它是否有效,但根本没有发现它很容易转换。

0 投票
4 回答
19142 浏览

java - ASM jar - 为什么我的 java 项目依赖于此?

我有一个 Java 项目,在内部它依赖于asm jar. 奇怪的是,我什至不知道为什么我的项目以某种方式依赖于这个库(可能是由 maven 作为传递依赖引入的)?

谁能帮我知道为什么有人需要 asm jar

提前致谢 !

编辑: 您能否还提到一个可能需要 asm jar 的目的/用例?

0 投票
1 回答
1267 浏览

java - Java、ASM org.objectweb.asm.util.CheckClassAdapter 导致 Unsupported major.minor 版本 0.0

我收到以下异常:

尝试使用以下源代码检测某些字节码时。(准确地说,当我尝试执行修改后的字节码时出现此异常)

我认为这可能是我的 InstrumentClassAdapterInstrumenter 实现,所以我把它省略了,我现在只使用 CheckClassAdapter。谁能看到我做错了什么?

干杯,

0 投票
2 回答
1164 浏览

java - 如何使用 ASM 访问者检查堆栈?

我正在尝试使用 Java 字节码工程库ASM来执行静态分析。我有一种情况,我想检查分配给字段的变量。

我有MethodVisitor哪个实现该visitFieldInsn()方法。我正在专门寻找putfield命令。那没问题。问题是,当我遇到 时putfield,我希望能够访问将分配给该字段的变量。具体来说,我想访问有关变量类型的信息。

目前我真的只需要查看堆栈顶部的内容,但如果有更通用的方法来检查它,那就更好了。

有没有办法使用 ASM 来检查堆栈上的变量?

0 投票
6 回答
9754 浏览

java - 是否可以让 System ClassLoader 在运行时加载指定的 .class 文件?

我正在为作业编写一个静态分析工具,它使用 ASM 库分析​​ Java 字节码。我们使用的 ASM 的其中一个部分要求(或至少似乎要求)从 ClassLoader 加载类。

我们希望该工具能够分析 .class 文件,而无需将它们放在类路径中。我们已经在运行时从指定目录加载 .classes 并使用 InputStream 读取它们。在大多数情况下,这对于 ASM 来说是可以接受的。有一些类,例如SimpleVerifier,尝试加载这些类。

在这种情况下,是否可以注册要加载的 .class 文件,以便调用Class.forName()将加载它们?或者有没有一种简单的方法来扩展 ClassLoader 以允许这样做?


编辑:关于的信息URLClassLoader很有用。不幸的是,Thread.currentThread().setContextClassLoader()在这种情况下使用该实例不起作用。我调用的库代码使用它在实例初始化时使用getClass().getClassLoader().

当我设置 URLClassLoader 时,该类尚未初始化,所以我猜 contextClassLoader 没有加载该类。

我是否正确理解了这些回答?是否有可能使用 URLClassLoader 加载第 3 方类?

0 投票
1 回答
1580 浏览

java - 即使设置了 ClassWriter(COMPUTE_MAX + COMPUTE_STACK),ASM(来自 ObjectWeb)也无法正确计算 MaxStack

尝试加载使用 ASM 生成的类时,我收到了预期的 ClassVerifyErrors。在进一步检查中,我可以看到 jvm 是正确的,并且正在讨论的方法具有无效的 MAX_STACK 值。奇怪的是我正在使用自动计算堆栈和最大本地选项,所以这应该不是问题......带有无效选项的方法非常简单,但结果是错误的字节码。

我已经用预期的方法编写了一个类,并将我的 asm 生成的类与 javac 生成的类进行了比较,字节码匹配唯一的错误是最大堆栈为 0,这是错误的,而 javac 设置的值为 2。

我想避免自己计算 tha max stack/locals。

0 投票
9 回答
105676 浏览

java - 错误:java.lang.NoSuchMethodError:org.objectweb.asm.ClassWriter。(一)五

我正在开发一个小型 Spring 应用程序。我必须将学生信息的详细信息存储在数据库中。我开发了一个 SimpleFormController。我使用过 NetBeans + Hibernate 映射 + Spring。当我部署项目时,出现以下错误。

我的 spring-config-db-applicationContext.xml 如下所示:

出现以下错误:

0 投票
1 回答
1087 浏览

java - 更改 Java JAR 的根包

我正在编写一个 Java 代理,它使用 Java ASM 库来处理字节码。这是一个通用库,我想确定我的代码在运行时使用的 ASM 版本。

获取 ASM 类并将它们处理为私有副本的最简单和最自动化的方法是什么,其中所有类都已重新定位到新的根包中。

具体来说,我想把 ASM 罐子org.objectweb.asm.*变成org.myproject.internal.org.objectweb.asm.*

请记住,我最感兴趣的是自动化解决方案。我知道我可以获取 ASM 的源代码并手动或使用脚本执行此操作,然后重新编译 jar,但这感觉像是很多开销。