【发布时间】:2016-10-28 19:38:34
【问题描述】:
情况
您好,我有 2 个问题。
情况是我正在编写一个 Java API for Windows,它还提供了将代码注入进程然后操作目标的工具。我已经实现了 injection-part,例如将一个 jar 注入另一个 jar。此时我的 jar 被调用(而目标已经在运行时)并在 完整的静态上下文中开始。
目标和问题
从这里我有两个目标:
- 我想与目标对象交互,因此我需要引用。对于许多对象来说,这已经成为可能,因为它们提供对其实例的静态访问。例如 awt.Frames#getFrames() 提供对所有创建的 Frame 对象的访问。但是如果有可能访问堆上的任意对象,那就太棒了。类似'Heap#getAllObjectInstances()'。
- 给定一个对象实例,我想连接到该对象的任意函数。例如,每当 BufferStrategy#show() 被调用时,我希望它首先调用另一个方法。
所以我总结问题如下:
- 如何从静态上下文中获取任意对象引用?
- 如何连接任意函数?
备注
到目前为止我所做的,评论和想法:
- JDI(Java 调试器接口)通过 VirtualMachine#allClasses() -> ReferenceType#instances(0) 提供了这样的方法。但是 JDI 需要 target JVM 以附加的 debug 参数 启动,这 我没有选择。可以深入到低级并使用内存工具分析堆,但我希望有人知道更高级的方法。由于我熟悉 JNA/JNI,因此我可以选择使用 Windows API,但我不知道这样的工具。
- 最后的手段是在 C 代码中使用 IAT 挂钩,这是一种非常底层的方法,我想避免这种情况。我可以假设此时有一个对象引用,也许 Reflection API 提供了一种更改对象方法的方法?或者至少简单地提供一个挂钩机制?
请注意,更改目标代码对我来说当然不是选择。并且它已经在运行时,因此 ByteCode-Manipulation 也可以是一个选项。
场景
这会派上用场的场景:
目标是一个游戏,部署为 jar。它使用 BufferStrategy 类以 Double-Buffer-Strategy 呈现。它使用 BufferStrategy#show() 显示图像。我们将我们的 jar 注入到游戏中,并喜欢绘制带有附加信息的叠加层。为此,我们获得了对使用的 BufferStrategy 的引用并连接到它的 show 方法。这样它每次调用我们的drawOverlay方法,然后我们传递回原来的show-method。
【问题讨论】:
标签: java jvm reverse-engineering heap-memory jdi