【问题标题】:Read Java Variables读取 Java 变量
【发布时间】:2009-05-10 12:05:52
【问题描述】:

我正在尝试从我的 C# 程序的进程中读取 Java 小程序中的变量。除了读取内存地址之外,还有什么方法可以从 Java 小程序中获取变量值?这个 java 小程序将在浏览器中运行。如果不能从 C# 执行此操作,是否可以从不同的 Java 小程序执行此操作?

谢谢。

【问题讨论】:

    标签: java memory applet


    【解决方案1】:

    是的,可以做到。

    C#表单可以有可以承载webbrowser组件,可以触发JScript,可以调用Java applet公共方法。

    之前,我制作了一个简单的网页,其中包含一个绘制“热”色地图的小程序。输入使用 JScript 注入,并且可以使用 AJAX 或任何其他可以在 HTML DOM 上触发 JScript 的应用程序来检索。

    HTML 的来源是:

    <HTML><HEAD></HEAD><BODY> 
    <SCRIPT> 
    function call() {
        var inputData = "-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,0,1647,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,89,0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,0,0,615,366,0,1198,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,0,2179,1262,764,200,0,0,609,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,0,0,3401,1940,0,210,0,-1,-1,162,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,0,-1,966,0,86,0,0,0,0,-1,-1,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,-1,250,53,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-1,1977,1413,128,0,0,0,0,0,0,-1,1413,2447,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,0,-1,0,0,0,0,0,0,0,-1,317,0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,0,0,0,0,0,0,0,0,0,0,3246,2190,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,51,0,-1,0,0,0,-1,0,-1,0,-1,-1,1523,-2,-2,-2,-1,0,0,-2,-2,0,0,-2,-2,-2,-2,-2"
            + ";-2,0,0,0,0,0,0,0,0,0,0,1692,2028,2850,-2,0,-1,0,0,0,0,0,0,0,-1,-2,-2,-2,-2"
            + ";-2,0,0,0,0,0,-1,0,0,0,-1,1292,-2,-2,-2,0,0,-1,-1,0,0,0,0,0,-1,0,-2,-2,-2"
            + ";-2,0,-1,0,0,-1,0,0,-1,0,1028,1247,7675,9244,7940,0,-1,0,0,-1,0,0,0,0,0,0,0,-2,-2"
            + ";-2,-1,0,0,0,0,0,0,0,0,844,1114,2860,6631,4249,0,0,-1,-1,0,0,0,0,0,0,0,0,-2,-2"
            + ";-2,-2,0,0,0,-1,0,-1,0,0,0,-1,1958,2379,-1,0,0,0,0,0,0,0,0,-1,0,0,0,-2,-2"
            + ";-2,-2,-2,0,470,0,-2,-2,-2,0,0,0,-1,0,0,0,0,0,-1,0,-1,0,0,3574,2706,2195,-1,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,-1,-1,0,0,0,0,0,0,0,0,165,-1,-1,1282,867,0,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,-1,0,0,0,0,34,504,3098,2708,2324,-1,0,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,-1,0,0,0,0,0,0,0,0,0,721,-1,3854,2783,-1,0,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,-1,0,0,0,-1,0,34,191,2455,4126,0,0,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,3982,2656,0,0,-1,0,0,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,-1,0,0,2194,0,0,0,0,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,-1,0,0,-2,-2,-2,-2,-2,-2,-2"
            + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2";
        document.Necrodrip.update(inputData);
    }
    </SCRIPT> 
    <FORM> 
    <APPLET CODE="kuningriik.pdApplet.class"  
            NAME="Necrodrip" 
            width="1200" height="600"> 
    </APPLET><br/> 
    <INPUT type="button" value="Loo kaart" 
       onClick = "call()"> 
    </FORM> 
    </BODY></HTML> 
    

    您可以在这里查看页面:link

    【讨论】:

      【解决方案2】:

      如果您可以更改小程序的代码,您可以让它托管一个 RMI 服务器,这是this excercise 的主题。虽然我不是该主题的专家 - 我认为它可能会受到各种安全限制。

      如果您不能更改小程序,但您可以更改显示小程序的 HTML 页面,则有两种方法可以从小程序访问信息。 p>

      第一种方法是像@Margus 建议的那样使用 Javascript 编写小程序脚本(小程序对象的所有公共方法都通过小程序的 DOM 对象公开)。

      另一种方式是在页面中放一个自己的applet,并使用getAppletContext()获取另一个applet的引用。这样做的主要好处是您可以通过反射从第三方小程序访问非公开信息,并将其发布到 RMI 服务器(如上)。

      【讨论】:

        【解决方案3】:

        这根本不可能。

        根据定义,进程不共享内存或任何其他资源。这是在操作系统级别强制执行的,您对此无能为力。

        如果这是可能的,你只能想象这可能是什么安全/稳定性问题。

        如果您确实需要进程间通信,请查看使用您的语言进行的套接字编程。请注意,这将需要同时更改客户端(您的 Java 小程序)和服务器(C# 进程)。

        【讨论】:

        • 您几乎可以用任何语言读取另一个进程的内存。
        • @Tom - 是这样吗?给我一个你选择的任何主流语言的例子......
        • 在windows上你可以使用ReadProcessMemory (msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx),当然这需要你有访问权限。
        • 继续思考练习:从 JRE 进程读取内存会产生什么影响?我想人们可以对对象指针表进行逆向工程并尝试找到一个值的实际位置......对我来说听起来像是很多工作:-) applet 环境通过 javascript 提供了一个很好的 IPC 机制——可能最好只是使用它...
        【解决方案4】:

        如果您安装了 JDK 并且正在运行更高版本的 JVM,则可以从正在运行的 Java 进程(包括在浏览器中)访问信息。看看这些JDK tools

        【讨论】:

          【解决方案5】:

          这是调试器一直在做的事情,所以很明显这是可能的。在最近的 Sun Java 版本中,您可以在进程启动后相对轻松地附加 JVM 工具接口 (JVMTI)。但是,这并不一定很容易。

          如果您控制小程序源(或者即使您不控制),通过网络连接共享数据可能更容易。

          【讨论】:

            【解决方案6】:

            没有。 Java Applet 或任何其他语言、进程都无法实现您正在尝试做的事情。

            【讨论】:

              猜你喜欢
              • 2016-01-22
              • 1970-01-01
              • 2012-09-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2023-04-07
              • 2012-05-21
              • 2019-07-20
              相关资源
              最近更新 更多