5

对于 java 中的字节码检测,有 asm 框架以及 bcel 和 javaassist 库。

但是我需要在本机代码中进行检测,因为在 javaagent 运行时已经加载了一些 java 类,例如 java.lang.Thread、java.lang.Class 等

是否有任何用于在本机代码中检测 java 类的库?

编辑:似乎有一点混乱。

我想要的是:创建一个本地 java 代理,它使用 JVMTI apis 在加载类时使用 OnClassLoad 事件挂钩来更改类的字节码。

4

3 回答 3

8

我在博士研究期间遇到了这个问题。最适合我的答案是使用 java 库(我使用 ASM)在单独的 JVM 中执行字节码修改。

我使用 JVMTI 类加载挂钩来捕获类文件并使用 tcp 连接将其传输到单独的 JVM。一旦在单独的 JVM 中修改了类,我将其返回给 JVMTI 代理,后者将其复制到 VM 内存中并将指向修改后的类文件的指针返回给 JVM。

我发现在同一个 JVM 中编织类太难了,因为我想要修改的系统类文件(例如 java.lang.Object)必须在我需要执行编织的任何类文件之前加载. 在确定最终使用的单独 JVM 方法之前,我寻找 c/c++ 字节码库但没有取得多大成功。

您可以使用 weaver JVM 的主机名/端口参数化 JVMTI 代理,或者您可以使用某种形式的发现,具体取决于您的要求。

于 2012-02-14T15:44:54.340 回答
3

JIT 会将字节码转换为本机代码。如果你想生成原生代码,你需要让 JIT 来做,或者编写通过 JNI 调用的原生代码。

也许您想要实现的目标可以通过另一种方式更简单地完成。

创建一个本机 Java 代理,它使用 JVMTI api 在加载类时使用 OnClassLoad 事件挂钩更改其字节码。

虽然你不需要做你想做的事。为什么要使解决方案比需要的更复杂(并且不太可能起作用)?

于 2012-01-22T13:57:46.673 回答
-2

一旦加载了类,就不能更改其字节码。您可以确保仪器在加载之前运行,或者您可以创建一个新的 ClassLoader,并通过不询问父类来重新加载其中的类。但是,您不能将这些类与在 ClassLoader 之外加载的代码一起使用,因为该代码将引用较早加载的、未更改的类。

于 2012-01-22T12:21:59.620 回答