嗨,我有2个问题。
情况是我正在编写Windows的Java API,该API还提供了将代码注入到进程中然后操作目标的工具。我已经实现了injection-part,例如将一个jar注入另一个jar。此时,我的jar被调用(目标已经在运行时)并在完整的静态上下文中启动。
从这里我有两个目标:
因此,我将问题总结如下:
到目前为止,我所做的评论和想法:
请注意,更改目标代码对我而言当然不是选择。而且它已经在运行时,因此ByteCode-Manipulation也可以作为一种选择。
这可能派上用场:
目标是一个游戏,部署为jar。它使用BufferStrategy类使用Double-Buffer-Strategy进行渲染。它使用BufferStrategy#show()显示图像。我们将游戏中的jar注入游戏中,并希望在其上覆盖其他信息。为此,我们获得了对所使用的BufferStrategy的引用,并将其连接到show- method上。因此,每次调用它时都会调用drawOverlay-method,然后我们返回原始的show-method。
您需要的是JVMTI代理-一个使用JVM Tool Interface的本机库。
可以使用Attach API将代理动态附加到正在运行的VM 。
请参阅VirtualMachine.loadAgentPath。
要获取给定类的所有实例,请使用JVMTI IterateOverInstancesOfClass函数。
有关详细信息,请参见相关问题。
要拦截外部类的方法,您将需要JVMTI RetransformClasses API。通过使用Java级别的工具API也可以实现相同的目的,请参见Instrumentation.retransformClasses。
有关JVMTI级方法拦截的示例,请参阅demo/jvmti/mtrace
Oracle JDK演示和示例软件包。
使用字节码操作库(例如Byte Buddy)将更容易进行Java级别的检测。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句