-1

我想访问 Java 变量当前使用的内存位置。我计划使用 C 或其他语言访问这些位置,并计划更改位置值。

将访问 Java 程序的程序无法控制该程序;它将通过搜索内存来完成此任务。

我需要关于如何编写第二个程序的建议。

在此处输入图像描述

4

3 回答 3

3

帕西法尔说得对。. .

那就是说JNI是你的答案。使用 JNI,您可以在 java 中调用 C 可执行文件来处理您想要共享内存的所有逻辑。那时,只需在用 C 编写的线程之间进行典型的 IPC 即可。

这可能又快又脏(调试起来很痛苦),但是您可以将数据作为参数传递而没有太多麻烦,但要准备做一些多线程。

或者,您可以使用符合 JMS 的消息传递引擎,例如 ActiveMQ。您可以将数据序列化为可用的某种消息,然后 Java 可以将其广播给正在收听的任何人。(可能是 1000 个客户端,也可能是 0——Java 不必知道它)但是这需要一些额外的设置。我相信至少 AMQ 会在本地设置一个 Jetty 服务器来做这件事。

最后(如下面评论中所建议的那样),如果您的数据足够简单,您可以随时制作一个交换文件(即一个普通的旧文件来保存您的数据。)只需在数据可用时将其写出,这样任何如果当前没有被写入,其他具有权限的进程可以访问它。

于 2013-02-19T18:01:33.357 回答
1

您本质上是想编写一个调试器

Java 有一个内置的调试工具,称为JPDA。但是,通常需要使用允许调试器附加的选项来启动被调试的进程。如果你能做到这一点,那就太好了。

JMap程序可以附加到正在运行的进程我没有深入研究它,但似乎有一种方法可以通过 Sun Tools JAR 中的类将调试代理加载到该进程中。当然,这只适用于 Sun/Oracle JVM(或 OpenJDK)。

第三种选择是完全跳出 JVM,并使用像gdb这样的工具。要走这条路,您需要了解JVM 实现。我不确定分布式可执行文件中还剩下多少调试信息,但是一旦您对构建足够熟悉,您就可以确定一个入口点。

当然,操作系统会强制执行访问规则,因此如果要被黑客入侵的进程以另一个用户身份运行,而您不是超级用户,那么您就不走运了。

于 2013-02-19T18:54:58.370 回答
0

编辑:

我错过了Java方面的事情必须不知道内存访问。对于这种情况,请参阅https://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafe了解如何获取 JVM 内存的原始地址。

于 2013-02-19T18:02:46.740 回答