【发布时间】:2017-08-13 04:46:40
【问题描述】:
我一直在尝试为 java 中的游戏编写客户端代码(老实说:Minecraft)。但这不仅适用于 Minecraft,它通常适用于 java 虚拟机架构,或者我想是这样。基本上,我是使用作弊引擎来查找内存地址,并且我找到了似乎与玩家的健康值相对应的地址。
问题是:无法修改,所以问题是:是我做错了什么,还是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 进程时。例如:如果我要在“记事本”进程中编辑一些文本,它会正确编辑,并且程序会显示更改,以及在作弊引擎中。
更进一步,JVM进程甚至不允许作弊引擎修改内存地址;它会立即重置它。所以问题仍然存在:JVM 中是否有防止其内存被外部修改的机制?
【问题讨论】: