本机java字节码检测

pde*_*eva 4 java instrumentation bytecode native bytecode-manipulation

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

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

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

编辑:似乎有点混乱.

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

Ste*_*son 7

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

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

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

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

  • 其他几个答案是轻度不正确或错误的.您可以更改已加载的类的字节码 - 甚至是系统类.加载类后,您可能不会影响其外部签名(添加字段/方法),但您可以更改方法体.与JVM一起分发的基本heapTracker JVMTI演示了如何更改java.lang.Object.<init>()的行为. (3认同)

Mar*_*bst -2

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