从C读取和解释JVM内存

时间:2016-08-24 14:31:58

标签: java c jvm reverse-engineering

所以我试图从C代码中读取Java进程的内存。我找到了关于JVM结构的文档(堆,perm gen,方法区域等),但这些文章中没有一篇真正展示了如何找到这些区域在内存中的位置。

根据我的理解,类存储在方法区域中,并且前32位中堆中的所有实例都有一个指向这些类的指针(我说的是x86 JVM)。我已经尝试了JDK中提供的jmap和jhat实用程序,希望我能找到内存位置的“模式”,但没有做到,因为它们只显示实例的内存位置。 ClassLoader没有提供任何指向类和静态字段的指针,但我通过在java程序中应用反射并查看引用的Class对象内存位置,找到了Class个对象的一些内存位置。必须有某种方法来确定这些东西的存储位置,否则Java进程也不会知道如何获取它们。

任何人都可以提供一些有关如何在内存中查找实例,类,静态字段或指向正确方向的信息吗?

我知道通过Java代码可以实现这一点,但我需要使用它。使用JNI或修改Java程序是不可接受的,因为我需要它完全用本机代码编写。

1 个答案:

答案 0 :(得分:0)

HotSpot Serviceability Agent可以做到这一点。它知道如何从外部Java进程的内存或核心转储中重构JVM结构。

可维护性代理{JDK}/lib/sa-jdi.jar位于ID type reference 206 "apple" "" 211 "fruits" "a:1:{i:0;s:3:"206";}" 212 "apple" "" 214 "fruits" "a:1:{i:0;s:3:"212";}" 217 "apple" "" 359 "fruits" "a:1:{i:0;s:3:"206";i:1;s:3:"360";}" 360 "apple" "" 。在C中实现类似功能是可行的,但需要付出很多努力 无论如何,您可以查看SA来源Java API