我想访问Java变量当前使用的内存位置。我计划使用C或其他语言访问这些位置,我计划更改位置值。
访问Java程序的程序无法控制程序;它将通过搜索内存来完成这项任务。
我需要有关如何编写第二个程序的建议。
答案 0 :(得分:3)
帕西法尔说得对。 。 。
那说JNI就是你的答案。使用JNI,您可以在java中调用C可执行文件来处理您想要共享内存的所有逻辑。那时,只需要在用C编写的线程之间进行典型的IPC。
这可能很快而且很脏(并且很难调试),但是您可以将数据作为参数传递而不会有太多麻烦,但是准备做一些多线程。
或者,您可以使用与ActiveMQ类似的JMS兼容消息传递引擎。您可以将数据序列化为可用的某种消息,然后Java可以将其广播给任何正在收听的人。 (它可能是1000个客户端,它可能是0 - Java不必知道它)这将需要一些额外的设置。我相信AMQ至少会设置一个本地的Jetty服务器来做这件事。
最后(如下面的评论中所述),如果您的数据足够简单,您可以随时创建一个交换文件(即一个普通的旧文件来保存数据。)只需在数据可用时写出来,并且这样,任何其他具有权限的进程都可以访问它,前提是它当前没有被写入。
答案 1 :(得分:1)
您基本上想写一个debugger。
Java有一个内置的调试工具,名为JPDA。但是,通常需要使用允许调试器附加的选项启动调试过程。如果你能做到这一点,那很好。
JMap程序可以附加到正在运行的进程。我没有深入研究过,但似乎有一种方法可以通过Sun Tools JAR中的类将调试代理加载到该进程中。当然,这只适用于Sun / Oracle JVM(或OpenJDK)。
第三个选项是完全退出JVM,并使用gdb之类的工具。要采用这条路线,您需要了解JVM implementation。我不确定分布式可执行文件中剩下多少调试信息,但是一旦你对构建足够熟悉,你就可以识别一个入口点。
当然,操作系统会强制执行访问规则,因此如果要被黑客入侵的进程是另一个用户运行而你不是超级用户,那么你就不幸了。
答案 2 :(得分:0)
编辑:
我错过了Java方面的事情必须不知道内存访问。对于这种情况,请参阅https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe了解如何获取JVM内存的原始地址。