gpt4 book ai didi

java - 从正在运行的 Java 程序的内存中定位并读取特定类型的对象

转载 作者:行者123 更新时间:2023-11-30 10:57:30 24 4
gpt4 key购买 nike

我必须评估从正在运行的 Java 程序的内存中提取某些对象(例如 java.security.PrivateKey)会有多困难。

我不太喜欢这种低级内存的东西,所以我开始使用小型 C 程序并熟悉了 gdb , /proc/<pid>/maps , /proc/<pid>/mem和一个 script转储所有内存区域。

但是,当切换到 java 时,情况发生了变化。由于垃圾收集,内存的分配和管理与 Java 截然不同。在 C 程序中,我会查看堆栈地址并确定它包含我想要提取的变量。

所以我的问题是:

  1. Java 对象是否具有某种类型 ID,以便我可以在内存转储中找到该类型的对象?
  2. 如果是这样,我如何找出类型的 ID(例如 String 的 ID 是什么)?
  3. 如果没有这样的类型 ID,攻击者还必须提取哪些其他可能性,比方说,java.security.PrivateKey来自 Java 进程?

假设JMX已关闭。

谢谢你的帮助

最佳答案

这比你想象的还要容易:)

HotSpot Serviceability Agent做魔术。它可以使用 ptrace 打开核心转储或附加到实时 Java 进程然后提取 JVM 结构和所有 Java 对象的布局。不需要目标 JVM 的合作。即使禁用了 JMX 和附加机制,这仍然有效。

这是一个 example如何检查远程 JVM 中给定类的实例。
sa-jdi.jar 必须在类路径中才能与可服务性代理一起工作。

最后是有史以来最简单的解决方案。运行jmap -F -dump:format=b,file=heap.bin PID
注意 -F 参数 - 它强制 jmap 使用 Serviceability Agent 进行堆转储。

P.S. 这里是 the sources如果您想了解 SA 的幕后工作原理。

关于java - 从正在运行的 Java 程序的内存中定位并读取特定类型的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32605962/

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