【问题标题】:Java: Method hooking & Finding object instancesJava:方法挂钩和查找对象实例
【发布时间】:2016-10-28 19:38:34
【问题描述】:

情况

您好,我有 2 个问题。
情况是我正在编写一个 Java API for Windows,它还提供了将代码注入进程然后操作目标的工具。我已经实现了 injection-part,例如将一个 jar 注入另一个 jar。此时我的 jar 被调用(而目标已经在运行时)并在 完整的静态上下文中开始。

目标和问题

从这里我有两个目标:

  1. 我想与目标对象交互,因此我需要引用。对于许多对象来说,这已经成为可能,因为它们提供对其实例的静态访问。例如 awt.Frames#getFrames() 提供对所有创建的 Frame 对象的访问。但是如果有可能访问堆上的任意对象,那就太棒了。类似'Heap#getAllObjectInstances()'。
  2. 给定一个对象实例,我想连接到该对象的任意函数。例如,每当 BufferStrategy#show() 被调用时,我希望它首先调用另一个方法。

所以我总结问题如下:

  1. 如何从静态上下文中获取任意对象引用?
  2. 如何连接任意函数?

备注

到目前为止我所做的,评论和想法:

  1. JDI(Java 调试器接口)通过 VirtualMachine#allClasses() -> ReferenceType#instances(0) 提供了这样的方法。但是 JDI 需要 target JVM 以附加的 debug 参数 启动,这 我没有选择。可以深入到低级并使用内存工具分析堆,但我希望有人知道更高级的方法。由于我熟悉 JNA/JNI,因此我可以选择使用 Windows API,但我不知道这样的工具。
  2. 最后的手段是在 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


    【解决方案1】:

    您需要的是 JVMTI 代理 - 一个使用 JVM Tool Interface 的本机库。

    可以使用Attach API 将代理动态附加到正在运行的虚拟机。
    VirtualMachine.loadAgentPath

    1. 要获取给定类的所有实例,请使用 JVMTI IterateOverInstancesOfClass 函数。
      详情请参阅related question

    2. 要拦截外部类的方法,您需要 JVMTI RetransformClasses API。使用 Java 级别的检测 API 也可以实现相同的目的,请参阅 Instrumentation.retransformClasses

    JVMTI级别的方法拦截示例参考Oracle JDK demos and samples包中的demo/jvmti/mtrace

    使用Byte Buddy 等字节码操作库将更容易实现Java 级检测。

    【讨论】:

    • JVM TI,不知道那个,谢谢。第一个问题可能很容易用这个 API 解决。与第二个问题一样,它可能适用于未来的实例,但我不确定这种方法是否会影响已创建的实例。您知道一种也会影响他们的方法吗?
    • @Zabuza RetransformClasses 可以检测已加载的类,包括系统类。如果你修改了一个方法,现有的实例会在下次调用修改后的版本。
    • 太棒了,感谢您的帮助。一旦我找到实施它的时间,我会回电。
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2011-08-17
    • 1970-01-01
    • 2012-07-16
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多