gpt4 book ai didi

c# - 您能否在运行时从外部修改 Java(更具体地说是 javaw)的内存?

转载 作者:太空宇宙 更新时间:2023-11-03 12:24:40 26 4
gpt4 key购买 nike

我一直在尝试用 Java 为游戏编写客户端代码(老实说:我的世界)。但这不仅适用于 Minecraft,它普遍适用于 Java 虚拟机架构,或者我推测如此。基本上,我正在使用 Cheat Engine 查找内存地址,并且我找到了似乎与玩家的健康值相对应的地址。

问题是:修改不了,所以问题是:是我做错了,还是JVM有限制修改内存的机制?

为您提供一些背景知识:我正在使用 C# 从进程读取/写入内存。我实现此目的的方法是使用 kernel.dll 提供的外部函数(更多信息请参见此处:https://stackoverflow.com/a/4623200/6817922)。我还有一个简化写作任务的功能:

public static bool Write(IntPtr address, byte[] value) 
{
if(ProcessToEdit == null) // If the process is not valid: return with no attempt to edit
{
return false;
}
int bytesWritten = 0;
// Writes the byte[] value to a specified address
return WriteProcessMemory(ProcessPointer, address, value, (uint)value.LongLength, out bytesWritten)
}

但是,当我用这样的代码运行程序时:

Write(0xCDD9BEA0, new byte[] { 20 }); // 0xCDD9BEA0 is the memory address of health.

程序正确执行,函数“Write”返回它已成功写入内存地址,但实际上并没有(因为游戏没有更新;Cheat Engine 界面也没有)。这仅在我尝试修改 JVM 进程时发生。例如:如果我要在“记事本”进程中编辑一些文本,它会正确编辑它,并且程序会显示更改,以及在 Cheat Engine 中。

更进一步,JVM进程甚至不允许Cheat Engine修改内存地址;它会立即重置它。那么问题还是来了:JVM中是否有机制可以防止其内存被外部修改?

最佳答案

是的,如果用户有足够的权限(即管理员),您可以修改 Java 进程的内存。这基本上是操作系统的能力; JVM 不会(也不能)做任何事情来防止这种情况发生。

此外,JVM 甚至可以协助进行此类修改。有 public API将代理附加到正在运行的 JVM 进程;然后代理可以使用标准 JNIJVM TI访问加载类、修改对象字段、调用任意 Java 方法等的接口(interface)。

我不能说为什么 Cheat Engine 在您的情况下不起作用 - 这可能是引擎的问题 - 但有很多可能的原因会导致这种情况发生。

例如,您尝试修改的值缓存在寄存器中,而不是从内存中读取。每当值发生变化(在寄存器中)时,它可能会被写回内存,这就是您看到值 'reset' 的原因。

另请注意,Java 对象在内存中不一定具有固定地址。垃圾收集器可能会跨堆移动对象,这使得 Cheat Engine 的工作更加困难。

在运行时“修补”Java 应用程序的正确方法是使用 JNI/JVM TI/Instrumentation API 等标准 API,它们可以处理非 Java 实用程序无法处理的所有情况。

关于c# - 您能否在运行时从外部修改 Java(更具体地说是 javaw)的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45657170/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com