嗨,我有两个问题 情况是我正在编写 Java API for Windows ,它还提供了将代码注入进程然后操作目标的工具。我已经实现了注入部分,例如将jar注入另一个jar。此时我的jar被调用(目标已经在运行时),并以完整的静态上下文开始。
从这里我有两个目标:
所以我总结问题如下:
到目前为止我所做的,评论和想法:
请注意,更改目标代码肯定不适合我。并且它已经在运行时,因此ByteCode-Manipulation也可以是一个选项。
这种情况会派上用场:
目标是游戏,部署为jar。它使用 BufferStrategy 类使用 Double-Buffer-Strategy 进行渲染。它使用 BufferStrategy#show()显示图像。我们在游戏中注入了jar,并喜欢绘制带有附加信息的叠加层。为此,我们获得对使用过的 BufferStrategy 的引用,并连接到其 show -method。因此,只要每次调用它都会调用drawOverlay-method ,然后我们会传回原来的 show-method 。
答案 0 :(得分:4)
您需要的是JVMTI代理 - 一个使用JVM Tool Interface的本地库。
可以使用Attach API将代理动态附加到正在运行的VM 请参阅VirtualMachine.loadAgentPath。
要获取给定类的所有实例,请使用JVMTI IterateOverInstancesOfClass函数 有关详细信息,请参阅related question。
要拦截外国班级的方法,您需要JVMTI RetransformClasses API。使用Java级检测API也可以实现同样的效果,请参阅Instrumentation.retransformClasses。
对于JVMTI级方法拦截的示例,请参阅Oracle JDK演示中的demo/jvmti/mtrace
和示例包。
使用像Byte Buddy这样的字节码操作库,Java级别的检测会更容易。